From ef32118b6735da5dab602c12dc12ba63e1051988 Mon Sep 17 00:00:00 2001 From: krahets Date: Mon, 29 Apr 2024 15:19:09 +0800 Subject: [PATCH] deploy --- .../preorder_find_paths_step11.png | Bin 27783 -> 27628 bytes .../graph_bfs_step1.png | Bin 19449 -> 19576 bytes .../graph_bfs_step10.png | Bin 37007 -> 37025 bytes .../graph_bfs_step11.png | Bin 28059 -> 28198 bytes .../graph_bfs_step2.png | Bin 30528 -> 30632 bytes .../graph_bfs_step3.png | Bin 32946 -> 32986 bytes .../graph_bfs_step4.png | Bin 33667 -> 33877 bytes .../graph_bfs_step5.png | Bin 36094 -> 36178 bytes .../graph_bfs_step6.png | Bin 36265 -> 36438 bytes .../graph_bfs_step7.png | Bin 36087 -> 36328 bytes .../graph_bfs_step8.png | Bin 37308 -> 37432 bytes .../graph_bfs_step9.png | Bin 36931 -> 36990 bytes .../graph_dfs_step1.png | Bin 16659 -> 16812 bytes .../graph_dfs_step10.png | Bin 29134 -> 29244 bytes .../graph_dfs_step11.png | Bin 34071 -> 34055 bytes .../graph_dfs_step2.png | Bin 21010 -> 21046 bytes .../graph_dfs_step3.png | Bin 21987 -> 22088 bytes .../graph_dfs_step4.png | Bin 22780 -> 23038 bytes .../graph_dfs_step5.png | Bin 23368 -> 23475 bytes .../graph_dfs_step6.png | Bin 25699 -> 25774 bytes .../graph_dfs_step7.png | Bin 24425 -> 24618 bytes .../graph_dfs_step8.png | Bin 27335 -> 27528 bytes .../graph_dfs_step9.png | Bin 32797 -> 33033 bytes chapter_stack_and_queue/deque/index.html | 24 +++++++++--------- .../array_representation_of_tree/index.html | 2 +- en/chapter_stack_and_queue/deque/index.html | 24 +++++++++--------- .../array_representation_of_tree/index.html | 2 +- en/search/search_index.json | 2 +- en/sitemap.xml.gz | Bin 605 -> 605 bytes search/search_index.json | 2 +- sitemap.xml.gz | Bin 1011 -> 1011 bytes .../preorder_find_paths_step11.png | Bin 32117 -> 27285 bytes .../graph_bfs_step1.png | Bin 22818 -> 22989 bytes .../graph_bfs_step10.png | Bin 43930 -> 44103 bytes .../graph_bfs_step11.png | Bin 33554 -> 33864 bytes .../graph_bfs_step2.png | Bin 35819 -> 35992 bytes .../graph_bfs_step3.png | Bin 38589 -> 38778 bytes .../graph_bfs_step4.png | Bin 39540 -> 39727 bytes .../graph_bfs_step5.png | Bin 42542 -> 42687 bytes .../graph_bfs_step6.png | Bin 42719 -> 42901 bytes .../graph_bfs_step7.png | Bin 42686 -> 42818 bytes .../graph_bfs_step8.png | Bin 44265 -> 44446 bytes .../graph_bfs_step9.png | Bin 43834 -> 44017 bytes .../graph_dfs_step1.png | Bin 19865 -> 20035 bytes .../graph_dfs_step10.png | Bin 34170 -> 34327 bytes .../graph_dfs_step11.png | Bin 39604 -> 39838 bytes .../graph_dfs_step2.png | Bin 25244 -> 25397 bytes .../graph_dfs_step3.png | Bin 26198 -> 26376 bytes .../graph_dfs_step4.png | Bin 27109 -> 27393 bytes .../graph_dfs_step5.png | Bin 27683 -> 28001 bytes .../graph_dfs_step6.png | Bin 30133 -> 30214 bytes .../graph_dfs_step7.png | Bin 28862 -> 29117 bytes .../graph_dfs_step8.png | Bin 32096 -> 32212 bytes .../graph_dfs_step9.png | Bin 38657 -> 38894 bytes .../chapter_stack_and_queue/deque/index.html | 24 +++++++++--------- .../array_representation_of_tree/index.html | 2 +- zh-hant/search/search_index.json | 2 +- zh-hant/sitemap.xml.gz | Bin 1010 -> 1010 bytes 58 files changed, 42 insertions(+), 42 deletions(-) diff --git a/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png b/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png index 32d55a2586088f66ec04b7e6c1e979f74adad8e1..128a3c17bd5b1f9c1b011436bdefd3283d617539 100644 GIT binary patch literal 27628 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 A*Z=?k diff --git a/chapter_graph/graph_traversal.assets/graph_bfs_step1.png b/chapter_graph/graph_traversal.assets/graph_bfs_step1.png index dc91f3de99ec0c56a0dff49fc7d8b574bbbe2f09..f8a1eaa99305e9d23734c93caee3db7537749f76 100644 GIT binary patch literal 19576 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�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 Ve3K$}r2pP8*+?IEo~DbB{yXGzfXx5^ literal 19449 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 Ob*(J$r)-pQ) diff --git a/chapter_graph/graph_traversal.assets/graph_bfs_step10.png b/chapter_graph/graph_traversal.assets/graph_bfs_step10.png index e36b33d393303bd7d1de4b68b8c0b4ac0aa7190b..a4f234f4807ef14953a8244bd317245660eb8418 100644 GIT binary patch literal 37025 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 RZ&m;R002ovPDHLkV1nTOC2Rly literal 37007 zcmbTbRa6{J+XXsWSU zt5)r2?_Kg#udWVLQuvOFM1%wY08pi+#8m(Q*pDLABm(rup{$(Y(#GjjX}kseh~Xzc&O01#_lv7Z(@j=H_N*W;QoB zdwP0CM@LsyR@T1d$+f@t*x#5`}?P-r(0WF4-O6r3kyq1N_KX3)YR0B zYrzr{5=~7_8X6i>Qc~L5+9xL`4Gj%}fq@AL2}#4(?(Xgi3JMh!6E=EB0l?d|Og3kxG7Bg4bPkB^U{qM}AdMmIM%Lz_dfv9VcMS!ro$ z&P|!Jva&utJ{cJqAP`7jU%#fNCL|=p)zvj3B0^VJcX@fas;a82tjyWj+0M?ceQrM~ zDe3p`-!^~Ft(p$yEoUJs_kR|eb8~a=pI(oTkDHsDqoSh5$H(vP?(*{TuI{hE-Dj7V zmtJ08s`hh}JCi?t{FvFB;nkjWaB%ohVBu2XtXw{&o2hejbd-{ka{qK6l(O~RY?@tl zymGuE?Qd#GN3e;BN#fsxv$M1D?eXKAO zv%53;sL6w?gSh^5*0DgSqIQJ<{J}%bRz-YrWy&;ky^RbAh9;`s(qja^7NWTg=Vl z&Gy-rrQeFM!BjjXF1>tzZF8q>vCZDzeqi$|2)q>45;-t=m0NS*6TiuqIMun_IXZjO zv~bovusN{W-!QgO-+8ievhEtO{ySySJ#rzrD=B^GU~zRjqjW_ibv83Ivw876uzfo! zYl$OnYGdbqaO|JgpRGTT4gKPU$>qt4>64+wf8~v9?sW?_gVou6S=$E>ovW7xV@FnH z^9B9+)AL((t?Mo!^WD>s97uLj*9v6#qNsn(rFMloe&Sbbej~K2F8~lFBP}kX=DvK= z?f;P<08s908Gaemf5rcQmyz2s0X#V^0_Z?S<112_PJl+ithK)6;f?i|haRtxRFwZO zTJ*K)S>VNYn>_-6->l*cuDR>LB;1Am{>%J?b;Q7r(MqU?YJmoK%XRCK_JEA6HY;^X zBnbB#%ol=awEM%p`3`sq%tl+o3Ip;k5i)Yi&;AJPa(@W$^^I$#R-68mqCiuKCSt7q z&cG8v?h49y2Bx$BusyQ2)|c(b+{pi#IU+!EF_FgZiMsvJN>{y8>u+G&LmJyqVnopI zSy)iCgdsmHKs)_F(J4137 zsd4r~r(uXO3G$Cm27a)n#ot%Fy-GK0Q5Y$+_*HO!1q+y=N%=y=AGZ~MstD90^m5~6 zBRhTSm#aD9ThwqMt>5^Ya$gs^qa~mOq<4lR8&p?ukdnl$Ld_BKn741frUCV{*1PN$ z|J{qjcj)B~XB%SKzxYwW1N0stlnjA7h?T$=?tNG|Lo~J*CK*fJ=@jGr%8YFESi9!{ z{V;Z~KYfi&CI>*>_WMKo$$0Eck2}In!}Z{lhgv0z0i={p?Im>xXpIu{{wvBBWC3MK z!rU^G(K0zaLRz_?O<`|bfg9|~Z5De(hGZ0Bwz~j8TYpSj=A#z$Fw3_J6JGVr3ms$F$P5lu~7~Zh=f-D|q52T_S$yFg2ePX$7LF(1Qv|8E1klj*T?QkW2 z4@#U7Ye+ubz%~B&gZP_W#)LV;V8Ty!3Q!F--^<*0fI2Q@+Gx@>2NjMp-T)}0o5UPW z8NV$7L?NZ~f;1SW#GxwuaWE#Rh{fv%7bbejn`(>J)w(5Dg%l6a6yeT%uMJ8N)f2H` zoVjy{*JYGenA~B`+<X@>%%EiVymqbuTeE0Xj?`N~)OX z_33L*-%*NZ-%7=3V4~E#e+MY6G)UZk$6eEqr+FU+gOM(qw=0Ngh<5Da(}jQCrEada zzi}n#mWow1Lwj0>*Z&J+SW?1WOx{q=9iRbDM{B*c_%t13UQlDUB68R^lroMBnCF$$aOz!5VyrRd9v3TSGw{JeKE+uw+Cn}eE zcLRlr(WJbdtay}o#eS4D-<|Ox?9;Dz28Z$d?ta3~k>Y$twxNAMTQOB3jM>HoCAT{< z8X1;ID*J6&2-dZhXGh@s=s3~!eOjF8Dxh}U%FE*)fj6Bb{Dq5YJ-n7%0)XqL#K4pK zb?DnxCy*cxlZEFBh9Gero z(XSD-SlT*^WbKZSfLs+;%$?A6YsBshy>_JmxZfRKABATqI%rJHMwD5%~&@w}p3?N$9w#oFP9g02p zS`o(Cp`T?p(p+w!z#ZuvxpEtV?_rVlqbg~2`}UUlcqw(F$p$NoJRD_jS-Y%>oQf-f zV=vg4BNf4N9`=o0_paw7&pMmI-CuIdI!;B!C5v6?W z^uTSCG`EddX1;j1I;y#9Uf1=d!nSEvz2{%Q$-#;NFmyj~^7#eE#}MA|tkWN3hSV%w zTspZPG5PmR=_HFuO0i0q2Vbx43f|7>(z`^fmCt(D8_fKiB@XG+5@Pd{=RXlCbcjuo z3~7>!;Z#YdaYrEOdGE~Tn&PQtw4G~hbJX`7aF;;8@cvi|vx6sw36k=llC47HU0hgJ zNvk;GfsuHv${SykG8D4$%HB%WyiJhcs^5Ek8+iV-)BE;uJMdR+b+too^BrQ|zR)NB zhZfS`YUf@fk{c0@&1bv%Cr3?OIVK0sPb*{RS1RJRlA-QHGcO=xMIQ1TY9a-Ws zMshl6oo0Ci%osRDHgOBQ2{t$vsQ8<5u=Fh4TLu`B!o>8fzRx4M8-f0I+K8GNb&u?; zi?PW0M~j6hqZE=Iz5|~PN_Sz03=(MIP6ACk2b2vOvzY|(bMnFilAwXlv zc$_fox7tSFW-U+)b@E4FhQH0xw(T+)y;c(%8$!9jg(ytX*d6UGsHCa*b9;aX7s?Nt z56A}#*@KR~(6v*)0+`KmZCD4LmILgnxp?65MDbr>yfNlmXyNK&NcZF-2Th>d04_zS z5hiv}1~st47IwM@`AX2R#av4;IHJTSG6vxmhRpD}BHILXdBJk~?vg;MB&?|*0LSb% z_Gx?K`|ZF#;IY@5Uc}29Bh4$uT)El5Kx~cnwMz4RQ8-{J3vkdNXoweJw@ULLp^E}X zLR1~X!_KY}3dp5S!#QqT%PIx#$1uQlR)#6@W~HAVX!p^lp99r9G)jdu&Ob@CqMPEY z#F!e9g##_g5*eT`xEy7nln~bBd1075KK1~CLjrZNfIAn)3AYOVUaa%Z} zM&1`+96`R8z6Ay+W6%Q!@S`Qko1<%cr;h%yaV>)m0N=FMUiqfj#bxp+Y%l%6d0GcN z03?xk=kso!l7hY+ND0=M0?^C|K@oVX=J5a=QLht=d88+zPg8b(K1yXT(bqpIUt`lu z(3R%g4woC+<9+RHt)fvYB*p9DX@kxd0XKR8Uz{L|$fOf6vJwX`4B;cYtu{#jH`9s4 z2cHSr1w9V{$>3+OPNY|XW(t5KxCVnn71^MDLk z;Ty5hOIE~WvvpHC;>~-N0+R5oU)?XR4tZ!10$&@{>3TDBTodZ&Ezw+V2@$E%l20P5 z!bzS(S?`n3KmMN6tVuT%URscjklA?U$jYaoxOvVS+n6Y(SAUcC7cmiJO z3}Vc)Ffs)9psk_Iz)!`_Bt&NN&^Y(vNPIMjU}18{Wf|g@+Kolka#$VFc@AMmTjX0} zxQS^z1ekUZNdnJ++L^!MD1Q+CY{uy6oi_8~GYZR%5PWix7bLsL zF4assUD6*hj)s7*UV)iv)M8IR5*({m0K3y07%}(#;o9-6VMlV&;*mc zQcuwIJh${k7h*#6>l}VbV*O~e@$U@1|0^ywGnNGyISVmKKb3Ks49Da8QT zvT`OW4+GCbt@qB;n@?oYv!LUHpno7e4fe)re&+fNm(nz?lSbYy!0wt3 zj}S}411I;qmo6OsoSngCVJ6ZC7sH)ldYkr?H3;ru!r5~ z$7!*4@?p9hmJ0~%q~7D&sa!|9R^E;{`D|SG%oveBX^^^)-nFOt4N^50isT}9yR}Ei z8}tpGr0#2{uyJQYg*7UV&FCX1$L%;S@+ z@osfxC3#M^E96e^mn2NB3M-rEKuf=Om%21I4(b;p7rL_$lJc3H;TU6Waa45K43d?N zoLkS17SE2(w*rA!vP>}0-bUM*6}c!>>TA(E#FYV~%iCXYa}q|*mLxr>u1mqOwc0^u)x ztGJ@0B@}$!)VS%m(10cJujMy`?2JZKulwH1w|(A7TWWNCv$0aPJE4&BdDUCNO4EF} zkiNHO*0y74Sl!LN0FxuQhnS8A4<{mo-iK`ra~sO;7^I=Ta|bu&zX{)91s;JKmpc;t z@ZyCCMfm6fi%KgylSSstMIrTPb$7L!0kxXwJ#PXQS5H%Byk))fr%87j;t&1La6;e$o`a`TTXT}sXMm)X1|(; zZ0EF28ib}D-lp6%TkHG0i#WBpVL>KtG%% z*1g7P!^@Fj?$jLjz5~}j%GiRjnM1<+6QRpxf!hyfIY@Jc1-?M6w0O>fL6~S`vGEU6 z_mLWrO72~CE^iTJ!bed3e?em=+9g}SdkvcFPRHM5Kzyi7+q8lo<03f-$#v(%DY+8Pl*0Y1H-bOI z=S&=Wl>d$uE(R}HV9B^u7;Wn|-5efM(`}bQ{b*CMMo&V1No^)^(lq*#!^y(1E(|Q;?d#kX!jENS&>nj-U%n22YS|so-Q8CS_5OF67@ns-S85LvpcRf1zR%DcLVL2>kDWpHRBy z{77oOf0HM65)tA66}FVr46<_gx`eREzh`kFNTbHyo+Od%6I9Q*NXWow-TrzYNhj)9 ze0`)33DHhvT_QdZ?-5ScjOy+$8fZ3Bx*;`4N5W5w5;#nY<}WXWnj}Yu3R{;RL?KW? z&eJN%q?+4VG+}xbFatYCo)`b672LjAre$l(p!?91pExC_54*#DAqw(iaPih|>)n6> zW^+4O=2^-v^d64F(vCZV4_(8mSC%RuYr0#|%@!CKquOrx~Wra86CljbIj3r9D`v9a_Za zmit}qZ^B0hTM=rChyf!*&X?CtPG(bslihIHSY|kg2bI{z`?^&I*45@4N!^b!m#;XD z0z6yR$-ARip7{gl^;m84>H)H#lEQj*qd-*c4p2_&Avpimqbjw6y# z>N)jyUoJfC5;O*4{T*O)z=j8iM#4>9L_FYBW*`tFD9-yj3n*=f4EQa2!{|CTX@I({ zZ^S(mX`nCE>sKGygx@_TFwxHAEcQnoNdx5_d~EL%nK5tl@vDfF znCnRacAfiG7lww=H-{w|v_Dj$XZ?_1g(@X4LDS{K_2myeW17JgDz*O-IQjgSIU!7B zGfCAzUI-|a8@TW;o%^zma>X1yVL4y5C@lJ|sZI-{qj!r;}vs&AxfZU?eSQYi7z)@x4cLt}U)5NHKRHZmb0uGYhFH23eKV~R2YTPszTZB?TU>R6X$JEv0J(*&KPEkbUu>GuQ|hufD|-&2ZxShFS!Kvyeq z#>|PUk%=leUnOFZFVi|Ll#UcRy@tu60=~jZEWj1;Vh4U5v3{5ih+l!I)iU8Q;5fe+ zBgDxmoM%+MR4g|o{Yw3HvT`TrF=s(7{5Z!pL=8p`C#O~N(pAb*38~F655ouU<{@&& zK=E4wzo2Y)cVg$lv62zer)y-C0s08Fe5lG*VMP3wR|1X_d4tv%WHbGDzwW4mgckV% zv%&u4NL`XM?O$QvTx+z|=c~gs{N7+4J3Iaj&6+Vw49ks4 z6vl;1lvZG|(B@)sBKU)Y-C$4VwE$vmIETC5=U9u2OX|MkmGyTz8|dovIq4{XV`dib zQ$;b{2qneOMoPk;tuZL=lIS;+u8ASB)qQ%aH~wPz`eX&RRi6vi1U2-B%D$^6KpDNN z!)Sl8D=vR$BxhiRK?QGUFvf}NwnOor!=fFT+;k&Gf%?Y1M>GM}rG1~|6LoBeL0qQ& z9ie7e<&lU7YSP5EU5q6NY*7$>j@sVM$V|LtsjZ<6P_Lop$1hA$x%pIaahsUUHUitJcRFq$3PB{oxr#z#8ny_E!3V3Y31L(Up| zc^E%7zX5Jy+0+R(eDZph1*iVzlpz9ZiDa!LQ1~RZ%nLfilgd~YbF1Jf8>ckZ8B-v} z_x7xBtvr+ffv~I4g9JF6p$DUX6SF!%@{iBmB8CRSQSLUb>@7OHf7M5dJ4pmTOOGOS zY-}tsEeW-7l6@rN3jS_jgaU3p57$^d$(M2VsoEfdNF*{OOaY1FTexsnba>_(>fzHW zNl?}(M-DcNjD)HCfGd7xcSLcRTp{H%Qaid@u7gL;raJ&a;nHgX!Ji%V`!43~zw~US zT~)?T?+7U3fG6DDIo-BmkNjDpi&eniu7QttT#-ywIZlzEMC%9b@i-O;fSEH7i_Q zwhj&QW1uFiZ6nJ&tdK3w(uDkTFj1ckUjR=ofLZ`6;d6IDxT6Bf)>z5O=WJ z1BLb6foC1tG);LXGt-j@`_Dc(^xPy5(a>xziQt?x?ydK(N(CNHUYe=k2FcWUL02dz z@93v*6Gw^rL>!FypAWg@Y;t})?|qFP99ePw{_?QzHtciwmrBPF-&hAawhthfsG4Hw znmG?JV+DyrU*JDxUoE8=oMKja_<0c(aRRhaHucgy#oLmHX{&&PCV&MZA$M`z=pR3n z{}+x|29B~=B?4WPtnxI4X$)AQ3Zp@D$7#?^$=nt+!jVS+8H&QB8|xAS{#TKUP`1OW zVkMURz~MnlaRA=QyHpkSuXnH*UH=bmD}_%prNDHHQ}~~@(Pw%2{Hh{}*#G(K8=C&C zb0m=SU-Sd;By&lU-Tp(bGN$3ljo8gmEi-{qQbSE1?J@;-4M^hMhwbA5%E?4!|m-vBP@I-x<|JgjisiL}- zD*!Iyx|zE%;A7WVF6_&{&jWBI;Go?is<6B$N+CU*>>!T37!;68#5y z@n}u6cq;M(xRLhaaV#wFJ92t3!%3Bai&dkz>#%$MjZvKa(kfUUizsx_D+c6NN@r(#luEu6I z&{#4VP1L@qXGKXsSS~P`{X{;sZIL{=)s>=nrG{4bmqzf>k%o@<;bbKZ_hx z=szEZpu?64y!Q@0ebfq}yjS{+vM^%~tkA&G=+1-xq}&?+`PjzePqU}vZB*$A>Y;BF z5RM7y5{wnL*`oAP2eiu0`H&P6qSh%wj3FUH@t4}Y(vKwu;HK{@gHr@+A+3x2K{QSo*NC(({#!~($pz&1*v96x2r)>y{aphK4xbZ58)H@f2zq0bd;j3tbU&XJA- z6rr}b`qw2xlwhHH9+iFyvb4H0*X4!kWw{n-RHTt)^uj<*Ktd4Ven-`eu$aZ&JQ;CI z{E`i1ALXAaG^2&FxUmzCuoP0`5dCA@^KC^m`83fI`@=o@+|cjtAaYS^B(L4Scpy5R zL|cu$k;lZb#ZmQcmeJKowJ-Qcn1}5{%A7wrcDw$jfE;MM8f*U>be>RA+2B!HmsnD| z;6@Y)jNCAUC1>%G2%Qht@nWi3t0?nq4x!>b$ildc-ryro^H1g#sWl&@BotWW(pzny zFE+3OKRLuh;VxA`$lBnJpF*(BbM}7I|GrnuSqB*75sU0lrS*!oIP1CN*Cu18;`r#Z z=SyJkjQJ1l`4s#frn#Gsd>96I@#S-O+G;OLt*AQwBBO53VgeDbfI}X=PJi5x^E97! zb+bf7InXx?HuiXu2sj2?!iT!R!~?muJoI?JQ*Y6)a7mIxGG}yJlbh=;is{IJlp0Td z+>j2iYJud4lXOz4t4R2plERMGW{1?Y?GzXCgjKE>XD z)otB}#6X<@^;ZP%ag5f$4*wBc*z8_yy>_<;lRsVeclnF%wK(ibOkRX$4f6+q7B= zE}@Y(c?U1dAWbfNR}JWb?NBC1Jo4YSaKw>n&wQicDEns&BOfrRAz*~@BYCcxH12*#7y<^yyFReh@KzHb_@~@C*RgQq z)2C0XBR(KNn_DbEXqiedz}NzSDeRl64L}ishPt`M?|zZ;^Ty2T+DxdjGztsVc!iNt zS_*i)-Z%71qapTC)tbPK;6WaIOpXHJbZ$rx#X(iN7VeS@{J76C5OM%;YI^DW0l8N3 zPoMNxbU~U|%WrL;nb8PnoDu=AOOq%BMT1Z;rx^|j7)C%^3}shdps)OmDioAjJCIET zYBnrfib@4!{Zi3B=c}`{c0aphIiLxWaT3Tq{R-i`zhcqTcI##t5`#&_5e5#%<6G34 z`9A-R*{#ZEB%Sh**^h!2*S zTv1{}04r{7G;O92$hFMxztL7bkSi zFMY!WAW2C(!;%oqZgbfcF~|h$!!YM;a=O+ZP3i0T&R8y&E*&6LyJr72UaqgbkP~9? zrAa^3DxBL8GNTro!=aL*3}^%iqEqcINz4qHD=-@YqbGKZB)?HeRWR%C6OigU`vare zDq00{3CSUDAi$jYUrquV54kRMH-@AINyUIv3UpE3G^#QJs$k2>K{C>`QusVr<Olo z69)^i6JTIG8XS@b(NTNE*lG^5KG|?s;t(-D^iEZMvzZeg(cnPuPh{*vfnBWEf9h>H zbHy%g8aEeOfdG1)z_#eX{QEQj@$Cdm=w1QYM9oKnL)6Cf0LHwVsQC$61rkFv0eqV% zaa;@a=9+N^iGcG@6T%BStu^bmXlnCLg7>Rc%O;YxP&@~Rn4o-WpBTj(gAs0HB~qPM=|$sOmG=q1SYd~ zbCg|wTMixOW^opG)oc82m)g=he1BEI1*c)+OpYptYMjwFLrb&^)FP1C$z^EkXWK04 zsdyn+kVC3()Yg)+dkz~Z+Lp#~vn_KLYF5x*{%jYFj|Lb8YmLB=axBsCN|Wmx*y>E8 zXbA~qcr766*~l93KjYDZ&Qh;1)WL zS7H0Es0AAB$(?75!v__77y4Nj@MmfkivJO2Uj2~TRU3YCC%~M_ z6FS%!FLY`rvFE&Adw?FI@(%^k7|m;Wh@fNX9(r=$5FEHgND%xO($ThLM})8ic>A6% z-n&RY;*{t@w5$e&3+n{q4}+`s5Q^ip732=B6qpEqkhQ-l;f`$Z8!Wp#{Xo^UWig+& zQFm18$9!V>%kE2fsA1NsH6=S!=Hzz{>16p+u2;p_AL7(H!D9pk@Eay{?B1GJ(FYVn zy9NFWk$Vlh@!K6zBejI4IL6L4ZiFqXDKrrXS}1<`D%Yg7t?wSXpTL0w-M$C`taf`Z zYjEFpGxgr=Uy3)myV5L;%E{lL2zYib1>9Fiz%k-t1g19>&U46ByS4*qK?l%hK~yGc zX4i+m2i1MVhVVid*U%q7bDJ)ol#i+1r&7bR5F(zzF&8*laX2c!_r^w>y6ci~nSr6X zB+JY*FqzI-BTquJ^W{{hl(4F9Xl!O>Yk%JNTHO0ZO~r(z#w$1iPu@tk0)KgIBYsJC1PFUIi$++X)vE zTx4VKe_4_K(k{Hz@;u+*n+8zIedGS(uK28KOIl-rE#f~oMU`mnyV%~xuKPxajpmpB zzB5!Y!iP$gk3;ldd=%_wUUB$8s_*#%PQHuDp5isek%+R*D}8A>+k}%mFK`mxjYz!( zh~=DQr(dQhB3X?uRe6?5&?oo!(^Yt;vOg`0f%=2`6?Y#P1%kQMQCWQ7x%-ygioOw> z&M&-P9koXlV*4DYlryoHU2ZywO~J7fnD)%P7TjHwmjlP|4{?6w@-Bak6F@SRvn*z9 z%~_vfFI8)q809U^^S4AF6oef~oop}OE?jxd-(2d_{Ra8@fWygw!}!P>jafZN;Lx0H z?keunH}Ggabr%ZvhqDbae&fx=v|ZoI|33IDIlSqZY74`%aa4*1Q8?c1&6-fF{<~~E zH9O76E&5kJ^mwS`(E^+KRDRA^YfH-I)M(K&ka8yVjDodXx?4T9l@I)=iBYTKwh{4W zK=WJA`mLqH2y#$UX3cxCl^+*zD(Sb3vAx5_TU1BU?}RLVc)ync+djO)sPYoWQKG(x z+@kTWPYogysol2g((%b;&}W#^1Otx}s23DjxlC<{^{r5&yw^)c7gwE2c3tp+Z|!sR zkQrmL1Jd@Gp44H9sVBwex6N_$Mt8g?zZ6Wu8e)HSXwg$8P?!$6h@9H~#!2AilCCGna}$x|lzR4`}l&_phIRp?Ni z#jiM0U48!FAYt(_q#coN6J<{bed(l=*}u8=bsm|d5&;BQ(vAaKT`%|8-lEj;GaT?Q zWThE6yd(&{i!LHXox~i=`zz6?n$H@^%IiaZ6y%-mO0{fsgP@})9uZPNx&nQ(XX17t zLFoqKn%3e zm_sT(s!xQsjf0({erXz2Z$$h0JU?!Kk4swSPQGs+nxh1@A4J0UZ&$G*T%#g&7wk8z zIfuNsY98jY^($2ddY$B+^l3f)Ef+SU#bydk=*S)RjBeS5lJmZh_=^I7h3~Do3<{ea zK*7XBDd~%gJzRbj0a0T%qDuLEQtg%+9n=KNK=2FO0D2UME8YIS?^*Q(X@FY{?cG=i z7xpo==udddpYmFS(IzPSxB8&0OriuhXk4{JY(D5Fy~vqlx!) zi2|K3QA1ipT^m!&8g})@oYiT)RaOzQRj$7b2QQT5(^w;ZG_P}|eO_vpX$q2v4I#kj zr?W`ZtQ)DKV}@$e0eT zspEM zm0b>)N|IlE@F+#Vx2NhG{f40!!w>3)AfOX11r)dTSDk|JpA&}lw zsFcH6c&lYgod3{P_`ns}g06@+57w~fIQ~`4vn9J}83EcUKkGI|#tb*(FYsn+0~(}eReUfxlE;cyz8C*)}wFKz4DoVeb9ao!a4FagcE+j1Zh|i{bgi>JlKA9w8 z3s`V118@3;4_vYKuCA$d)Rhr}8uU=3Y>zEP`aF-wpAv87wc7qL2737bT@54p5tD@7 zXH>byVba=3+BP48@M1;}TSc3x#xsgdIZvjxV1MxlVvTT^9~wq{BWx!Y=l+Nq9*C0G ziHc*A`BqwNHRdy|RIhEc=?)5s(9+2cT3@kN8=!P`@JQN1JK(u=c1a29lzn}lv^Y^A zW(*ng$hPh0$WVKJGQl__EyhJsjvt1b7`}kTHvEhd)X_k^1$y#AWyQurby-moGoAs! zKi~LocWyUq!CS3!3>2xvi?8+kf1&>wbbij9q!nWI`k33#-!1ONXP$ZxS=_Q|UyAJ- zhPLE25@0+vj50=$OpvQF|IEdqr zd8;1mz(Rrjrj=iaVfazeBC+E8{=LME2Fkj}=k$5@Gr%97Tg()pXRff(2Cxjm1k#C-_Sx!UMSzO` zN@e|fSR~unr|{w`ccVLbjw(Zq?VZ})pZ+&Sm2XDK_J7Bc`G_lRrl*IIPRz7_ZckIL ziZNf%jEr0xrYV2QTq2!n#8o^o`PmTcc-Z28S>S$cPT%KxOv)b-f8pf(j$XT+) zuXJ7aP&j)nGmkfVw&B|vGUTDg3cX0PnWqrREjn>-V(OB|CU$x9kzr&Uon-G#BpJ^ zD<0f9y1+et)0iCX&H4}ZIps5%yW@#*V$8;>vb^r)l-w&>84l9#6)iT#1eXeo56zO-)=EcFUMEIDTisDzA z(Y<`DHKkV*EpB(mP%k5gf|nNt>#0T|50jdY^{P->Ue1KWM2LoNhkRo9K}4Gl?zW}P zmVvt+~%Ev1hN5L2RVT61K4wo)urX0Tm+0~_(%~`MtbNYaEn~G z6=l}Ta3yYBIP%A#<>do`eco&y9?g!6-Z^q-%ogU*wmAb9IP&zw& zf^-2~`Qzj(yr0H>|2p6nZ)sx`Oli`=Lk%+@uF>z#ic9Rs5g->Bs1-x$Nw89Sq(rn} zOm&>05)z)9*??KuvsZYjn@RSqY(Kp|s^(Phs)p#rwQ(2AxpI|~$`|Xw`1i5MT~O+($kKcCj~Fwbd3DZi61|!zhp<>tz&Nu&P)Yi zFjBx=yx;)F8)FKpT;7z1;b{N*9gxRd)zD|U^QI4waZ>z6Gv*(z3C$58wd?Dn0Oij1B;rU83xDv_c7dzE;Ma zefjcPfuy&cm#Eu#l!^0a9DZMIaUxMYLkMkDiFFwaCKeADvK|3PVbh*^Y^WHtLi}?E z4!HmvyqSBWC)cN_hhMpVL%8eyO_|%8W**tsbgAaOMGtq7OSQQj)w0~dI&Ica%gA6Z z`Ef*VR|VQ;g(37Gu4%&#axo=Q;U5u z|1#ayl4mlLN^Qf5o@!SToMaMY*M(Y9#c^k`^5EO!wk(GD^&Xbl`RJ$x;KFNO^^Ic! z%tmB=Aj{S%-L3IP<9GXc@M^(Dj0OEWaqfGnw6r z?WxeNy+zImjlEu1inU-4I$Ypmd%3~e8uWJ!VcI0UFK|-PcF2LHJggZ?4K$+gB{6`Z zQ@bsW{JUl{kA$w2$K0y&WJKF}@la{)Vf;kck0@;Mf)-9)49DM)Wo!fe zn>33E-ZmY*afr_AA+sTrW}qv#zn)ZRM0*jrl(X$I0mo`;Rk~C<)5gs&DErWNjVL~) z>vKmn6GU*hakta-LM?U5~60=E5;Z^lt!_m}Q_XeFH7oxIbyJ-x=)B_p7elzQ%{kansy0MSO0*!U zRf1qYaR2bkzTKjs^hRYwJiHrx$Qo!>`Z8yJlW&r$Ixjk2B=7$RyTI=vLS)hqnK zupG4|P9^86whKZUm-Pf|5}_E~R0c;Uhx*LW*#hr!5PfW&BQ~N5aE^A$DeHDo^z#pO zVGqI!bg%ofEj5fjr3O5Y86hdYjDSylLfu~*Qgi!1=-2LW!0n`RSlnj0?ACD$3Wsgqtm{SH=}iWT;BBZ zeIQSvc*h}w%ikfyJ|_5o|305)6Na4}Pk1WCk(C!u$FKW~#X(V%`4ganCcI4+&NE^_ z!F;uveCHOB=mv(9Z<`D-QJ%rB^L&njqQ0vC4{2W&6vr3zJG;x`?(XjH1cHSS+})iJ z76}9hun=5=2Djku!2^pEoFKu11a}V-iKt`SdB_y`OUGSy+!=TQ}aJ$ry*>B^t$xz-!r_GOyq6?aS4e=_J7OR zF&msH|FAxwWZ{naqWr}?kvMU2jQA~X9J+#^32!^E0HoSM(wl1Sc&MpW-fLH$=WdiG zPoBdz{e=oT3DT#FtF!z9RD3^69N1x!}o)(ajqc+211#XzMZes=&59^AkPL^+2Ucu?+BT<}v{Xy$`r1ieuoLAROKT ztBFj+@sw}TVQtw&Ku*agCyA8su*K1#TI`^~pgHaYdO=P$ZIUy()4jDbuM={ z=agG(_x?k@7Q6I9Qb-yL#2Bi49jkyH-6|CXI# ziG?t&)w5!oXJanhtmNNS2a5CN{ekfx#6?%4fO-K>S4DO2fdZsfNUVd+5(7~zj!|ox z-A!h3G3~U(10q$e@S!dGEWlqWg@~H?ERAdt!Ll^lHSnRv5-Hgnkc`Q}G-oyX z0;xNXM=t)o2JxORs#dj&{J|OS=K1xf)$SsswHCo}FSJE`xOUs8alEZ{%=!$iObG}~ z4X0X}8?eSI-8VCqQ>hQL-FSprgyk^{8`l0xF<+AXM*_M5a=!Tm#jU5f;lS4E8>OW? zx`H*d2j3L^Ec7+Ivs;P-ILn;L5V^XBSucsNBciB4A5^kYN@IT#&Ud0pp;>Qy<3;Iz zfn?F6u!}!a^qeB9%+!-752=qEwNt!(!>Og(yl0?(ers_nYwVyT2%bVfO0(r@l zx$G-7@&Xh)c2aAV;v$W)>3to4b>~VyH)*CY0Ph`}7ST11_yM_ev>W4tjf%=Me_9?$ zW3A;PG@536JTQLM>kYHixU*BZq8K?oyK1nIdvMV zG_6G)TTB-h2gIs}d8=m*1G0jyxbB^@^uy0FAg3{lm?qlgJwrFcD^!<)c=B$*)2|LS zJ8y{vLd?jLpY<-@Z=!U6ekfh1MUsjTq@#a^a?!+DiHSlPS5&9Ir(Avz4N)VcbVd_Kf`eZsFnqM-xzL!HHHBU|V?Tsh&E-lAQ#Ol5IoN+c;MSHKv_X7$~J zQXq$tJ99vt0(A3NU7Pm{;G}GW5uh1(@_#Pc9W@5%A?{hUaMQQxS)) zvu2X2BhvXPZ5^3&;aF3kVg~Z;py?tW(4E+Cu)7aH+_kDJbfZ37J&GVca4iF5bhEu4 zk@A}BOFF^r`;Y6gV+ef=#HGM10RyD0m`pum*TC6c&yeMj-)WfY2s-$3ES%B^1Mnqq^F< z{KjGWI0P#Xk^>hh4f^;70}(3{H@9I<|H&dDr+6rRP+1pmNm92t2`~vb&D+{A@aOs> z%{{3}OfrEWRza8;DZ3=8A^hZ7(u#M{x$=@!5HB<-Zc~Wi5&jyk{*)heC~$>+^9h5F z*k_gJ0PF81<=FA!oYpT}^c_J$G9fW;j=cIq(mm#aP+JvkQ6G%?EssmS+NPvcRm5w6 zx(Qh+yU8ki2XY#zr3xsrK`gV?d6IoMgM4t3eN7(;;3yMe0&Y*~zNrV{jrH$9x03gx zj_*KEH6YISdced3lJFMssY5U_EN8q|TCZRnJoywaNQ9GIE@x2ODl{Zb6ZuGseZmZC zdDL^MvdBBtqN28Vsj>ogdRJdR$hGz)1g~LbrH3qoKL;}0T)+S?4Kw4Hk5|Hq%VHP^ z-6A7utC5=7hUMe;ImX|n<0wR3pJo_AA4+qsd1pSBI~m|+jE1m%a-%>jG{XUh#wPYD zRhzs&@@W>R$Ku$oUn{hoAHB$h-qk=@mydzcD)6ZDNF?gtDXAFtOArzcD4B)?G-sH% zoxKVZe36=2X~ za!lIF#i$ipWTRvFNMo~%bSN$f=)?c~?cuCOO~A-#Z##2PD zYHI4;agTvQ)4K9N*O&Ek<3xN~GId-z5w8D3y5$PFzIOzk1-IU$p)YY)slb(;w>$K2 z<~Em*yWhC{aC^;?*>%_{`(T>@%PGteQ;rW!jZw?OO1%3*cmKJbmrBz>v%6i z0*k~n$S#dJ6jLLlk7+?uiSF7YxA^`Dl|}tWnm_k1urKB{zg=;nANL*26sCW5lM6q! z9WA+9GZ70Hxc$?KybNg|I$h-~tuLy~6Nj~+9rtS)|JRQ8--vPuftxg}&Tk`l^WXFS zdF03Q@E;MN(j9Jmmj-nRC(OYsv;_vX96kREp5dr*#X5W7VXz`bVJ*7w+CP{dkGxaK6s5VL)=K^Ze! z8f926x{Q>s<))~xesbd>%Xxw%^(^!c$N~RqT%0RaK!ZX~egM`3yLU7p;a1(K6y_f5 zzrAsu*_fcWi)P^6#H^Ipr1aP9Ge<38q^A2P9a5_r+XOOq&Dp}VUt>+}#r+laW}3AB z$LQ3@i$$kO(X5~XS!_ANVD=E)xjlj-^JIZSA#eTaOw8={re0mnW$WDf_UGhAxy}`>?A(^A#_d`*?-o{jd!blBLer=#z zrk?-9uYKK3=`!{-L(kz_&keQtm5W11oV}Va1+aM3bAM~J{)lM4P)$0JkG=@zqC3x1 z5>!7qFkG3NT^#1Fx+{4!qQLl!VXJ&CdCWvBAh(%w`yqE&;csh&xKhVKQP*n>K1 zLN;+i_Bu)X>q5E^-09}?A|%g!s6km5(psLqt2hRo`ysO?!5n+j=1L7Ny}%nip4x2O zAIIi&^2jL^OMtkl1kL@Y6G%?=_=vw3U5GBZ%}y~+dvhTw-TC;z#dZ{t!APR&k7udY zVe97)fS1u8B;d%P*qpBK^46L zHGe3f$}3sR=pB3q8ClD3>-e-@N>l2K&xdcVzU(_1teMVmhVX%HouCEEnF$L_B3h%RNQy4gbwXX&yu zrk|He!+-diIx&HV)xC2NjhRbeY(1p~P>3m`Lkr$oku1JFifGC*W`f^Ny`=Wo26|AY zALlL_e}wD~V;qPu*3|HOQdbr&gucvV*;$~=T34$2e4X0zt3*D>r=t0pR_|z)z|@y& zsur^oP6ARd5YR1RjB|A?tBVg#hIN(`R(i0?6_6T_qxyU|*Tm_o_fP zSYyFank1h|vrO@S~{cqp)=r-!(o?FE`6y9rp zX?(7Fp63Oz5=&I(CD#gbzNz|P=PCfZid8mJGb3?57{aS4pJuiOA}J6hr)+X_P#Ci6 z9)T%ob+eoC_TOcxvhh}ZD5qDhycpva0{G~J`7yBjs$;XL=xq0XezZQGE+A5%I=|{8_ zosbJ@2~SDKf7d6fexfeQ%-k#Sue)sM{KkzAqNIOAu=~~bGvNF9Lv4KZyKNFGDl^wq zM`)ACttOMkfr73)hWb0(CjD)$6z@n6!cqFUq;Sx3deDaGwxy9+z0jK+@N}0n4}q6=57#lKY7$H=>J5j$@2*(&x;1}y7<%`w#7zfE(-j zPtmp;$g-*A#J_PbFRy{)AX`{=`ih_sk(Jp;`eQ)wg>Jo5f1t(3Pu;GyB6=shB&uzag zGD_TZWOsLW3@~{eP*X?4ncBL%U^(^`uc;>Y$%eu$%T?aY5}}WTIJqwlC~&nx7A*yI zVrk%`GzTcHZ`KAB74k-usS!aNGx}iO0!^CDkYlL_al>oF!xyK_L!6+z>kAzMnbozK zL+$Bt=e6$dl^FzZvw&A!%agUa{yfP^s%s*uwJmoU0oN|jJg1Mqq2+#Iu$@gF{iG=q zPM+r=IxU*O&DD1*na9GRiuD)()-$9LR^kJe*%9K+^#Y$BEwC)Sx_hxOehv~kY?tVp zmNVn*x>HU)pcy`vjdQpbcy>YyFhA5F-Mv~imMP*VnKPD2l7o*dTYx{QP=xjTs}#13 zO}jIz0(^gQLJLvyZ|BK*ciiQlH6B3H3<>`}?rbsT@AE~)4j$)luUNAA#}^(h(bUj! z;Vel1^hK{T;sawiP@GVzgCkopfFh&#`G(;^vXx5*+*Z{HqCDc}kh3L~Nk_|*-%Wd+ zc~~i&g|}gxyFs2-R_`Bh^J0Se6-9mS7xWQ~n^EJ~85Hrm!WU@yOT?Ck&2xKNKW!JTWp^D?tYtr z^>L(3Kn~d@ZVa`{9$DdsG!LR%ZccRS*w4)Fyg`y)f8TZ?X|zinTrAaO;2m7HJ^ceY z5=l+DFN^&3ixW{)e78Imuo$xbmF4;tJ?ms3>FYXLf%#q%-c?t4=>Pq!WAcF>NW}p|yj~oNtfGBQoq`Q?Z z9GeS5qPh@(WRv|p!6|;05q~MD;!VjX3rB5jtb4Btg2<}1?n-}UFKz7RC;^VNzn9VX&=^kj-}f4Anq1xJdU@)`_WuAzZY=(2zh&V3^)eKn+k z;dlOT4}dme9=Si7ZeN$ysW_Dg8Gec1f@Fp6z7#i)8`R2Whk=;uwW-8M|3<*awPN5* z2rWRTI>-c?))zOQkn)tT)KQv(9U755mTW<%Hlq%S(@41FKe}YIGdc!+@H+Stc1Xtj1MN>dA0r>$ zO&vxQgb=Gh*9;@aDCVC4Xr8hzeJe7|o*Ql#@DE9Y6D}3Hp-}6O&g$6oDQZmlytsQ5y=mv(skl>u+d6N|!+(4m<3d+meSpa}4uE~ms;Ow*J*p$Y>q;w=&WjYdNN%`BsP{g8YJr75eI#A*# zG~7JVhMM9H`VBEaIXbssNx)RtKgu5xq|QjV$*)_=Qkn~sy^6S^V@ID+2pHKPlB{I{ zLbh0oT_K_f%aneWbogAa8ARYEz)HZVg`&8^X=%BI?=`71sSlwSp-kC<90fVrA{}Q zSAGc~1L_pUWFscP{0`B+bvM52h^cA zM^Kzs-$t5*Y6aj^4vpDiFUUPW%T{mu7)=hr`Z{`giF%}!g`RzcSRP#0Ks#Qh1wrPp zZZ9~eK!_<{>_`L@LfEYb{oZHs0)F=seaV`aYG_umfkNb^DKLadogpjzty~rNOF1Ju z*a9`>c;&nM-aOFwF6iy#yPwEI6g5o~+8?nxP%rpFDoHOu)))gg{TTFCLK6BWsJ4y4i2Knf-v`igX1Q|#=0tYEh%jDL7F@;Z&)yjbSTqZ7Q$rN)Ph6O5R;AVs8$-HY1!l;Y zd7SzG1<0H^3XCmgZU-!LoH3xv@Dv3RJ&B0mj#%0nDd&X8jNk*MulhD?z`L)iv0BNI zVG$^>5_GxqpAF7)8<;cr))V0XNYni`b9%oe%oznFf0Mrp6NBxWwfNa{if} z_bf)abQP&~h#J*SE6x6z2 zOj;P`TK$7b1z4l#PNEeBR!4-m+n$yOK=};TCosw<>JgIQPkU-49?=8bWAutX|ll;FiSEEDD_f^;%z*>(4H2oc!%Ll4XmR0zKeui%{^0imOxCqT>DninXy&xt;5%nQq+ z22g%+_cj?^PEYyyffBKHZ`aq0@Eb7L251q>{pV)3;4;A(9rxFLE`LI)5cO9kt^b+9 z@oYxZ=esCQ_^Zjp3O{(9;1PKojnGlu19hGsV6Eh0h+CMu5#bWRD~{h&&1NxXt`Lg5 zR3VyuxmibKq{YDm_rT+`0i)U;(2oPv@&#(QgdW3qGG^r$xcA*F58nid!ax?TYGB z&o{?I`1jcdFJ@uUcN06?BH?RRy z5X7ijal=`gy+hkweX$xojRa$LRVk3rdAT*W&MEGEd~_%(IMKaMI!bCKe&_Hg7KdOC z2e`lPEfm*(s(hZXss=6Y7~!&6SXJQC%If`@467?Y$?Eh^8>e$?1uWuyB#I(=@jbTv zLh#%d|5lCz?r)<~JjN0~TEPAwfj*kDnSD~&6h5o7!NPr!eXidPdkXM6}}Ij-R}EZ(GP1$kj7^31;nM^Av?|g06T(LR*BFL<_y; zUM;Wh_zbUxci>6n%Tq`kNW6UBt|Y5IG+IUbgNsOCvWdX~ewK?sag}ItnLf)pgwg*& zk)yu-b6Up(DPF$;6s-w0W-C{c&_CNzK@1emlf}t%6#IOnB1k*diDkym1?OyK0e3uk z)HrbFmton5?@#+Ts8$;47amNTE{a2%mE(LC;|{d@nGv+Oyb^JQCh#`csB z$P453EIvX=5HpxgFA|U+O$u<`-=fmZ0+aqZjpbq>nsXnqki0qn~K!^BqNKRwOtrtlFYL+oXPmqF(fvDagh zy@x2+w9Ao}%HtsPbzO@Rf0{rSMkawaq~aw35fHWAPj;p?y%z;R_)8J?j;!1((0`aJ zcq(m|JdXcd4ZP-}X`5TUv?*fCui~mjgx_}mgXuW1D|9zPalL{s(ur8rLc0qkG5*jz z+i!@u9VYOr+loQIR9`*QC|K?b1Bh~>t6;E>tWD4Vp0Ag=L*};DKI~cQmXQ?RhwJfG4Wi8XYgP;G_W-`<_5ts*rbE1hNL%K>&FT zxGjL2_Y_$}Gzmbr^dJT+U1d5LA{cQHGcr@b_K=olQ;Zw=8nl_F>yM_W;_z?_bd!49 zCmYCohCZZ)igrh#1})yj{5nW2%|RD&-SIN{vGvRWC=2}daFKs~7UQa19P}eP+3cgVc8XUS>B& z5%lBV<}zio>*xK!TaGV9f&URT7X?aH&G{S4?Baf=VTn&g9?x|PL<^x%N3Latz|@y; zWnP>8Jw`C=%)lH7af+9Ozzx zfP#r}^SZONGIqq6^0yq*1a;*$*aEvX2F2?w60$D#k{cpq;I#PKl5Jp{-)mHnH)YQ? z)DbCPle;YPtf};ClRp~KfkDB%DrdW>lf=1ct;e}aPe;``)zP+18suuX7>Z(Z2~dUX z)S~2kZo)EQLR4HN%cyX4SYTLW>c3Zf`74A!WLIYX>itgcTDz$;(5AzPT2!Aci9`Iw z?1(UXCJ(WQ8q5J&)jm(3lyv@Pt6vOiW@G-|nY*~MpW;p;xn{to(VeIpc(+5HK<`Th zMgpb%sbi2?6#r4GUAX;WjDR9SOJcTDmt%`ZG=MY8xOVx{`?f8>`1h?9_NX)uF6{>? zZOKLOOx-M*c#6X>3AUZ8cWkcRlY@7w!TFy#43C;`+q}w7WZ`RDDrXv?Ca)pMW?EA# zIl@3?!=XA~`|dMq&9&g|u5BK@h)x_3m?f7}<~Q9K*Qmh^eyD4g%`YkBOA<*tlR3bAuiAbLX3+0vB5cj zM>W)vGB7vkl9b$sz;fVp&~vh>kJ1=Jb&OTyUw0qp7}uDfvct>J;8H?`c2Re7&D?&Wuox)Q()_hkLH;0Vaa)P^(mU{=@Tq!psR@+4?o~=LJnU=~v zogg4;IpZi^tp7Vj$D&y}MptT}8a%3J;*TOBS}&>8U6~H@*Z<4b+>{op`F-${{PC%D z;(E;px<-`IGw_@tMiX4Izls>8@YF&iBCC=wuN~k06etvcQ(1Jc_@bcd`RN?I*FGqbzIg~M`_P#h+*rY7xmlR^$U%5PtLFdXK zr^x9x81uPAd6*dh6?flaQ&W@2_rkoNUX)WEUdVD8rTap`4ta!vb3|*n1~9-_O@^E( zpmKI~xaqkfdr}31wB>WluNIbUURXVt@T;BTp-+k(exyA?ans;@6f62~B;tbUZDd8I z$b{$Aw22i%PXj$@XXZO9|0nr6b`5p37_3zqeVb+>V$~RK!eOEoQeC!WHePDgI*0Up zNd2-^~(LtqGoK0-ybx6;mP=&Mb2cojC;DsJ2jV2< zJ5bZ>W>3`6Yg?wnx}y`6HepH>lFqml$6ph0fO{fc(mzjH-n*ApOsJb{ znswdeow%Px>0$-u50P=a99m#VqN+w+`j+0GKoS{fKmtXNbsoOFxgMN3s_&C1p7m{S zmCsw)^2{jF9^Dk-#)*A8tBl9+$L&-Sv#o{>6svHiLZsO5WZA3T^TAhI+k||B+q-IZ z#%=+8+XQh|Z}6ds01ZooV>(!RoM6PpYeYvHjkgNaF;SyvB|0!4#pjV?gm@g|L@dAC z|A{SUclos|3#0beGpd!b<2Y5%Un`B)^(#|PxBK}+Wq0xjtxNFW(S@m8W*jRdoARyb zmwZZ~O_ExAQ8J5`WUc$T$%bzMKo|UHCwi8<5{k3$%8JSxY{_de2v_gJcFO-w9#IJ> zfTFC+xYNiIp#(dI8U2-t3hoPURdDmfm_nFSNXmW;ThsJU;%J?u8qYI!+%{1j5B!GL1C#=t z5(wE@e!NS>ARRs0lUsVPG}S^CagLhhV=dB%(#*{e*VIMzN{&6Is+U;~OQB{rtUF z1+9!nl&qbV)pRex9NX^}YrQv)YHXda%##{ie*gU_|PcR^0c2UYZ6gG&4*aO zvFbw{kyl2+hkbt^V$(5j*~xKR*C>}&NKP#w!t-?5^}L^TAUa3hfF7(O5?B=C#tOJZw+&@gbQ*iNMpkfj#&M0Gv`2zAfD*zKojLRR}85D3k zUyFyBRGO1>N&cU zu_9j&}$$`mREb$VG09&4p+ezlgN)kg02!IFkwtHPOF$QdI1TjLAywLer; zL0gOvtxGo@aG3l0cTT1Aa}3;7bgkt85b%@^M3;8+@(;}WtpM2EwI3@!DbWQG)Dh?P zYxNm?^o_^jPJf^;mZz>0i!S2S$~7=ExxK%Mq_3+|81Nb(UE&kx)?H(@R=55%!r>0Z zADJmKD*mAT47&}r9`O3flr@B|A@hu-@X|bZQ*r-$L{LypwHj^5(Ag==1j9<{9+hZ> zsRgkG!Dmt=2Mp3lsAvcTcy)?s19QH_v}_^Q+AQv5JVVZ)7cXo?C7~_$Fe9MdQF$=S z+3q)U3m#^wTpei*PhEQjX3VKbguqms1~MxFcn#FK61*c#Vv*$=ug^(t`}R*WMm&EO zk%AFiAjUuWe8eEe?oOmqLlJ&r7-ee+!oLlz2gmHxK^2tY!-5Q6Dy)W}0Q(&i+02N1 z-mHRd>3jtd`WK}6j@q?T8phw)$TN**1j`aFzVzwG3e%yp>u9p-eIzuU*Ac|yilT5^ z$G|fpk|zlcrXYcmyfd-i7*_c0GqF7LnxAY?lQ8muPNm>>CkJhFL-Kgk6%=2BK%pOP zS0oX`qfcq57#RoND!vSQCY4&GSAW9$F69{E>3+gXX`K``G{n0ghr@D#v6Pj37c_g52D0>^1AQY({?mZ74IwC zWdxw}LuFn(N&>%wN^`wam4JGiS!F*4E{K#HtyPK8U?3J;^O7$vp9nM`$#^6?sY}@* zD-=OrClXUBlVIXqq{3;te*EQoH}e@^-hwLBC4yLM4yj`R(4iaj<;3Rs z(I5DEWb}mdHT4Uc9i3X(%0BX1+7MtK!ESIL&=5!sS23weIx15DwyWKJZPDP(F3o)! zy>?je>&+dHEFxocjh~~!c4%%a|6?i&iM%JLK}sC(-Dg-5*~_k3TWLrLh&d7g8@T zr-B;>F)UTYcVl3l&a*)Zjxe$#{*a$ z7efR1QPz-R10SzU#>c_cG>XEP ziTeseN`|?=Ff8D)o_J`;EIO<$EbvAOark-(;#NBeu^C!n&AXV=!8!c}YJo&p z*uR=Tz-gG1K?_eM0o6KZ2XB+R``|8?as=t;4|<{>D#&JAcFck_R^IkF%fo7s;I31~ zE0ATD(MrX}_;S6F+ghr#&c<@nh*LT^JgM$??GxsyaLCp+Ao)s*CK@#4v3fQbD)MPV zeijFzEvyFkOb^kZSSZdF@VsTI8YN8&gi;%>jTGV0@hvO}TL~{solKIgE6;-g9{Wua z9|315T%{p=4j2mQ)K8nkR0W;tgIegYZ+y^IG;cUA0jfvTYmWN!fb9)EjTZxQ2`55UiIREVA|-1lranP{e%Jk%!q+mXY-a=CZo`1lZTD8~ zCgWCg1_hcw^o`)I5&z4-_%ehjrQ1{H6=?-o2@pDji(`( z?oDMGW7ID&G`yv$gnlq?f6&l%ClH(>l8UZ5@)i0#Py% z!M`IwQos>9vUr4Eqs)SeFTgy>3L0|C$LFFe3t1Gu4{5=MQy>HXY)Hq{u;5DxCPpie zm|@K`MGI)13EX%*O`Q-@+pGU^Y1jO^!x#nQ8dNdII~%{ zUK;w$zKV`P=JyA$s{6&07q&<7r+@NM0ax7qd=gfT$)4$u$@}_&8|)p!CPR@?$c(2= z%IWC#&T9j7SdiX4MT@)^i`mY|FRL-O*#F8zMu2&0*~-tDn@3D&GK=9#s$#(JGt;Aw zVWg9awt&g;`=zg!$8U|y4rsp;RfK1I<}ba(+M`AhGybyJW0=fs*u4*sqWo10`%1fi zgN-0i&PA4K4hKDNc>#Q4_@^q0By@VfNEE0=shtQS*XyD_iyug0 zJjno9(3Doj8yo~3Mk>?gF0t!$t0kR`;sPY7E1D-QkQhwaDkd@b%KFzjy7d}GbH9-X z^>P_6(qk@7SRTZJ5P_NG!uwX4Ru_zTo{d7v&wv+stD2ZHbBZ+MA@Te4x(|}LX#AhO zHjt*dcA3BSRCTy0VE{RM2M5mK^q)F#7&D`eBQ8pFYsi4bLsd+KCt`|72@+-CQz5SW z)zrY00Sjf4{u5fOva*FeMAd1*sj$&|fa0qmfr2XviY*53Q`V}E3z|tQ#nanTEBgA< zAx1Ob^fu4pmlmBmc&ISwP@lN-o(v9DQWf}=-`Xo8JJ zp#=Lj_e`KT?aE)^qHG68Kx)72e*e==NbiXJ+X(vg@}o!`KnM(f88;{Zgtq8Fwf?Nk5f(8ZFy+^u`bRWNxYx3Tzswq$1KJMG|SJRdMwH%|5|!XlK4zHg{kYP%H<(v7*5%;+64Y%`C;1ea(IhdM66mk~P$M zMTFz?1+|$&goTKZZL?gnHW@#nijGdg0FA_&l&)ldHpic5D@JB-uJ)Ubrn=nrA}`;a zPtR+p(AF#IxNVI0p5H+6xudP~PIo=GBbVmxTumwFhB&9!JO}33r|}u!@%u6)7&?6Q z88mjTIG7cEN9>*Hgq0lw@v;F%-AmT5+9s^rI;?_NjkI56BXN+w%923!gE$}P9$BBF zJXVlirEjagLpC4i^dn~4-0~bZU5@iJmzDi_Xt7IULi6!1;GdrgxwQM+jztXIbe)$x z?{GkpyFaFip*#_o})ht3!6C34(LuT?o2;g-`e2QTZztQ9sImh z^qfr%5~j|{zHhnlZMpFg@O<+4Rd;cA+rH%<&}3lp!o^AjF!A0ydVD;adPn5xao=_) zx3gOPLb~#?>QMry7D;_AeSvGw)OdsZ%4IvaEVI6ekT(W?(FZszAKcjU84_L*!w<%6 z1Gdq6vTtKeoYR7%Nox!0FNq=K(%{ed7`5xGP`jxabHGW(X;0y>dzBlLg`zc)8Kkd> zIIOq%0s8H`q=vvFwiuLo#$n8V1lJl4*wo|LE_c!&{j7Uae3st;-cHqp$zXuVacjQ> zrhta%%LV~L{;5cOg9sHi9i`SDChZRi>7a`dcF{aXrnTjZ3Djp+g)bnyK}<*g;v>*w z4>k+HW~HEZwm0vj*An60bg<2wZ)5MDsfx`YwN(dSSQgl|dlV#x&Bstl+mFp<)LTe{ zv_&3ga{@7Ch&3OO*M`+}j5th;Y_+(!fB$KlW(-n=mMao#HqhuVIq@+mq z>opcYeN)X#A22|GD$m0nO0CnmF%|2meVEu+fXc0fxUcVcol1neD_{_!YWm6ly-QHP z-GePqk3N|v34%xJ$@4gQ<_wUMEb>}v!GxF>S_+3?Q;-y0JrR(qz$KY=74Do71nNrW98@TUZ`F_Zl*zZPpVjgy5z2U2u z1H)6=B<2Q1m&$#e+Rjg+*MzWRvErJhNAM94;Ol?CB=QxA{voO4`VVVcw^)tpxRL9U zk$~sQP)Q}KyerdnpOSmgECPoo4s*>z@lD;Wc=5fs2}g#X{nM3UG|tV>$I2%c#Ofyg zyb;jz=R`_x3Mi$BiIwqL(ojWbotzT5hsc4~KD-#U^+``;@I{D8+ z@g@zUeY`2CT*w4W5q;adR@g+zv#k9kk+4XRJ{K zeN@Sa5=>0A?iOQ#%x7a-yfOH-2V-H$iz##2Xhe#T)1gLeh@0iuxo+#K98F`AxAvv$xgaWTxH;db-Z)gms(n<(&)J z@ap|%KPB$$g;&MO{BWp+In16=Cfiz=ILm_{9=-v>b9qT&S zB3;r2QLXBjJ#uZ4X1ftO&|=>YEy`3j4^bhHri;ex-K8lgnf^uS_(KAZ_~H5mjY_aG zkvHX#A*k}@?GQNZ4^HCC2g^|*m2vQh*^Yh`77>EswzswM5^?`Ck*2yQosuDsBqgYS zXStiv+*4`^#?_T9PZ+9gE-@6C7Bqa@NDem@LDZfv)fc$%&cmWEStTroQ* zys`HZ%=t*V)XtGWh}q2oHUIZ*lJEj}c1kU!~1ZlZCRF+fmrn9-7UIrDmWlK|Ku>%ngdAkqRmTHlOp z+I^SbHFJzMF4^wK_h_!^9fx(E1CMp*TO>>Wu6BlLXjVw?HBw%W?l6B@kJN3GNVFB< z^cnL+o@N%psb!hZzwg#0f_w2gx`fWG7m&zG8+F|Ds-PxqJNO7}>eSImGIVwt3H3J*XE;(kbpPAuflw=|m~rh%-b=*Dn{1Ac0ugr@ z8>+B5sDh$F;%m_=y|@Cy;dO$-SW&0zyWPmr@N*Mi0H$I;Z*QqFK%f3ugAU!YIuTh7 zAj~slgDvsoKB?&TBof?b$=h6O!?|7aD%V(D6UZ8aq}J^4+3!Eucr1n|MTlgoruR@&B(n1kb2|!MyLiShIn~mFud&lc zfi_R-Sm^2QaO3#-mo3H0UHRS zks;(GwrKMVeK;D@l#8M`^ZLhG;T7cXb1i&m1yC*E5L+^t^y!?+oC4+Ps=15Ri<06lfty1?YBV+X6Thbq%bKK z>jKRjmvrR`oO9M$p0&GKD6ccnf4#f$wHe?;&67K|IjBOKwDXfYWef~!L-7!2#>zQN z&NpUaQ`KY-9R#;@v89=WiS+&9E{2fW`>*H+Rq+1SyaDg;`K06twuoWUT9Jv+?xI~P zq<6Q-h2?=G*sWWN^ej-uHCSzUY4{ViG={$KW`XF$3you~jrLJ+&qNP_#kV{-Ie!lM zhz343RcxkQ8Lsg+cQ&BxF7vZiZ|-oiI;EklF}3&Bwg@C;94`RO!}QIgk}Bj38jF(T zP~0V;Z-#nJsc`7qO900QExC#6uvE8ezK%QD{c$u)^Jz_Yjj`tB2V4U`q=Q_6%hGTcHVB;E=+(azY3X)NTLD5uT*1~X6(On+yPr*wX=N)9o z8hD4HcjI9oOzL;Y1X4LxxQI$3wNgO*mtiW(m)6#stSEGgjDEn~DCXdK>TXIs*n4#J zBTeO~|IRVY;4J%7jAHJTX$Y%BYgPFPDWSNJ zACx9%z{I&8gb40X_EJq1o1}mLV=db1mkkZHVTK>a7oZTiICZ4c&zshL(_C7dVjc=t zSjK8y0;*VAWj!$h?=+gZ8x_Ux{A*LL;K(_L=Vw zKy^STH>ej-K32`RoKWKw-(iLGo#Uopy2^PzzmFEoitQo0VOnqax+Gr#39x_k*yI`} zug`0BNNhY*zrW-O1hRhW#2Y#$(UH_Ps3kxo#SiAnnt+mSAzEb)$DWqjA&%v@@= zWf?>sj#lkx$3-N7Oy#^Tmt*Ph%37in9P#4%gyj%H@$S7`@F6A3YpL-59nYg`@|d@Y zI4=##E1i&;!Mm(t$_Jy*`aF!RJcKm*3_Rz3;GA!Zprcbr91?DKA;s`1Do`BAXa0Hn zjY_=y@xhJq(*P#DF(suIx9GiSV=C_@$8EXfT_@G(4-_j6fX0`#lGv}6xu+b z^`ato7bgJ2=8u#T#KoO*|3dEP+h~2{R#&gLjhJdJB+&IaSb5ZVX9gY);z6R@S#j%o z^>ZJC9mAhLy}M8pO*$`AeIMA}Oj<3+d6Zz6GpoQ2h5sUg+Q?V4)b>7_ej3oC~* z4RPZU;Ouz#HBXyQ{IAg9YiJvU4AjBt{>cE^!}}MpK-$mD6B`Gc^y7zb z`IqmeZDFg6bOa@rSqr6%Wk|ACvhO1N^q%uO=l93&{&mlJ?zzk7-1B|z zJ@-E6(G!a6O$X?y0O7N?jKOy*oOpW1nib=!QsRK7xvOh2MvX6)A*L$a-+x2CUP9r0 z*Z6)U%im`!9-ql?wVeaZ%%As=bVti79LCy}#>h~}Jr{v1>sNfN zLgc=p7v9n*_N-i>zy2h@px*O-h60Wk2gH~)E?WknmczYUK6pRBbq3s3R1cWeb4I+~ z*l8YJtxv%sk6p1bN-6Jjyo<2VsqKTqgyFl#NR%YR%KaHFxo0-yO-5%I7scIv9MLh@ z`+MlOQP|mEUjC$s<8I^F^r61+=J#JJg8qFVfLfc=ZEZIEr7fHB6+0P=x{G)sBn>@|U~FKd4q4 zF0l`YPgH)eZ+0JU(YxK$n(Qyp7_CCKk8=boq=T2IS5=6y#p7jTi8YgNy!j~Dr6AYL ze~6HVW&~V=FWXWe{N&(3rFPjvZIhybuh5JC)>AOm#ooQJQp!&07%Y)k1ib?>zCZ6u zn=E!%qH&RBXs;di=f1L`^i?o}l_@u;Z`g~*Fc64EYhAhFqdPGfM*AR0apP-9;r67x zJ4w8?KfVTCmG}e7Rx15z6GDHq{)&ywQwie2)6Mnm4qI=InDpV{#z3HqX4(E8A0N*+ z8%A&szhNXT%E8$eo2-MzO;?RUEvV|R;kBLsmT+XJY?cM%X?*|zKMY=@$KG}dz`XIy zQwX`=5D<~LekLBAn|*%tuk{~J>DAi~pAZX%lEmC6?W*a%NK~^t@hA3TN3A{Mt#_u| zsp}r;Fk4ysocF$9nU8|mgWZ%?lQekKQwlHp%0oG`Q?l)zs(&Peh{{ z1RtSiS+ApVw?477J9s0A-+8Q||MpweNrx)wZCgTrBrT{-o(l1|1Ii0pD*UDI1N#wv zP4kzhqFkDRmo%cr738uVKzf_~DEySWhdd>0U-p=+Hb}D~w(zQH=49OqN=Ys!j{`h| z(WCL_jX-*~-BKjS)+*`@#6;k_$#OoIrljL|>QQz8KP9Ri@_I_xDX#kA6{|K^p9%@0 zG=GsXnUXyb07X)xm8XdMKQs{Ve&Z!d{Apqx_#ssD>a}<5 znqT*|%WD0MKv|$C!uR6ziO6xHr|1yD@{u&7*%Z?~yee_B`l_-%(D&P`acr`^;L42m=4&T>;+f4+n>VMh>o>hv>_Yf z<^P?vM$xV3kS}27ixtp|I{Br&=orQ%LKwquUzTMgwgiG>dRqnPtDF2$wwRs^7EoGj z^j4j=Z6(|yugvSLn30l5c`1EWq+_+6q_-OqcmGPL_|D*s(n@JX@Z1+5=@DyD(XW4a zw||t;7xZFXeF7y^e9yTHm*3+ZYO0?6$w`n2Bk#-cIOD%ppbB0eR>5v03EdISeUa;H z#f($CtFx%7`{JJyN@sT|*F~=ZW%nRYKRhpmxA*hi8C>71{LgTjlLKOwQw41-hsM2` z0*<~UmOKI4GQ8ux)>3OGsz5qQrNF?WiiZWd>Y(1Qm^-1G{27`mi70@tp@TkNs1wAPMxgs#O2>97?e~AtY}{{L2yZY`kgcS) zOx({Syv`3HylrE&O!#kvm#LTpQ=91+itx;=6?oiKJu5~sQg&=jU*^#z9A2SkeXtFc zUg3qn$C)2#1Zl1>vm~%+G2#?l;QC^#F;#g`TaiFq?))F7Qe#jC#5<=|hrz`caMt=c zKA&4i`0QH(c9NvZl|MEExKK&pD8x|B)hTQM(%%~dL2b?Wp2|wwb#{{{LOL_pNkyi% zuxEL*#q(9_bX+5y4yR|=KbbRHq~8%i{~7`hE}iv|es2(1Bko@wPy{p~7PB@D~T-CwLA4N|l2mw)dv1;+=?+nkd}28zue zMkM>P$J3+pG?a+>=WHzJ?&(WDD`uGttvg=bblTeWrlQiN%ii}utY|XC;D@2W5N3}< z2OXt>N&h_G17%Z&kMrVxBQR0=tBUWk??y}k_Y){cgjz&4$tebO`P9PUey+Gs3wC@a5lo6-9A?b|kr3vT!VskJXY-N}Tt z+;5u=^hT{iR%zw|Ky9JPgc{|-)6xm)_q_zmqFudUN1xFNsg3OiR~lnJ4JgeNM~_!N zQgcZT8xze8EH+D4Kb7fV#vOcH@3KRolG|}2Xywi{SE?|J;MPFMcIYt+&w_CachF~F zvY0BC4O1z2I5HGohr-$E_7zc;Rw70oGfgQlISKzdSHVxI*;bGZ-5-1N!O0ysH3b$w ze2Mo0LLS<6N3UpEFbV;gM+HwG*c%oNHGW<)wv!NbLlf_=) zygbrU%|;C$UcQtUT25MUpTbvEChv3(+y|4=>+0!=wInny7Uf2H5;_1;zs4sUIs?Wd z*(t_plAgZ}OwZG;7)oyybsIe9E4Eq4W~Xe4eGc%P*p}3up9AhwfGaVA)|@Nwr0@)J zHhyjb1EnfjwKt{J|CKcYMRJ?kGe}?}4f)8iiHulj+DzDAo1iKG`&wbxsnrUa_S;5`Q<#4yzF;U=?hH)pYOfRp$%Nw#5#0L( zv!o-Z-*a^EUnrpS?XVt51Fac4vy(vIo~JLVCz1aQQFR}?w_c2-cug%KyrpC9fQG;G zW^y^)_c8M>z3hB8w?s3mvX2BYB5zpOTIaBw;n0w@;752vC&Pk!9Io_D`_cRc*r}h{ znQcjd^l}&@gANQQgy}2{=)#u%jj(<*R<;$V;qz{K;oQLFMYGi|Tq4U{dr3!(dm5tZ zP1d@UO!T|ZrfQn%fj-le2JRBHd`{CG*wEv}E5E)|G0ks$^gJT7;&-gn=ghs8M+3H< zPX;Pm1UHe3*TC-N&s5~wzz?=0gNB(AmHg>#R^=IY6Q8&>AK9dQ=E^wO{0k!$wdy%> zd$BJL8^yUx(8{%QNSt#-U*MZvJb8_*1NkdPo#%tuSZMy|5W9Bo?!ioTMQ zWrSJ7?jxp%U0V=6`n7eHZos=67BqDA=BwIZuD*e&6!n1VxfDq2e7jqFFTws{#g^l( z8fx%X#$F5w(V1PU;QKA<2vOQ35R&Bku}`@jciy{f0BX?P-ssx)w}6jvi8 z7GAE6zKSn`i`sN=I&E16Ek&PPZ<1ocv2jeWhuoJN%&FHd=TRJ&Z_!R79rw7h2vayK zsDIFJ119e3hr7JYyuK4naee}MjpjBy=4Ub|m=BlSCM(dC*s!APFbB@F>%U}N)*76h2+_8>WbUKuqEy)2bZs; zFh-mwHqb7zQF#Sx3ya~tWAs9oJ)DJb34Vq^gdZ%;VTU;s)ACBy)rIPeGfYt?9#6Z1 zO}4P>l%PmfO9iqubG)V4KATHzz; zGvn4Uo?^dI%9EGm8*iH}22S=tN&Qa_im#hWq1@`Cjv>h1Q{-wAh1j2ly|R}1>Fu2} zRR)P+W&8f+>m#9LG(Www&htTg{fJH?rzt$rU1-n0|fq2VH zKraUuEs#QGx(gXqIx}DI=jmDOx zZzp~TYVU+Cx*3IQPAHS_MC!`Kwg)Hhp!}XKO>B2aaXM7dHvZ>iVF_ei`xNp4+zcxc@vMfh4m;t7dMO<2cJ;>wC7$jJLRitp3mlCmJlP)Rhi4OY*50h zxfkV;2v;OGg@4BQ^T6t;0>t&&IHxg^O%ulvl7Bi;4n!vZd)5SM?0FvY+q|M#IK+t^ r{C_2EJQ@c1W6(Mp!I)V5R|U_3x45X}&*bRsKNdqhGu=vUT-5&nh9qPf diff --git a/chapter_graph/graph_traversal.assets/graph_bfs_step11.png b/chapter_graph/graph_traversal.assets/graph_bfs_step11.png index 08ee4e9d07c31ec720f2ba509204466a97348301..74c1a9bbd0a277039aa8866ce4067b4909a07eb1 100644 GIT binary patch literal 28198 zcmbTdRa6|$7cD%);Ol@(>skcp82005ettfVRc0QcU6nM4G=pC0m9Oy4_C%3su^ z-rn8JUsmV{rlzRWqp19{QP`kV&dPwe=Le)kQK=N{r#s;pRTU1 zo}Qj=Z*Q-!uN!7N)Kk?&3y$&pM{-AVHqO>F2D7I&SL}nRR?C&$Ofhc*U9MMVz|4)*u=D=RC@ z$IE{H{Hds@SX^8j(jMH{*ccujuCK4Jp`j5G5pi;JGQK^|^=-Vmx;i&E*V@`Tu=SUD zp4q?WS6$b|qN1Yj-@hj(C+q0wDBI4*bVon_dnj!@K0G{3=#9U7y1Rb3HY;CciJJU7 zRiTxx*|2yX78WKeEBo;Da(RE*)_)!y9qn1^p{lBCAGA_CSF>=i;OXgkarJLxV>lrp z!QS5f_VFcaI8)SMs%E;{rqKG|%fCN={!A_2#OLo-R8(y4Jp?3eR(G7J-_$`BL{q!^SR!{EtFZZEG(4Li^u;$-K*GH?zE1l5J*2UI_*@o@2t+Ttcn4Ud} zv^k-~sXv41@$vD&!NCV7kIS3)0~=StsawAB8^sevY2B%#vo|?ahml!3uHkFH>KEnH zrW_p|Z|-&!}KF8Ilwe6O%uFoH=?ty?+ZC zzA!9V&K=0{j@j__^_^ea)+vNe?A|05?$wX4pPWA>_V2e&ZH%9Bq5uHa`*M)Wn1eTDI;WU2MA%(Ncd!Wr%x zZ?EG=3o<74i;-oOy6moX*nD9<(2+Xm9ud_W%r>ncsl`hbuVrwdY_eWW4utY^RTvu0 z7i`oRW*21JxcdU*+e)hI8|F$H$i{zga9K(0J5apIDMD2e{0__Av*M^0ais(CiFP^+WX5AGJ1QI;x(nziH#pEDXt@Tc!RI%vj$PTc68~7 z{T;++>?KkUF5^kGGzF4RL;|mj{o@xkfNBYEo271W3U1p_r1DypWU)MXD)k|l&_$WJA2D$N=q?93)#pQr zVgMsTxUVgbQk@G|$gW_Hm1gyPR3Q1*clB>C)qr`qJsHp<)Pd8RL>5=rS0wAX(m(V z3-qOl;Aw|E-pq z5(YkT^v(gzfekwj^&a~Z4oDWsXfWq00iZ#|(1Ahd2)Lnd3H@owrM?`H%N%N@4JGX9 z&GK;BCwfJid3JqA%rl&qcGGXS(*4OxedmLWP?7gIPH;XF)$TY_g;W#sqHNI#`S$J9sf*6@X*sAGmjPuL> z@Y<*OoHomhScf8ki#EG=HwJIhf2$N$!yqNhrxKcs3OCehvQpGWSb4iVO?$0_d|x}n z8`inDf_A{Dzl;Ixe2Tra{}gE`yaDnwB7jIn9Al*4)HL2~;6}&cLRic!B9yHcg@ZWM z8B{*7owQdaSoK3#4WK`|H-g!G2;}_nqRROD=9lAvNmJXUNu$BVy~c8@Pi0n0)oTVZ zr~1;REH#q$i*f+>K>&v#F`Oa((dU?zmEUcq<-{*LE?{0FRDKV2YW-344c!dXxCPTj zgG!8)SyzQEtz{nssU;C-57PAcUe^XsE@zofKS>`D9@Fa(Eej;VQ&L8-i%t*X!)<)g z{=ilZr0_i-4KD-#g&qL4#d?#@muV14w>O%{V)Ds;jG|{_oSgA)EsQ4sPgHI)Tsx}s z%Mm4_OlGF(IHtK+Ofnlu42N0TIO1`rBRr3M4q8yH&5G=Vdx7QhFM+UC3Q(}#j6FbZ z*3I<(RWs^JN3`T$AsY#~1p<3?FB9hsd`wvrE{J~kHD9Kr;3X>dlw1F7a;OjE>(xC; zuz<5|^t6ShJ9NGWr5`5!<-=i&Fdx!}=Co3!&#F7XCE5qL@xdy~y1#{{lczKGgi@uF z6Z^Xx;1lL4zmIorsFwXgGA=Vw%X8>MT5v12#C?cANGPpF)Qw{$Hc|#K;5=L*G7@{>_mofjr=(I2VXCH+Ks!=(kf*<WfLfLk4q_);_d z%Z2XST}C&*g;6Z3_V*ccPIhP8k&K3!<5v!&4fV*_jpb{4@U2^`(K6){oS@?`8msBn zAEwzLS|kHEc&#HhN_pNP;zER~FPjRS%MrJ7N$bG%xJVDCzkhR2K5|Z{G;^AK)t_w1 z&*+CCa!pB#NSrs1PZ60}>Ge=*-pnn^b02W!iP1BdSLvCjo>+5SAsVQx}iwhbrT!?#S3Gb$&%NcB(dnaG>@9=Eyq zBE6)miW1F|85IxNf0JZs|%-xKV9>wfLZJs0DV_)M(M7qUV;q++_^CrN?QA_lM84#CGLjPj@=4iB|G>d-wG#z=gx|w*6 znVc5l{D^%6ZMDi6&{!*IA>(&-azIEV9Hd-AXUEO($K)&GHbYRu_ za4ycWVrId&j=z@mee`;;fLOL*t4yu7ODz~Hl0sXOTs;l!%!{+d#^N^V@eQZ~8 ze>FYw9y3{EzIyf>4Bk@d;7g?*{-{SxkMDhsuWVZOcgfBqA`%J9 zNJS{>>O;Qz$iWhzRAKp>ZukMLk;^in$rNE#JY|jRi5YVrn(Rsulvf4x@B`XU7+(IC z#Byf^Z)S|_h-s=ae{+Y7<5noG1QW)Dg~c-Sp(LWoh z947QK&CCw^X9wK_0z@!=@lG&qoL~SfgOR2kSC@$Rx8<5#CpF&6oYKg1eefEs-S zEl%k~rbr0`pv3Kur7S>)u=uOOGW^@W3pKm+hv*)TyUO=yT?kUH5c(qKlw$3$BoPac zo`>SQP~a397=|De14zX62WQljGE6k74fl$Lg20M)|FB%Pg`1xm-e^~A3NE|C?&XY! zA3(&F;Y7RduRTn?n*loOko-V2O{Q5498#MB>eH(V*H__!xX}S!tpVWBc}QM)+aAFfjwb zyMDFxqn~02uWBhw2`R$6;BW97Ldps`@-Afbr{rMwLp?#e?|{1lREPS2GOyUn zBL0TSxB&lNu^;<*4M?>7@fnP8fTy?l^mA8RN4|sC%<39uixBIQh{B}s8@$mFTnt*k zWK>n$sx% zcCcplOv&U?UO+DJP>EE|_N1F(_sxIgX_taifIH|Ve~s<2`=;nx71V>gH4Z1s)JVMG zlmVppSHYJK^o52>CYei{WuJcNb7MVc+5wEjcF`j7{Mv6C&<(6YdUs}sDfqYKj^$=l z!+IlNUbCVo^%%o8=}YLj#N49ej1P&CFM?8W9m5I7AtrxpDA^?!TC|c#ix81>#U@e% zlI#|K_7L9_Ve*f#kbBmXpG0%Bwg;C)&zT?BBh{pX_KT{i=(6 zTe@Q3M=(j#y`DfyrdA3x*eaqwg9Su}f6@vDi9Qf%<+zPTFxmZn`P)m|#k!D3t-t`vcZFr#>ayOe zly*2`t4|7NruNRHcyoDh%w|WYAVF&RWp2klYjysR-he7MApYV_sLUgCJlNvNF)WX& z4*VSyYSRK?%9UH@uGamhaMmb#azdsYD==#IWo}3aQ-3SP!IB*zD0mvqxs5KZ?rYp* zvRLk8Mb@L=XDU}^hP)%wvr*UJ?e7oDja_S zzat1)0zP{-Nur_1FK;aF_@NZ0{A;a5XE0N5nf@1^jtW#(*IYpAi+YUwyi-gWP-mQ5 zt|7~e&-af~EB5e+Gi`r5`s&rt1L5X1gb8X|Z1P<9HGvf^+gZvp*+@kTWx`R-t&CC1 z08bNqt)s!=4m$CfsGgd$>5RWrYD@ISL8?COVRBNZY zJd7T)#4*IRCkV+xO|Qn+oZs*`^7LF2(8Hs zB(V(n)~u>l6h;F{Wwk-_hE(vHxUsclvz=q1lBa2?{?lwf!m*>k`E2*?^P64!>+0WZ zgA+!_oMwM@xNw8gCU7`C%t>=Ov5MM=P9QKzeYk#w|GQJCvy@9T*g^KYC22Z*RZf;A zr4N+u%y0VkM{~B`r8#J1>2!ipJxYp)@$dQ+=sllKg?mIN6nJI_FVCZe>OK0>g9MXj zMV{_SMm(Sa_xs;9R~?q1UHlt5WbZg@q@N&R;EFBeo1+L#iPuXBf08;|n2B~c2c$HK zhoF`-I5dJo-b8Z%`LPu>=Q4-kVUeF3?T24i%*@@bI<#=@_41bOft*0i=IgDdr;11- zbC{8KWG-P+Jq-vJ*O8-BvX%(u@#9la?8YSSTCcQsw1D?G7L0(MpI^pf-PeCNJ%(=q zZxv}(&jQn8YEdthQgg>jksZu(+)p+5=HR!bPws1lIqayN2t% zOaZefJPmcP*+l}g0a>i%a6(BUAr0%_XGR%5GprTb8{x76{1=g#t511E4G%=zX8fGbApj zI_=(qUT(7dlFiNgzcl+PVR6Sh{bsD9$l8*CW3yp}i2SY9@9@cBt^4X^!S-daJD)^d z!EXLMOE7?Jth*w9erP0_P3bT2_2b=)?`yo3qol8p>Vlyv68Nji+ByNVhjwjFKr#=( z#`(!|BSxpwil8@UKTV0b(Vfn`fJB*HEx_s@oq69i;@&qaO9fmIW9XIyy_>c((3;t~ ztGGx&ZG`kQGN{Jk%vTQfU^2;CTCb`5@l#kfiwbHndl&{@TX{2}mc{uZKrY&uKB-zs zr_o4Ko=TKb=%cWR;@qLxA2pBW1j0wMoE(=%YIC*rO3hY-u^2)C zWUdP8GI7;js++qim&nRE;tE*YQap#W-U$*VA;@dgayEm^^hscU%rB(@GX=s+%viA6q3)k}nHEU8^X;4REZo|HjVSe^i`Xz@2aSl7AKf-Npc(1mmj(=VCGw|)JVi3ydcP*Qa7htv|mB{FKs`#KdD_Wn~oV8EjS zYDm%LGb@b2uQ?-YP;3t^ZIdLXpM!KpBSto&f_ZyGg^okFerg0f4Db36ntD)a6;D|3x?R??i zZ_*zlD~;tS?Cdj1p5L`U8p+EuLO5(G=QkAE)b9%Z2Irb0#n86{dd!Q$-OBTB3J(C( zT@3uewqcd^nH$RFDlhc@XvykT$Zhtnn!(6{+9Sj;$K?U6lMZo>?1R~RFwgJz(P*>8 zfB4lCLMxXcbxK)FhE%|oZs(bqWjx`!Jp2z<(qZ(O0HlC2PC)Qu0@JJ{$xv{T3cIbb zR4Be)R}OLZB5RQmUc4+^fH*@wSru{^dfW|&gCLvrYIX*rKdQztDR!XTJ6MBB8az@= z`wt55_^4i| z4~cN?pm{1vLO9K8N=euzQpPx!6v39!031X|;xw^He}5yEkzeh&uGSFw|BR;buGFrK zAlnsTb{=W52mqeG)Xc)T7*!hU!-5ULfOxe@BV-4fYT}wN9I(n2tRO>jsR*fRQ$zv9dg+sHVr!5S~sB zA&`tCqoiW75RShdZvLmbT8vD|>#+$ne!^G$lTA(d2(xyX3|u>zh=7DBFGrlm1dIre z5ig`CO|P=JYZmsO?fbN~GLO;L?jO#c{Zu)w*Aa1>_@J;^2&f2UO!HOyzDTW}m+PB4O z3G?V0a9EmG3bU|y5@e)c#DlLR zFFZ>udbo!_iyR{*+)YC+AuVPIQ-k4>ZiPr3wv{6mVvKu3OLyo#t+oW`FyEEkUj!FunrH`}?qsT9A)CZheQ%HVD3}6K8zMKS< z0z5~sjiq2BcfsG3n<{ZED@sHM^KyxWJ%^Ycm<5tvs*6;2@isDqc`tTOa#!H;{-`Zq zu20u7x$VE5jbL(0PN8t~QP<;2DPZl039J5*xWuS`QR63-=0Yz08yO7Bf#*t^Lv7S> zh*7EPH4JvRNO84Zh`5@t9w0b3Dl%DbbRTMM_zE*?$TD-<+n|UQ_}|+_Gz=qW(JWB~ z>`m*?Tf=%H2qebzTx+qjtoNf6g{oi5gem?1fyTP;>yHh-yK$o;JBqN}g}FSsFzN29 zRBirj(X{+TP+}?Xa8fY|udMzZ+Y{WX+fwI|1>Utz2^`6%OVj6mF83~YGRJj^duw>$ zw@TX82>(Mzx&|{wl#4ID=Whi9cEU?(b1=4^#q3|)bK)9gMEleTexa8%V6H^rLDMN1 z-dHb7PE0fs>vf0!b-ux*uu5mzj-BPnLhFQ7U2+M#4b*G~DeFJMCYuD^(N9m^d4VF# z_q)$i)#syrcZg=f{usNeO_6StQ=5+cj_9qzLK!l9hN%~YH(i_3r$78AH!(n;JYRF` z8P<_lAq3S~fLVD#M9e5gpH&orlk8UG`^7q74JSa#R2(ujKu`xCwsbeT0F#itm6jx4 zLDm8osY}_T4my+P$e#+XF`hitio_(1#uEqnX8M7UbG?;x3WuSUSyY+8B~1ONTAo%o z%i%$8gOUimu=MQTH71jkbEsXHS|B!vtrN^fz}3}VtCpu8*zoWJOoDG(JK)Q{bbFQrl>YQp?$!cdpX!Q|=ETN4u zoEEc85C2GLm0R3CbE``N#ajB@|N9}x6L!@K+nbt0J6LoP+&iNSR$)2PV<;%@P zL>rvk0ukL>W$iKHyQS zt3BT}m2PZ_<(GNJcf>bUziy^pBjI{#8k=%0aE;5CNB5k0*dM3LaDzGW37qf{6Y5JW z_&bJR?r#_|Uir8b{TmbmVQ};chc{~AddH)Md2~%Mcv^`~-AKDAb8Vf!71PuKY|;mV zTl8A7y0`qLmAcTb>KqzrH((pOU?SA*K*^ULcR1t-$c6|WsN*+jfIN(+O4IjjGUIyfmRy5b7uA$~SyKA^XIGdhp~%;<=sJH{Y0&I2rk;y zU8deI^0!$&RM>VV_!;j*zkw0kDwx0LOQj8TKry`lY&3|7?0LfWPcrq~zK-O101XG2 zr4}XDa`o70EB}ARRiN>*b@fY&a{nV+-m3N+zi0x)RsnPn0k`Maa&OK9@*Re8YAfXH z*drAGhnksMua>(CrF*daPZXg{UN-jWQu%4#e|Xudb#srY*4zN^znXiZD#9{TmfaOV z*{uYd+TUO5c6t9#PE*F1Stek)VD<5T5XHC^78>EwAcw)zVN$Iq!}?s7e!G`>fT=bN z=)q_nKay^R7)+!1xMnVxrH{@gOkM#Ttbv7R|B@s))vw{E|E_%G4~7wau0|cymSUY4 zOtug5uy?Mod}*!swE?*O!Pw{@rXc>$#~;sGS8gryzwue^|FP)^9~%Jr0~thl0_A^t7Hy^(vIL>U)+N%Q zi_aEJwVGA#ySR%x@Sch>`@-6wZYYw9CnmPOqjCGm8I`X zGb~8h7efDV!z-b6uG~2UqXqjDhn$QAF2N z3ro{}Nh2@PPw~NGLBxXU?t>I)PB@B<$&nPHvySN#)gdZPU)*$9^Lx^#_obt-rf!zL zaL1qihXD7Oz=`47bX2HDDDD!G+h^wdZ8(YKU){)vG-e>0kR-luWKZG?dVUxCIEm!9 zsOqv*&MnL3k^ZnBV2aSFfCG+QLYAWsvcGCfb_j!EM%>(j9hy$fn2gsD0w@GSLo%Jd z2>oqqqovw)Xzz= zKgD)cn>R!SB#TKVA=lrRyxCxz`kGTfWb&rXXJnthxN1g?*bU=!4e3kn22<8FJYO0z zL?)ZZ-_wn0h@V*bEqT%TQ-mr~Eyoj3FMp8jXG9MGn!nn(g=Yq#PpU4_UCVkyV5j6( zlsPTI$v#ArGJ4!$!A41uR<*8XOZb=w@5$qo9|drPjO277ONV?(#G-gCa=aq4!`Dw4poDW86LLpTqh z(4q!nYm0u4S0aMFKxvknWEkX1<3b5VF$(*rjz5%u@xm|$IexSfNvvT2cCc~}+6*V1 z{@jR$X@hCn@%g9<#@qaiO%V&{lBbv1Zh)F)fk5ZVLXkF_%B;ej$^xC}DgNcJ!n-b4 zWGfH8E)Hc|HpRdH6$FS5@E&JUlmPEjG=CCaB@h&{bC7|d;q0zWPaOe#V_|_2T$81A zYm^f90iQ7viO@a>VUv3K&yQb$u(GCs7H|*5 z&qC6h@)E)*5~K?HU@0)t>{d5QZ5Lpx$PKQTO_wtMM^_NcGvv{g46x>80P5Qe!ra)~ z+uPlvM2Z%Trgd!k|;J7O_FBeyGufv!ri#9Q_)_LcWN& z_Qnjgfx}JKtH${Vsdr!g=WTJjy1J?W26<{PKOR@Yrq{~pz|Ll*>#k>{E)$X3vZ>!0WfVDUcV98OzsG4o*cpz z^Qy3Vm>8_tt)S`ZIZz}r3cv-hL!tm96z|_1DAm-4u4`c#p=T4KR|ud_vgMZ)rq!*a=w!+ijlZK!MUuu)axh8yz2oda82qs zN%7uf&v!Y%6)e^AOlRK`f{mPqm@INK8I+3+9X&o?rDh61Kve{GcBaY#(1M{F(E0qz zM*>5N`zqS&WCQa|bXhhFS4@a7*oQPZw2f;Ts|+4HUAI0c+YT8&JCW}o#Xf-Zm=qH8 zAZ371J9@64FthnnocwxVH$O7v3Q_U6jC;KLXqB79k}k~4{-Lp(0-V;0T>G}DA@)AoMG)Y1Zt_JAsNwLmAwwW_>{m$eTyW@ofben=OJ zXIh~)vOlvrG3@Bly1%spNY-mGh=GFp&;E84h-jy{8$ywiPTrTi8zu#D5+w zA}9QHp9|MuwRwaPPxt90`uG_nK?Jw_F$!LoX_WZo325z0KF(QQiiQnqn#VCJf!&Ht z*$r+)@)6g^fHYVhRu2pvp!}t}3ryg}Kbwzn`V@%E2Y%Jw9S9VSEf0|whFOQ{6ej#z zMYw1wWWYU41lt5OnV%`lN%8^!KRLq&j$VU7x=qA3@-tI4n{Ex={qB%##BTTt5Mb8L z?JpIa2g#ZvqQeyhgc$Pm8<+&m4_oq|(Sel6kn^yyFl~e+TdMl#eE|+j4q#Io_|((W zkyyi`Semubmtco3!})+cCLeYSY#pPN%+{j6p9^xZCCZmpG@eu#uH-oe~*m*>-X)cRSHS@isJer+5eGlDXkLY9}Pdd%8T(5OdKy2J7tR zw~jE69137x`vAV%`NU{?-2IVn+Xt^6)wcDv-wX~@Ys^v#0q)Hk8PJ6al={=)wNf(i zU-cACtx=d1dcxQnPh6)yO0ol5b0O$A0!QBfKjZ zOH#-ep(u)?%4n?(^6dtj0Xi3p&h8h1dB+#8b_}A6sAwLSn*54>0I{kuiNEVJh+nis z8>jbjIHo$CU5u?*S1sjg{6`D7YlT?d>uggdwtk5Jq=AS&oOK`rt~xDjwwxW80_d(n zznGz9V%x6y77yzib&bun{*rN@tF&i3FBQeKgE0vf;3nLq3&)|5bB8zIn=<8P*ulPd3sUIp*%)tlD)Xlu-O1d)3 zQ@u)06hzK+cngY!!x}U*4+I*XhJZ2!!2@v@1p8h`oIGbblN7dJz2e+?w#JOJ?Rh6I zVoR6<@9P0p@zX!KkBsSt2cUygeV~GeQz1`ip&ej-r|4xoxq`a}23G8OY^{Bp|9x2n zcnun!Q5T*b#P~g0-i5MfR*P)|jEcdJeP2wPQp7sIsAB(xXg2|pDff_>?MHh?drX9y zyz~r1=}*_&mkZ837sF&1GiG%LBMSCi(7wj0e=D1LgY~47%r%2XaCkXH7K|e5GZ0R3 z5aZ?g^F`p-?8e1c&v4rH6H28#2kT4wW-81Cf$;CMvQ@9is#@OQyfYih;w?pByHa?s zH|>8FIT`rA8s5{tIr&OVLDa;$0fYjkPQb3uMW@75W`rg;lvi^k6?4`D%?Ss@uP92r z#e?|MD6y4K!EwThx^AS`3J(2s+KTD#`>s~-8@rMheiw|y$l7NH ziJHlg28%*spy^J`fEYyNE@}F6dIZ|$*57pZ>1}h)4sA&cz%&WuGvYwIxZ@2 z-2RlsFJy5ON^)}*(Zu_s1_(Udgpos^;YLyx^>X96<<{su?ke3tqi5@qXlODDY~+2< znAu!(p^pSB!kncxeC8J*U~!N<1nLH_>URG>5zB{g4g<04! z%>%zG@cA7MUC>T8k6*Iv-dcu#s6(9c!V-D27!}jP{7SVt5@^Y|-lQdcOg{68(8NXX zlK|YxgCukckcBmt)5{4Znqr9H5Y(qW>hX2&fMm*{9}R?nsaid;~_L0HmV0QE{|Vk4;HcPP5!0b;L_j% zA)|2S(6zqKRxITmVW|Rw`*< zJe=Xut8hr2K14d0_QWrPT^Pv*MT`BMt^DOq76nvxyI$i+OeO z$fd(!kQ#M}K1TTO>pOif7<^5#X%7CU0@7T4I@QL7xMeR3yL}-LbAV7UnEkas;)?OE zS$$W^sPn%Z6i-PN$h0S)3J>J zhN%1aXku6Stl41@DuH~2e@TnGD4dp`5;{LNzt^TZQPJOZE@ceg@GJwjk|eQ}ToJ=) zjJN6|L=*r!{G?t1A&+HlrSFJY|#9$#z&QnQg6`+SLO`&k9% z&G63kns<{YqySpmNd;DEFL%kRK-*V_`UAxIq|B606_Px(FRC zp3|pPWL=DvEsiJpg96TeA{dSaVeBy#7zOyoa3)3xR!d0XWIkc zLV$zSg;3pAjw${6Ovmou=qqBcALJFfxL6aDsX`dSaR~ywGr-BlfY0^u(Q(%Ir}?q} z1tOs8v%|#N(Ni%c5{sKQ7(LcRYy}XMcwsY(0M65XCaKx{Wp>f5u#k;82tM;Cnr@_$Y*DMhN(nb3lo`(thB&C1HlYG?;;7?kHRq18_klKG?==Z%9R3;?D@&zGRsu4X2 zee|q|UO#b_y#QM;W6j0T{C7iMDMe{Ejcg?j8QA~B>Ng(FZJ|(B5_3V=Fm+Q`XW_0X z(+HK7q;g%D37-BIL6kiF73~|oz8+?TD+2xU@cn7OTTM013QTydtITewvIe7Y zLTZiwFsG{+zjCy{l&-crATxbcQ@>uEA2U|c)^Fy5kKxC+LrRa1cT?Y~YeoB;A#6MY zrRKVqgw^Zqhu2|dssjd_@u=nBTW`(Gs(MvxFos7!k6p36Qo1&4IJvi~KgYsvd<+dG zJD7udUC(My7T`~z7#f4dbB?b9e+`l5zbbf=|WL2+hu6mQny#*~yOkI^NpaIroTcF>RUvFVfRs9~J1 z6+FcQLvd+)jZCREEhS`j273TmI=?8CH<1+P8up!}w4+$nXLt_*gpFU`Y-)3?O;0;| z>J>EoJIPl+Um`dJ%0>Dw$E0$G8%f?((Zf8uW!enX@if2FQLA{dZz;>Qme_g4`d*1M@oWdD&~aaXVJ3T@>x&j;-^U{;CjcCgH01$ZYJMVp;| zU{{fLP%8BW6weNCZhEWpY^swG#{ot!5vBkhJM#%9hG9{sB|j-AuVKAeM_wipKDolW z7aYAR6(;t??=MKs`Em+gQ6VOsvRX0Ux*G_vob$d zpX24PkAJ5a3O47|VJ)1gTwod)OFq1TIvF4sy$SK;6+_{R?hY2=jV$T%Y{C!cN zqSC0-!4h>f=^5drcI;^^YIDd~lib&r^?l!U1f1~0`<(RL!NNE&n4jBJ)RrkC%;w~= z#jm#|Ao6BHAI75XKw2${6G|WSanzT0Dl$q+6KS4Pz+?HUsoY~zW1Z6#C*~MZa}Ce2 z#47a_vyGyROh?NU-5>`a;{9CfbRnUa{L;I~_SPjU5|kdmGozRDE3*_$IgYrjxRIc! zRI0g_`j!QbI)xa4I@8#9bM@-)%S;C~s^=#5#!2n5+T+4sy8Y>JKaEF6+C5}S#nKo5 z5IO#5n&pg2X$l`kN#yrP28Ncy2}CAsmm*Q-;uR;d4M{8Jy)Yke+bQNDQJygj14v^Q z1S0Qh@s}p7xG8&ur3k@u$Y8wm0ZZf3)rJ)y@+E4)^e}>*!9KT6R2f}hs7i#!XDY*8 zZYZd1|7XUGrFbX;GCRQ4uQqPRGDoD4sc0$?6Jy64aP+#QsF)YTRINQ`Rab6z>I)5^ zCvLXos-EZHFHUgkC#2a;IAO~gi>O(Z=91MENNKeFoW`{$_ttP&p(J0TgxN=xY==KD z;3dzn#*QyXe}46SsOys7p|UWcXpsCi9rwyS{x*|ZYho_Mmw$ep5M@H%#l`MKm|<*q4M0^X_V z<8uFLTe1DK|G8;~6GiyNz=UC5<{BsXp5G*%oGaOs`nqO!-j3~b_`BDC9MAqLRG1K& z3>b13VQb4%>9{mpYSL~ev<N#wj= z3T@ggd6MI};+`3fI1Q8UAmMoTsGu4AsXd-Sz%|z}+t zmaUs1{3Omy3-dioUq%-CgWF#&BX^SPX!yC1J?ov;)(^eaW7ia^mbDhwh9_0oEKZ;1 zYJ{63F)5KJ9$Mp1ZwE=5A)oG@2BFvU1NEU&QY@^*LoZp({%(0TxkY-b;yg zxAzN};zFONyB!R8tp&;kgfmRJQy%lWrj0-N!{2mmCw%1%2pYstfI(eY`cM}&4~@O& z#J}erR|5Vdq#;H#ZYFl0KQf;3X;?~JoEu8Ct8{E}YIo}{t{Ku6rF80%JU8RzmPRM+ z|Ll>1GI+L4I&ruiqG-vTWoK@&WBuKX3#w^C-C?^8imyRnmZZxi-$l(9_epV1 z$#2z@iPM|qT&}(axJdl^XUj!$a_gdMb_|3jSp%ZBNA_+9@dGi5D1ZZ)U(rrwGiQnV zA1OBuBgfIRZH8oindG~Hbv)i{(YeLgF2PTd#i1FoG}vw@7w)1)U}}f@CfERu|8y&s zo7WHe3Qj>RZB&p>PnhgjuIQ&~R?&BHHmC}1O^C%qnF)yrgNZ0Cosm%_K$R=y8q)DR7$kq0;3CvDjRMMJIzJll)`XMLj`IR4wb`x| z9L#PJg6rl9txIDk^Z|a1o|6;rzdIRXI7YWz=EB#_vU%`QxpVOWP@{%iH@I`-*<{fy zBQXzuz%=H*O+TJTVbwKfdMqt=0Js6|JZAT#IBw|5vR~&&F(7}v4n^GSJKt1X0d3!$ z5K>GQ{L0usUsTuc?>kG`i1}5|FKuH0J%4~@cIXupM)WR&Z)#zG0qnz>{fv2l4L0kv zX!(+JO$9TPlqd8m{qrPl2i(L{t2R`E&j7xvr$=uh2%jrbtl?eRlTIJ(EsRGA6u>(B zIWuw)=z&_kT5)vFfhzx;O_eVKP!RRI1U60FD_EGM+%AV05&%{gf&7ciXHSN+fRj=T zLa3%w)29XWH;o^@#Ne*ZBTP}b_MTd-<`ne>%m1&fw~UITiMED&W*8V8g1c*QcLqy< zB)Gc+X1uCCg(&o1d+t4^PK zO@+Woy=8x+OYA!RF~8FDg=@svRVsJd#18$=ndnO{MBpL$2Jb=GDmacDVLB%mE>#Ya z&%I1u>X8P1%n4%&&QeHFOjrK3u5z_PuosGp8vV2q0#)Ue`liCMkcpb>qyFTa;k?ryzG{WUNabKKl&?^j> zmbpulJ@z-^2NZY{lsOAcvLpRaAv`;@9=L5g7Ld9zzXX#-6~HOZdy>-?FZWM*7y5Ut zq@j2u%`6&FsZ1rey%4A2G8=974ru8KY67Inj>7`DGO~(8tjipHu-{I9l`_z3(avw& z03<9mOZ8fE!*%ymxU)$g(U3$Jj20`}o#RJ(PI^bK>mZX>o4qr|qfZDmCUE&LP!D~+J#s1U6`YmLnL z+@OqYm%Ygv4!lbfbwO)?s}`?akTQ@(ME7xy87*HL98j!9H97QnxZ0^gAw!6|VLE?0 zepqECV^n)gBFjSpa?8iq{GJbERK#b}!02El;(W7|tmqs6G#DAJ*XZHUG5f}< z?t`GRu*gD&ZdR-?U+Fqk z=EjymHySxtkh*6<{?p55^e)Y_x6n|UxuHM6>~YT!TiGo2PPnJ#yM~MFhN|cWrBAhp z>X8a*Cro}nl ze1GzR*;loFzRJmBlXBFCo8CrX_O9C)0J6=kN`C zG$`%?qm>oMP!Vk!&!5Ybl7j+%yt{oE3n@aMTZ*1EyX{zuqjZ?Zd#v;hz^dg_SB;nN~|~FVa4B{c5{G;@+~9zoME6 zM1Lx;#oMYqt#3hXr8;p_GxtSH=>#thsWjjA7t6(qLQ!Z3n&%X9X?K*CGaH2b%j=re z!3oPEXj3(t;Wa0*um@g2tT9hOfE~c7J!^9ldYRj8OdH&nQ9&Q1d^`|^BerMy%I2rI7%Ojq^80p!9lXwaVE&V#9ls84& z`kTaCcV_*E`-z?V5O!w8UMI0zTsXluMtq9Fzo)AA>oOIN4FO01CeM*wq6i`=T5r*C zr;*>LdETItg~#8L$6LN1v}3_+g*9Hiq--HrGFjZ1=fqI3JxWgmyww;YEpkji?9dcr z+mAKB17wTL)s~A|QdDugW#k{Gn~mYR@-ZMVzZWH%b5D{KgQewA%8orIUUX3~VTP4c zrS&cLlzd|)<1-es#V_L#<*C@tL-i;=guyGb#H7#Vs`iHSu%|TB#J*cSYj$$$c0-{* zi$60|ypX^Ibn-WFH`fI|1AopFev>Mn`yt{kktCz|wxfdHMCHMcc-g5Y zII`=Veoo347a7RQ>Cbs&NzZTfN$|ggb~J%(rD=HAh{``i*ecI6p7GyVs21qALy{sS zG*^BgefiP2J&A#;`MWnZ^rLkwi5@?z--qPgKbxNA@agVrdEVbhBQF4rHe>>JjiqVs z?R`VzFMMO}qL^^^*Ov3V_sAwJY z-d(gFJ9g!d`8fzmeR!xAS+ux$4@OJ3w}b59`K zSF-cF!#jY!08KZI2?(zJ5w$B0;1r=hCHzQ0z4Ihgz=S_!yY$c(u<1Gb{u>IRX4rK1 zm6xBHd73L|>Hq(uAn$OwJ8Dynbm$bVMDcu0y#_v_oy{&J%LUiaE5f5-Dmi5)3{%H6 z$75_+GK~6#6c`ioU(1&F=3As%#Z3*{)s5lru_>6#%NE7K|9>CT(j*i21kP`VvDqgN zsA>w-B@`Y-Ca0{3!hGaK?yZ#NFRuU6m&7YO$}gF|Q$7FDnAC{I(i$R4pD05@lcQiD zdX$E}&2#%-Mv_p5U348o`EXVy0tWj!>gGX=3cySJisg}Xxwg=fuJ29NE7dl`HloB+ zmYG}5)<2#o^abJ`Ulu_lgGU?F#qG0_TkL!moE>etrltkgUoQf=zxdG? z41?3Lu%ebQN|m<;X@;IrTmu!DBOjj$s^0K&fR0Xh~ z8N3#(qPiW#51TT5?KdV7+8ESX#qh+08pn(_bht@oMHM zg5S9s5n$Gy5U{I<%44gaS<+89ul(UWYo$uH&@8S){-yth-r8{W(3Vn0n|;SsVHhv} zZ0Vkb+f>%*7mJ?*nFowZt*g~mx|X6ozLr4b?^C%1bCQ(6i2fv}?2KPSlxl1ck%+X5nzQpv03myr2u5|TdZk13$oq?;ulR8Hsi+zscn6g0jq-nl8v@}F+R@KS0x zH{V$ZP{W+G%b2mq^6C4|5zrx7cPqUaJ{UHwlYMRjk{I*8@|k&BwUh59hc`CiC;;7& zgdbXRW7EAlsoH>lf4<9HH>9*-Z1|Xv3!qJ{wpR~zK%A8+`^UQ*(52BgD!IthG~Q3Q z4m|bT5Rd@X^JWm18D|tA8!uu&?_l=Zt5T8#Su7A)0pzM>wgE!N!ONW8Z#4l)V_ss1 z1s=)H(N&e0ByVFXA7liGvEU<)j20(Cui0iS9QfzdoHE){y?F~MBhe@<0eYG)lwamZ z3!_Z^=#$ERv7{7$n?&eipfFd8!hZ;UYWX7~)SW3(xKA5&>b&deo%D4*Mr+&$)iVg- zXB%IsL<`0rlPdAr7FvBlqjFj94`q37Una(hp9EP=)#D7r%Zv!@({iwYlEZh2;UpBM zjp;$65rRI`ET|S#sf`W*8qxUxkUQ?3mz|hJHI-EPdti2MaWNby@E+!zyi>)a{}&60 zy#XEWPw*)Q@4=Jxojkg|4an5dj*m1q_}rf?*lcD98#~(4a@r~QpiZJA;3_ySp=T5D zob%5Hxx9QY89b;nrxUQ4HO!mYr?jY3UiHIO?7>>0ZsJA6FK_Fox}3HS^r^3}r_|>Kah+qvB5o(Y>A_)ZxovK1MU` zWxg3XxbAGW`NRnNf6u1>H+5Rr>(9cFIVtJ@D_vhVn%OTw0qwV^%r!Buz1ugVAfKRT zy~2ZN8ub4seAfFghaBUgJ$Ga1o=)%U?-yh26)jt&ccNF-pQ?^_CBM2$6Q2B#x^bzc ztTcSkU^AP0`|p*?#@u~+QAg*%Iw&^ixVWnC)nkF=%u8gS;Y(`~PUQ5F)bk7w&wKQ% zM~a$4?)(;+t7jaDpA8UOfDoy~2V(q7qy`LFqfMd504krX(OggTnedRV;1S&0oo7q( zctfXOOZC*ZJ2}eqW0V7$4C-PxA@*5>#odE1;j!@*UxtgrG0Is<<>jM^@u9f;U!z=3 z+|IPRBQ_QAab>#y%HzfR;h|jj5?CgUJM%Gzm7Rz1Wi>rc2xFdaWjQ*a*xtDCf(1xH z5F1!h&b^_*+)3k1~lr{cA=cgL%JKzj(N#bwbksZ(Mw;J28Z5~Pz zk+N$FbHxuzgE<~(ZZYIU2*fx*oURR-Ks zFtzwaj=iC1leh#cws=}TWpLNPPti3n7Sjz#8=V2UzRY7APv%S5Sf!CQ`iX8;>r^W$ z**SR5G&NR>lcY?M45Xup*yA*83H7Bkk=Xsln2~|=F+=pQ!S`zQw=ImPDY{c`){qvd zsF~`#^JQ@?OpERX0;i?Z7ehsRL7VhW$YqL4Ws!L8T9rt(SkaD9WN8dz-Y>ZQ))_@l z66DNOVUrt6vPxOFzVg-6jB~}%6Z9dRC&;ym;&Wn?8*jH3+Y5wcl?97Z9Z|Pe0cY!H zc57(2rj#a~woLGxQL6R<)NkFJ0cnp>7r6{$^d(m+!YM4|fJfn|6f(9F!d%VVq#!R4 z+IX}=S)HE+yb9j03l~dja}^t#z2UAT#t;BA8W#acU2#Yq6D3g{{z>XLAmer*fVAD6Gy1Jzwj{YZJ zE?_wxGr`_ZnWvPmhA_TML3&X8q8$C=coPV|lOXHz>Nz6779Zd&@b(!?S)2L#DJ{zC zRnnNqj^vp=?s;exkd-vf5 zLyo3h>XNV?cjBArgN+i1OflVk#DZl(ErVOUMzvOJO2GK0&lvb4it0K3M(NjQVZeFM zZDg0;2s+mHUhFd4zA9`tl|h&QhfQ1%nQAXD_>KUSy6_RnwWPW5@mJABX@6~XK2qKE zzsBrfV?fd?ez}W-1=|k41y_8e{pu^<6w)3IkZyy1D4+TiwgSC5-rHCEzigU;-XM>m z$>Wcwd~(z)zhpiM@NBvFic*bB)I~H1wDQtKsuMFHrJv>hax90l9h%YVk+MIx-cuDs zEyuv9a@F^$Ced395C&I$mrGFV4|wJu?!HQDwZJhfbVj`4-S$Uv+NKyV6&nzx?_dg2 zeDkTWzNL&KOv$UF+qZu?J+4*FE(Yj^lEU(fS!L=rc*1pqlGzyq{uf-()GXu4mVH=) zkZaO%OrIaurQMO3TU}yVNb6tN2?06MS1m^waecaH%A6ETo%bn|^!zY(JZn|XI~}fh zVJ4N>aA$+^n+=YMR{sfU)YpY~_4x&)kbjP}h@G{r!TKHo?YLfr)hUBx&QR%>M#ud} zihufApt`^7=Nnd)0>5XEEhXNN$c|^asma7qdFJWXLEXqW0wVc4Uiyv)e1S)snbDtH zdTgsYS+1?%G&xezk4~2|**y<=s8&4HnyhJ|k)A6(tn0!&6t8PJU;2t@fY%Z(%=QF& z!@c#h4E)8o-%LM0(XX_MQV9-FMELtbOPHIln@Y6)VJP$V`dEVf$RI~>C{(YJdbu!7N0GI*J396t-T)yxB zsir)wbt6b0ASdgn+f3iGt5seOe%)32yRJ*~r7GrB&7q%!CJe(3R5;O~azwCUy9oWD zLPz$U?IeBV-RnxElIKXaGp9i+zF9kXrEgq07LJ%f^Us)k=CpNmYHkGZ(0v`ZyhnkZ z{<(fe`{(0Lu5!4NLRngCc(xmdduTzrHHvXp*jf5w;%^KxkUb`kUK_sdWpu~YmgnZw zQ9%iPIwq0R;OY-%3^w?BvNmhf=V9G_`PHy~oH21|?4>ug``gZq}9S%#%4c5t}ctNQssQ=@716V%DC+?0E?fe7hn^=!@nj6fz$i|>DTa+?7 z_?P;Nj^$$`!h#ct=*ILPN?7+}Yuy?Msqzm~6`%cW8}Y4G&sO6Cv0yr+iuWuBUiLGKsJFort8KJ{ObVkg9^5nf1}9Wsj5^Wzn3uG! z+bbe2jDT!Nw#kkOhn*JY2~_J^;6m#9;}lNDcmNyxH@>RO@8y%im=5+Gu2Ej(*gdo@ zJ%fY-v=37Y2=r&g5!L7isRUGL$ z6EIMc!SbU)lck}yoLI4J8T~eQ*xb zz{_7Kere^F4;OF|`E=e}!7cT#L(^xu2L~rs4WM2aZuO5-Q%>FBKD-XCSg`qccakfn zE*U5;6DV|35l|!;@;#s|IQ8C?C|I?3j>JC6r+++Skh<=~ed~cqvuAj2 ze7NMoUej0|RZp65uQ%MN@ZHvqLLxcL<1B&23~yIIF<%Q5y%Iq4w@gjMybhgCYzL6& zhG2X0hS!RyGzeUr$osiKW!xJgvHv3~NaExLjQ6)CE_OH1j(ykTxoflz)=PU!dX28FrBsuIIwuc8xa4!9 zWf_SOuATY-j7D=9NtN)3uPocsw|LyaSaDK?(ABL)KD z@Rq+o6$FHfxZO4b@c^lt(uxWY*H0jkY-SR~nTZw=5|k6p7T1GLpA6-gAkJC^HC!MU zEHGWGdG4Fu(Pv;Dx`Q!%;aSaSzqRTaay8JZASN*r4BcpDARj|J;A-A-Hqzq_;R_tN zVb#lPwXF-%Lmd1}2>g2{jUB$oDOq>UO=ukMwg^zQV1b_PruRg~^K_8Tga2qglpJA+ zfjn=V8JqF9qJ%HY4yceNTr|3+yJss9P?;dt%bxLyf^x7ba{q9ps%y3h z0K;I!V;B$mCy-*;Ym>luXt}@*O=48ElrBX*PLh!?y7fppd@KcE?cDxSRZFh?P6^n4 zJ;n*)G53o>ya<&_$IjO=hmL>2^w)utN6(%J0D@2FUm)3gD@TKjmE@TLmesy{J9Fr0 zWX*%|BROI}iV2&kT?-h;CRc8o1+esI_~Ka2$1G78lmDc{eQPc1!2ihHGUG{HV~0j5 z(J<0_uw)==5La3t$!lvsO+P~7h*!Z>nW>X8iKq=@CVATeE9Lj5>KHahAiR|746>AB z2yI&aTk_ zUQ?>sq2fo%gnSJh7)Q9e6EDH&pYnTbI5r#|Q9+@8e)#EwGh0u}^U2EEoBuGV{s-g1 z@)%2l0o8)mC!PC3>EEL?!6FW$xtY18L`mCvpY`Iz-2ng~KOR^+BhxO*{c4ZT|7 zXf0m_{>f?m5L%P}t_?369D|40%#GXd=AO++pIcp+wvZe|L-VQ>?XKv?*bE~9+{FYx zAZSnl_3B1BXjW>nHO1JYIL3$Vfn3xHX`zZBF%T-MR#EJSkh*uul3_;NOBf3@2h|Yj zWDUgAb01X%rV@d9wY%E9JZ*l$9`qaHzJ5()!}Ium3cmnX*(ps@6K9pd%CSANg~3vi z#3g85M>*gkfDNgLDAtHvGKY1`hfVn|!G4zqk-Ms@{|8G7tDBWqClZgMT~zD%{1BR2 z$PUV*!JL5vu8Kc#(m*hQ405WXPADcz)L$yiXg-_8_{I#8C6d~;Ko}gsNme3uRUp#0Or6vaZH(0uJ*M*2(2_niBv}m z4e7U6yF@e&Wl|)7x8*?2)RoiM!&gyvpcQF#&I)SR3B5*0V4eG8Rb&x}ayV@rnkdk_ zGinv%Sa6E#NE!0ALF9KGh~g_RZCsh)U3{mrCHTrYiBQ}L}??yl1LuM9E*G9;&hI64RB^K{=J?cqnJ%s(6AYuYNVMP{q& z&{`IVNNZd9KO3rZ?#%V)5A0k^4;6oiZyN6nqz}N>Kx^T`>sm^Oc~*4QF!Hyb7Tw1c zR512F&qaep%BsZ&^7dD!5mpuAaLLsuo7?a0#yxzl??f#zFp>7F6&Vn zBiLMCFr3hHV;!odTK&BX*lFVmE9aXVTl&tiY6GIIA7#50UpoUS%>1tbWNpc zL*+)B^3FE(!cdKiSNQya#}`Ly^{ZU=DBU+5>z_#64T!D+m=ZbZZyK2R;b3fSR~Qt2 z+&q~9j_duOx!D4ueL|oWZDCP>XNO== zu@#x{x9+Py2l!^haHt>4yliujVttz~6vu^*atiAmP-=+mUVkFGH)c{Nj95nH>5d4W z5O~Yy`Iuac+(qM2>4CDd+tIiXAu*llHFT`0;jtaIOIwn2TM7Wt04bk`YW2FnKRTE9 zDK8(uPa#_H8qOLo^^fKpELPtWnFIbYqJf-z8+F{;=rmrUN*bsDq6%F@s14%V*pFD@-XAo+o zrdNcn}GF{*_b^?BZM+MDd<6Rui}_q8eg0&P4Yi4B_>m7jid|zE-%L zEmQz*1=eWxi#(tGNzCyD2!{Db=@E8O_(JS6L+60OkxV2mkSSn+RAKlDJ*oT_z29hq zfQsRHNcGKaiu?v87a{tY7tK*+D-4F1p?uiu{(M-IEScuC=Dso+YOf|B3tMujR)XNr z&h4MkK^SQa83QlGT++bl?aILJw!(v7RYSN{t`-9_g09x_^IP0=fSHe@z3?D?bb>+L z$`n=Y6Byl4#LHG;gJL>#cf<@I9x_3e@ZOMC9Pb6rA7$w(2^>qj{#A-DQshiUpTA>+ zTIh~A%L8{-9HI=(TV^z;;%-gM87tiJD{mfp)OW_Tr-*v6d002FJmT1|&y z`U6?;$~4f+Eg zXZi28Y_7k4*AvFh;?Pi9t_61dYE}W9AFOA#;i3JJWQIqJ?G^ z&rGulE!09zeYO&3dD!e5-VF<*ur(PW=SIS=_!U`a=CL)o-J9TS!)2a9&;B!2mD+Rm}YDMlg7RU?!Lj0X%G6 zqN#bI0G)VnfEEG30T2QJ10WOt3g* zwn;tGLJEYEK&QF%rMvpu*t>~?!ef3@?zGOphK26=4s3T7bXo*fhQmRXOK5Ew@5z6Y2*2<+N@f5$Mpj&|bYW77+rs?ETM1BZ~Rri;h-yM9YOK zTS)53aXw0Nde-){N*vVUoGO@psr_@pSexuAl?1vtiUGhPD0@Jzfn#=(<{cwjLu`5W z`=-|m-|DmDG87>0ffr5H5`v8?77(n}UjC<=9rgg7@kj~IBCuZ4OiS}WJ_LpPA6M(G z>u-z9h+_jGUxFtw^q)vLU~c&qw^Jd*EiS*@4}9w|qk2_lYuGrI@(eWl#Zv_Z55DtS z>FY+blur~;bn zogS@S)4wJCZ+2}Cg%!j7uvB(lTTQFA) z^J*Pm%}R&)!FSv-=9@6s3z%}ZQ=Jx!9L5$Hv8ea3Qa1TRq*mJMtd-t6I` z_F+0gGa_{q3V33%?ecR}wf`%9YG==`f7U9?U~yU}kjkw4T2Q)YGc`?04M3+0!nFBV zLSWJsy$E@7QR7d|IhXBqBZa4_KRsL8*sndl?e}g8i2ft^>Cb?iD)C>#bMN;y3BGIRNkewdAU&;b}=-XY?8rY)8ofzb(5_jfd}zuQ^>G(qfF4hQCc*-1Cm6R z62c@y$_yfq0KsASU-iD%9nK#d>`M21p1jdYI@>QTm$H2ZcCTJmcx@%!$%Ss0D*yw;%=$m<5Fni=^HH;y>^7s^?j)*jMKmH z#3Jwt$R-{HDcK_@s_=9Ji*QQr$T#E$#TFa{bQa2C`O%yRasxbhaVNliTKw|G_X+4c zU@^>*c0DTm#6p#>9VHK}7~$1~PCG8=E#%F;6(xhcLFl~_1(euAnx;Oc_VR}&k%>hz zpz$DoH3u8pwVQ2Vgq}q_6>7OaH_MzI@DSavkW&CS4>>}06oAeVpl0erKOrZDg(xC{ zezQ!wnbHh5zY8Y-MKNON0zIEXA=Q5;TL%l!e}?-DKwSv#rk=+M*EIU|h@w`ug*QI^ zdWlSIb!QEzDWJYL>G6G5VOc3GTLNe~(c&0CQVpk8?bPXZJ&& zfd2d@K;|_%{Yp&Le|_~68JDJ--nRHl#f7s3buD%5Of&uO=tIPN%hot2yztLJM2BL& zf-)5u3N$gyXaEpMcKmsdhM>dy=e9<%=}~9VjdIdDk#>C{f&ByJqUslKIt(O1`LVXM zFQg|7bHnKA3vlnUjVa&d6`3U)9T?^)n>DOxfkj(~-yEuBHc`xkcr5oMk#~3n{y!_> v|9i7BLrn?$?;3X2x@Pv_zb)XN_O&AVZc0PI*kbSg-<^_zihPZ%*@yoR6{X&5 literal 28059 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 diff --git a/chapter_graph/graph_traversal.assets/graph_bfs_step2.png b/chapter_graph/graph_traversal.assets/graph_bfs_step2.png index 55f1b3da0c7babb0f25b63122c1afd789f17e8f0..7082c2b17d7c29a496299b74a4e23a89e136b74c 100644 GIT binary patch literal 30632 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 G=>G?ijDUIo literal 30528 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

EVujQ)djy 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

ny+@!k#Nxo!V#!o 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 literal 33667 zcmbTdRX|)#6D>N1ySoMm1b0XX?(PJ4f(9ozgL`myx8T8TNC>XM-7UB~T=MYZ+peyz@bK^tA3g{d9Xvfh-9OwvK0Prjj=+{+tE;OTY3ljIc_$|) zYsafsS6Aof=QlSu7Z(?J{zGG9V~tatS^c>a>q}pPS9AVc2?+^JPEJlwPdl`q4i68H z?cFadE{KYXmY0_g4i5J8^w`+gC@U*3FE6XBt8Z>@{`~p#;qlS9rm>`?Y5)u-c znwk?669)$e_4V~zTU%{yZGnM->+9=DgBOK`g$4!&?(XjM^YgN@vXzyUX=!QkzxOgS zG8!5hl9Q7yEG%kkYZVj}y1TpY?(aG}I-D9Z9UUD91_pe5e2k5aqoShr_V(uH=Blf! z{rvnwLqlC%U1w)!v$C>ub#~r`p=uO-)UCd3lGIhihwVeSLk=(b1Qemm%%JUS3|2T@mA3JUTjxiHW(nfBFGC8XX<2pRT*Oy~rNO z+CSgFzQ48&TvWB2F05JVUF}WlO$`nXwkxsyl%d7{XW)`DmG2#5`m4xS-y6@ko({&&;=#T&yq_p`&%WQMwR6~46TzFGhP|C*C;#JS`ulljN+}zxd zkPwx;x#h!~_TH2H+WqwM-Ob|-|D^TC#>SjqIeQ0py=&*oYg-$eTM_B=rx%a?Rq-fn;D!P{5kov?01<}T3dYHLUKjY=GK-V!oxTK02PrD7g2X# zIPCU+T^s;t?o$~-8R*~e|KG#N?O+^Um=G~{4{6i|5MTjN#&m<#z=u51wt~5={@jGz z-u-_iRv)aD2eRceUZ6m+Mi!sog~fIk4n7~z0(3k%g5iDLj&nX+Q9?Iwl}r)1j$*L6 zdn8Qdx!C^}MzV@X>N|3w?};x+AY_K2)7eo6Dd+e@Oyqg3a0q2mi4aMue}6buR)L_d z<#^`!Bgj%@du6X@v>kwZU-rXYxkJ0g)tupa*rEzPTxeaNbh<9$jMJj{oyVCmsJ~0@e7?oZye+b#BI_YkP| zM1>mq=p6&EgNO!xG#OQ+QEC9xSQ>aCY`Np!1P5~O2-W!g)saeR?TrW#HU`_jJLx?} zXnm#Fpx3+U%j0jmJ}KW`3q$7csW=4H{Vu`Ge6#PzJqxsTnzki^%~(#I2}MhOjL$=3 zKpt>QFQ(~R1o55Gqd}joB^LG0M`l7C30v7D`dsz7@mxsph#wslRnQco6;KtFrD_5> zXRru%;PATI_33e^)W;i@vzPvNr>rhY|8m!3jL@&-iz5d&4m8&D zy0G$qtOkgtAnL#xIGBwVha)-#h`O4ENY0;RXzKJGd`nCS(UU&-R3r1PLO9Lr2Nm?4 zQ`Ghyvx{```(NO-H^Gibmea2VTJx3}9wg6wU*ilK<6}V|W%eaXe;6Up{j!!bQh%6P zzWQ%6wieR)HV{78NW8IM#|sMvPb8L}z=?=+E{^b>=@~zopH^wq{pZ&; zpmQwlY@=a5JfD6&zsjEex6BGhu;^+Bf-V0v=$rf&yG=#m5UIjzj;V3&tUI#BMD^p;-CbES7hIpJ{yJ-!6jrfW*=M-gXic zVljh19<+Qf)6eW3)lJ2XXB;o(hvv6)jJ{CtL67e_Sozzg?xvnT@WJbDD^1yx>1G>$ zE`@SH{i||zfP1l>zUkbEt83mqMf7sSKZt_wDc zvFoWg(Hr@_{%)*?7GE@FZ+;0~?rKHfigSm76 z#>9#0jvV&(59?(S`heV1txkumim-9W5ilyZ-yYFZ7U$1=FHNC(sPUo4)vqM1`5u)? z@kfi_XjUsNqe{#N_~`P%)s*0-@XF%weh40{uwx1Q{XP<)IK^~GHoy{uJP`9PilIi} z+!(9>eInL?ayD*|v1OqTKfkNW4RTf@7pYkuZwd_%&u-H z+YSy+cZ`h9+6I-ead2Wz3sDtA0NLz?`vVYj45}_>In6d%j=&uq^vy^1#J_g&K9)jA zM&ibaLn43G_Sz*o_PgL?XwI(0Wp0Cgu9KLso}CH9N{#SPsFSNce~1du5&TEg~L-8U^$G z_7rc+XwWKq^5&J2gr54U&&Wv z@SUF@#py_p&R$7$_o7I_D$1kG=}wSY(cietU0E4>0ThiN=`;tc@D62DQ8MuMmpVKV zf=>E?z$8Hah6>8+`cjY~sxje%L~pIzX8GXb6!*ab`+bukuv+`8qeElre0at(uJY|o zb&$8kiJndt{7<$=Vp4YIaG7!rL^ik9BMXpZ|S%b=&ro*$v+u?DAE&($1+D zRsSj!vgkhxyt)U&IvJN;FAmZ;4JDXS!a3%bSE`kUaH?PEgaz(cu5PGoQC2irg^E!` z!u&|@$r1wUa##EC`1=N{Y-YB4RHu5iz$M^1Flt8zqqp|<=#=$vI z7n>1;P!=Qh23f^-H#o{Xp$a_WTg7Yr1?#M z1VXc4-Z=INC18LS8Ua-m4(P|ThI7co9Y2Ie9XABZXM)fN@3u?|qxFFD5mNfE^Ei2Z zbJ8q4I+dd<+CBv1eH6A9(Lcn%ljD3{)bHRfjj{LHZE(M?82GxLJd^nl#9A8#^rKa| zLE6jFy4UA#x!FwX_d|*m03L8Po6|6JoH2Sgmp4XzA+SzKZZ?rE3OhIfHBfS+A}F+h zn~g$sW>~TiVHVk;7)O@Q08L=_rR5I!mP^^!=^h9Axs^B-B8}N1q6?$|RrN=Gp(P1+ zDUtbs$HodY?*I_Nn`9W*OOxrtJ19*=g{?mGi7k`ZV-fd90;Z{d zu-&lJ*J0)kzNB-!6i8SG^nbXQTjx{GUi3k=9DSC6Uf)TQ5Dznn8fIl=d_Z;a%M8b+ z)VUZOH?qW9U<8*?1nK=N)#%wTRX3VlELDT)#d?eo1w(=#@LXLTa_b8EA`TZ{p{92BUQNO#C-jz#SXWpNw~=tQc~d$ z#|5Se3&3<+_~Zo84kzCsF-G*02a5K(MNxz>Y_UY*!7XDXQ6d8pxNEZaklkrbFDBk1 zaMz#^WoUm_;bzl-K~&g!EByUNv@vSI=8wHwHbz2D@B;J1guknxfv^jv4WXZmrzPBU z&wLEIi#fm?+n>0Ca@nBr?e6HlSr~oyt6A-ksKylQg+i@bSWuEcnO6IVE^6aj9Edu~ z?rlb}c6*OLEZ{9vMC-;t7;X3kx$h1Gx73Tn;u0|xNXElSAt{pyDu-Y`P=Bpg5G3OC zgy=0nYDik8t{*TQi&vm5n*&V0G(gQMwfLy{qF^OlVo?+xW8%K^*iyvnh)jUuix5~e zkn<`MC8{Ny37iJlpjp)l(QYRF+uNH`YaXC1iVe>1N20ttdHJ1o{Xh_IEM_}Y8Za+G zck5J1s|^&ew?`>fagK!~tmXD=t2?S`ZLFRZKiRJ;mvHh<3@iNZ_%?f6{PZb&!8koIj#rn|Nuisj#SK6{`i^h#8xteRI4lf)4 zf2`ktrONyl-X86DnAw0>AHeM4ZWkXb&9k1mYPHS*#>aFM;3zn*7G*n0am4og6j zA{ON(9FenVx6v|)wu4$L&M*AqY2kJt<&X5uOMFYT%yQ)2>GCU2veMa#>G6<47*;Hx zZ#;^mpm*y!>8>A>+d2H3f_XS;k|~~9s6)<06UQ77R54DGX9;|t*T;qOV?Vnb1d|^bI9x=%yunRfS5Fi@f=XfLYX- z@9*9hRE6H+0CDpXY_rJki)L`VVX}_jf7)Yx(oB5zq9*ByV=ewFTkN6gx9fJaFzs_w zrEfDPt18DMj>RUpt=hw50_9H;eC1j z#TGBfp16vx={w>JL)^Yz@*f8CW>1AV`?Ve&j$Cx?HNxyTbkd#_4oEtIHaI~fc*lgE zCyfj_*+n)L@f$4}Us$t`L2U`eM2??%-CmmzWIwZ9?#0!-X$BjWu|`(oH0QN9=TW%P zj5b3#hgoAbI3l=xU4ohMwyAZB8tqK2(P5Meo~88EVU*;k8+o3}%J$ejIX!_9qLsOg zRDAx34${TN#iya6f5*{lx{G^pd&@kQU&M)jVD)06k!-^o z?RJ5{Gv7tJr>v8wZOOSalJmBktS`H!XCxf2ec;mC4z z)wj^f2Bqs9^;*T{%!(ck@Yh$mDuWFGVP~RYX>B@0Scod3vaST}Eu@|D9%K}ZO-YkL zas{%H(|QHZ&zH5Ol_oM+_r1qewpe2khmyS(RF;l9dUl(s9Jzm%xY)P5UuPO%n9+904q0CwdyEs89juC8Ru~2_b%0u zDk2*Vj%q-Oy9}ed#|d7QnMQK-Uqh(l!&iaPBGZNXM#LIKtTp8+MFa1i#zZ3B5J&3* z+%@7a3-GZ}j298;jUn)pT{r**6Nuhdr}{9L?9^m#;r_Ak6EYCnKi(VmVG*E;x5|JN zR;Qv3+>y|Dca2fxQBd)zV3;{f5Bwqm;Um?(sTi`AYZ>A|n6lG^XDS152e5uB!9R7K z0=X#TG9jlmJrrzH)LI@k^@{p88|08*+Q)W zV6DNprst2^<+N2VpjyCqpr~iY$5a&V{l`+x3RenV-AXTySN@Hfwb!Y~9q@u?5c)CT zvjl_>F*4Lm%b(K7V336y@<{&2xZTV3J1cGelsNyXSGH8;UuY>Fg^ zgcB*Y>7&Yg%XV&I12eZ%fA_eiG zP;E01i#TMCSJws>rJB-PoJia7f{5j0u_ma&W2x>5&r(bcI+T3P(>Hy`zt&%AWcx~f zK~Zz;CAz!Z1J5XDB$JAmr~Kk~(;XTKEW(?(83oJ8Pkp(*XH#R4r{T?a!AUOkik+JR z>Ad~=Bodx?)=f}6E5HjD)>^M^M{5_7ZAOQnMUkyq#?DQ?^-jgkU41IuVV@b7OQH>s z!qx>uk7fkIGGdS3Cax)+x^iSP&(LvL_e6U%YPasZ_Inv2{kILZsKL;>P@*EZ{%s2q z!$(>K(B8x8tj$k@@e2U=l@}_jdPhcre>*4;1q1Nrj=LE`4HHNv!1oVP9qVgKEIH1! zxFm{o)aLGbSpB47$2UmKs&YIDyJ&e%0P;m6)*y6u9|5vU>otrV$Cl5Sx64TWzOG~U z>BnQg-8z#5DU)fAHUsX}2Sb9^VZH>9 z@Q6%cC8++$u!wvBXatXC6arTS%ANTh?Zu#!#qUiZ@OnY5-1zBgc9`S8Pq+(rfI)em>t-V~_ zy%jv=Pt}#f-$#Cq>oB3BEl^LMlH+MCAdBPvu5~peovnN>d^!k5bTE~o470u4 zky#0WR93(tdF{7GAw{I8|9l2eX{5n?NJZWv`WxxQn;I9wpB9KQU93oieT%%Mv$p@U zL8;h{WF}~zC+Zou1GO-m{sqbqAqJZK_(~ z3q-5;9E9H7|6i1=n^5fk zGNH@=M?39&_hA+8{{VZCsE8H#>n0@rPQ0loVilGt+53|iO;<)6!w_@K^RGVti1vla zS^fj7OFh^9j{JXyPTDc0{}jvm4sL%@_>bV5CkCP3`2WBp@712M#%TY8iM}jp&zboz z8TX&;a}EE0&VPhtlv>=Q|5pJ786^(__TYad+Na!SFdRw#@E;0#E0=kJjJ1s0VB3Q^ z@V_vx0mVCAakT$Co+rqqAwB(%@&JQShoH(oH7-m84AmwQ|M}c8;U~NvMwF$Udvl~+ zj#}Z@ugHW1ifCvk{IDM1i$e_!wZvmiFMO%DR9uZ4$p6aoTZW*xl`nvw%Wv+3-yFeD zwr@f#ia$mM_~YvJN)uuc%_)1{VTE(S zL($;_dE!C{TeaJ7mO4sTJ6!FTb-!MDV}Et@JPW(M6+F3EndaD?wE&7>68%Km(sI$8 zMa$3KgrEoY3{+~jkkYV?voYyuCkH!5`fELRfW_D|KIwcSF}S-a!h&F>(`GXh`7JkwK^KFI?<1j;FYmRLPrPxi~$cQuj zpfI#F71}(o9rk~j;q1lWL?}92I0Z4pQgZl{{2ep5JEivrCupr@n>*c${jwxoaXELf z>=x=4eUhkDf=8!;!xo2k5Piyf8nu6yGIVJ8rKR0!(nAp5F>?#G+5QL}sn6jlO$WEP zYbwgW0ZFd@5h@E$6P6h0gmU?{^Luoil^Wr5Jm(s%KC3ieFXlmv6!TR&)+`+hnhiA= zTfEhH!}+Y)Jpmu?9a~s9Qpbx?WKWR)2RheuV+n0{(m<>paY{t$BBO@`{9l)El__6P zX}YsBqf8x&n0?Z_uTv_tAup(ykT}^0-zw*pXYtHF%&?p%l4P=lHof9LE@l^9RB!;l zK6u0avsJA%C&Me`dq?jQ{`LpFdIqjsu-`8k{VvM-Ui>jXk({W$edw3oKPJSnGe9Kj zXtt}CB|mo5y}Dn9v@p4nWSIxnVECSeIVuY~d<9WN>fkj?-sG2YC`=h;{dhS{PMrddf!skVPS54YIO2JHxo{?LfuC!UE=tZv2#ID4f3s2Z{6scu&AF0 z2T1eo)%F8EwSB$WU-shtjisEAFq);O3XmDcJH%8tIvV2Kq|Swt?OynS$g;AYi6;)T zy@6%%7fvHUTkRI}05R&md1!)Twr%K;xGy!}Z-~&(2Eo0pIQ)pohyDb6_dHMdYv&ybI&QHV9sAa8sI7`!tDQfxmcAN_WCF_hrR zZ;YRh>aV}~4y-RZfNMixd~cUvvzO9c8PN>}0tyld!4F)MrXtmB`qUgL@#7i=vLf(g zFc<%#J5Pd0n?Y89C?4nznp5CDY$M~}lBj+IZZHfZ47pErkx<$9Mzw&?j##lsrysq4 zq7%Z?3y+d4`htNp!qjgbRiGGoxaR2!?m0MbANKE)d*E&f*W&1U5WkR9F@wx*%CG#BWIycOG_YKPK14kS!0gxS(Bh_Pg5?kaYPVeJ zdEv5f#2P0s>T47N6kJpQ9(Z==`GCpr_BzhXLr6P%fxIyh`QGE+NpkcB<)eKl`{7eT_nR1l?;L2zf zAnkzo1Yq>7Y%mZo_H{lKqZ7W(6f)P;hjiL8;(-C7lDxwtti1*ZGkD6N*grN}3M^i2 zM$+wa0>Z9g0!Ae`)WD6)+ac;CZ~UEjmE&17To~hl+6lg+twRFVdh8~;`mgrgZ3q64nGR$@?qK7s2-m3nGP1AU#58) zp$rATd?QuUF9fXCsP$d6BVSKI^2j^k>9^=4iSD>z4XxP-ApzVl&eMcYD_!swU@3i` zTX>IM%;$I;69EZ(tB8Uq%1sa3 z^MR&R3+yNbq{frvU7#q|Z`OfmD22sv5(1qEc|{{_a1t$uo8eBeU{~79h|3ZpN%x&S zzGPbN%q-%s#qvgr19W$FO{3*TvjutHKAeu(Tr>ku!;bdMpWB!pX!>P+Ov#_g-$*-| zAP>UPzX(2N&^EhvX_`I{8D?t$J8vX3SZhrWOu^9v8)wP4ll7maAU4pb7=S*DaFpjS zWhfqL0A|mnL!efMWE6YLuP;*&F{3lIIku1g4Kq4hA0oATl^XLuOlopWE+t_#Elhjj7g+_sySGaO~l} z%}e`sI`weIBXKTf`yhqxdQ^pN8_qIdLxypNj{ayk3jt8G+fp{Ng-Hl^YnrVaobC75 zU&$VwWUUtTcxz=gtkT3!4>KORwyL3UrlmyOUZXZL!-zuXn()mhk`4m!?#(*IVtQjK z6N}xY6qwrmbn%?|9&R&q|KUsw$Ya+F9dk_sRw&R3%;11kPur{Af&h7f)G%XHap?HN zdf#U|$}k4yt&cUBY3S|^RjhK#9CKhf(=vO`+Qze@5eo!T8D#w!{+NV$Q~aG#d%)4R6r1h`m9K^l z+Hi7PQEr}yp~3C>n8cR{#Pq4^HNmRt)$l}-52+jbFV5}*tBZ_~huyU(en<&US76*5 zRtRIN0YB1_0STmBU?p01V48VBHNnqBxt$~8G2wC<%jk0i`l~nUfif7z9N(dzfR1nuz6kAbZL8w!Z^NPR@pf4?7CUd844_X@I@a93aK?>^7A)Q?!(@_JCzBu}wUprMVBh06sQloWxH=cZ0|w z4|0GM`BOic+=8EXs!cH);2iO`3r-lDlHIvR`0XTQ6Vh{rk*RUJ7mB>~h7u8+8^0jm zvVe*Vm7cb_u_{1`L(lvzaTvt=`zj|A=wNndk5LMElN$wOH(XcY{rQ2zM^UUnLxNx;7ir*@b8xkDhHB}QcihOK{`bU8Y16$nve^aRqlu%#=Ho^f*%i7#quYPN9C+jn5#X~W)@PJSbHsPtkQ%` z%Wzr+qnn;GW-e|3kU8v3m@v1-^O9)U?iA8!RIzUB*s4>8J~vvQ5VX_bOdk#Pw^i(( zbQ#7J*2gvYmAKSn5;fcU1}h8bA_i2@(Q%ZY;C6-=vb&l2;;NX~o=!7Gr2m7(lsT?J zlVFt{^zD;pEMv(T&#zT>_bZff#_r!u?i73SWTa}lKdM&ik!7MPmBgL^o@LFD*V{bL zI{A?Qh?gbOj1!qwRlg7xG}Qb|oUBr4RFF*tt~ut@=MPUG^G`UukRin@;mDqH0Y2TR zWczA*(L}EeB4)z_4g?1`oBqZYV(AfePXcmV_O?chWfQaM{_p&VL{8$u+c=1pD+o(Cym8>0Dl0^2Fm(nrx=NT^ z!;Iv8%}(q2?5TBL5M`Co_mrWC16^_vScw2-Gje0S(3|RzNN!p=3CIKgxTMma4iKEO zdVQ^4U_+Gv-l}@%Y4!HjnQT_(;p)(jF5lAr zj347Q8w?IyCwxOw=tTXsPbs0ABOi{^B*`Y~hIu&iW`#?!=oz$h8cEI3A>TO|h7S$X zNIN?MI4d$_>`A8Ti<#NG6R9O(F(bw;q1O;t>>SchM?=RR z$1%Bm$p6_D>E4?D0?@pavo-BmU!JN^1J)J+YWiX6~yLC!`{_Iq2 z`y}-8^d)|%Zjv_3!MeTRxuCpMiCbfKdj741V-HT|ma~$WZ=0&Pmv2&P#pCEVqVIg@ zV38kKdv)W{K(gWV<5EZ!6nuTGW5=r;7 zNYkuR3a>~Ai76x{s!tsjUS4t7*!A|Qc?U+N=f2ziFc){CRM^GdsV_8W`r}IwgK};rR=rvO zZW%(7IOecynUCqBRE(U0@v0U42EnSq=cI=}Z&Eb+{t?T!4Ub5(h-Zi> z6{ap#qjoI^X)shUGIEp*q30fYCs;eyfL9H*$fP`?W`d2%!UH&Lu*Bob63OgUOI2J; zMI8~#^XM8i--p$yRf%4=|LzWbc>ej9?^OazVzBf(6e(P4#3bxIJ6WgT1!$Cx4F|ew zZKvM?L)XhA{3V&d^i5u*_`lS`LDtrgiko*(0pw440;PrSI5>Xe z+|+^%XkXK!b1|DQj!|uY94>K^X;GGGQQ)cc^aN~QuO0={At+t?JYu-V(Z@`Xvr4z9 zB+5xi0*`VF*GrOd5sKGj)TF=$(mT ztuY*7QRiB)sjW4~&KSH?A+OKh7kMxP*C`MzrBNxqrC;Lv#0iS6P)4qQBR?Ey_&BAe z<6;@2C^9SW(J~_*SMMztNw=WJx{Uz_V*6p9fob{+a66*a8^anB+BoCdT(3{)7iWSM^LFhkQev%uc-G(*P%%J<$mlRuk5|Vg@!3jA znfBW7V8p8Pq9nS}-?ekmbKgkIs}!`T7bVl+8~& zsE}e@bo^Hwq$=uvINKlF2^u4&B%~z<^0eNO>ipnr?c-4!l#-f$R&|f)Hx3@dcux$Tn=jft+i{> zTm|Tab_pTOq=8BuYEn-c;j1YBNu$-51nECo1lrJ3Fz`ciSfTYinl#41CGe+8awx@D zEnFD)m%Cl&V-7gwbt9@(J2X9s*PdG^QTPvlnF1_u-|)LQB5^$UH&^0i1HYV>cRZr9 z0WN-l_*)DBYB~s4or{Q%y{~O%WO_2@zf!!Y%B5E|2`d|ZUl5Igd568__#`(5E4k7$ z01&`9c>@stqZfN}ZK(1;MIKgfH%tdPsEWM{w=lhR0H#lEx};o6hUe_Rv68IOAt^=8 z06JbJ`z5EyfkOyL4H+Tw?#m7Ef5ks1r|GC4rieCqCyU;pT8Uz3k*fb$PP=dmE|w}& zc}N$)`zWBN1JFQ!{l31Z@-VMQSzWQpgEsuggl zjr8|8!__Sw>{<@QUgUU+ar>nS*qQg*xL!@MjnH!+dj-a#bm?%aVy8*lXYLf>`*)(! zrP~(SqDHdoM(nFcEUEARyXXzB-5IdjV=%)R{;G)Xg&_-!AotXNPmbWMLHs8I<^Btf z1KPhu$uhRwADh0ikK>A|HdSDTspiOr$L;J;75ptinK2)*>w=zqzHAV!E%Vxzf{Hip zto-Ws_d}+5w1J-L4wITIgZm62ARS|HsZ&kv2@g=~-&J|LQ7hY;5?vV&~aBpax zwIyIroWVg$YY)U&o#g*C{Iw0KIR2lilr`oE1t;A!1o6ZZHEMd*^NV%^wb#@Ac>Ef3 z*-ayc)g$s$>wk(29rqpb#PiR5O8tY*6O{wU8K&R!+J#DK6Ci#3eQ|UOIQ)+(G3=lB z142(i8HGEc{~tqiHGNq$QKa7q`z|%{3V9{eT%Uk%Mh1@MY+~*f6Ji z<s3D-kbN(Q-g;Dzl?p=X7TEW=FM+Bo~ee+F38 zR&`%Y_RYZec`UTI^-Bk=Y&T_2(aE4lRtuWO7*3h3dN_zC6I|%u*@m$74BPn#UZeJx z8Ju>(8&9Bn!Mj;YhFsoC5%fQ zk@O-H&s7;^hT_+BaZIxLVT&1*=P&7NN~9YIOth)Ip{U<9k>eer zC9^@=8Gf>&sd9?e#Qpv4twxI^V}waxLb+Z6p2S&SCm9JZYL76kxr4ty%6c2mI8;uU zQ>(bG&P>K1JD6~ItqYlFo-7{Rxvy@XUxc-`^S8tyDLh&1m~Nr%{THM4cR0+!VYfmO zpM7~hHz6_Undh5hrjopIG%TaC+4~@=S9%q_HzJ*9nBYS1kpJR;t_>M86;1FHa-#mDKq=_9BR`eheaXd+kO zcHpTZ`9<*gCDF;5bjM93O&NOXNS~Tg=LvVz#C(=CGpIXJZ&s@~3b0fxiZv{_s0W9C z3`R+cr=@A8O@z^NPQK$L#xl3iF_(OkKP+D{Y$=|YW|c&AWOn1whN3@GavJ^8=wqR* zvD={q;K2PA&n!v8oS_}TvoiNw`7q+;htrz;fN}CvKi(!kUD2WY`HO~ z`lGhDv7+M{Ut~{I(A)PqvRc$!_ZR&z6AwC|i7@wbuFVhb45CI`Pv6G4KFxxTCjlX# z;b2Nm*VD!|$0~^(n#;Ti_W%+6+;%FJLm zKb-r=cJO!Tk3NgPPKzAix0Q88mL|$6DxXY8hB+GpArx@g{(49`z+-7$>%S`?ujbMe z0UiE~%p5ydE!kW5Y>**_lK)roOR=0c8M$tGPT^~sw0F0L+&Q9YMfnmEtU%N_sGL* zsw$2`lJ7TurI8kAS`z}MZ}J=C{VV)^nG0?=fX<2DLJ2QKba?xt6Jr9=vWs8 zSoKPZPp9MaFJDO$C_JUGXfmW)*ov#894yOxJh&8KTxIvDr)+g-8baJuRHbp{6Ho`H5=9fb%gh?&v|h-b zFdzwX1<@-7om5R@?H9VF;*aj9g2x|kIyD*a>}bWXAUnT9!F0s*0m{S4xvw{EMEr<< z{g)POqzD~{*`!fe4@9?H%TV-8goUZfl_xO%mD@a_0BJt{VlGitMT>)7Z%Et_kZyTx zJK$j}TjnQ;`?I7}lwkAw*?`q0?b-=*!oQsNT06lsZHlY{bNgSyY|=0%&GNPDxfe|J zZMd}N`^)P%=2rJLf79k3`zJ-9843>Row2D>XDH7Nw={oN?ZZH`;gXu~-|7D)U7^I2 z_seNafD++ zxQ@kvUfel8+V-1V3ux+a-UYE#-S&3t7s1NZ6nq>L*Nf)bR{j8wjyY9&q-`f|M96z# zB~ROX{!CT&vl3p9&jqW;N16kp1jX8;$PNUSaucLxIQdu5B#w#VA09WZ|FS{;uyvu5 z+M4z+(pDHP*gKu3=t33TH@yFd@KEWzfjext@mHW)w8dMS-vB=*wsJXPiLpjB``>M8ZpwrvR$`BH##PX#j3}xG2gIGyb(Q1FwfBrv0zCX!~j} zkwQb;;qi2Xy}#h$%=PO-@NZeL#RNtU!G!8z=>GoRsHpydVr$?#Rxn>b-Q&qNaV-2A zS@^ugrfw|r%Dpz!`4LnMpfIcV=tMS3bA=-`4W=eoU8gY^vvAgv2cyW`+xcxEpi%f+ zq=j5hP%}b1&$)bn!toKIbTVty867X_Fxi&Li=L}}TLL5a6ptq+=z|_KqI#NCNMRjf z05Uj51HdVc<9}j;A&-+OT`{sV!N`?kjDh6j_P&9A!f)f?`1)Ac6Sv_?33ZvzH(25L zUXrzdnd{~>A$-H{yeuQ(_{c4MHm&ZlLH^!Itr~P90EGF&37$T~-D&8({1~7JZX_-#WyOkXH(_>=f5HTz}rC zzQkw!%#o%$oR;^S0xosEs2F~*&u7>ye^L<2U zgjK}NpE&$+@&UUL*h15a9YPXZ zQa1ctlAOyB1b7{h+kYzo%=ksLQbnoD%m$?x0JJ%zdb_dtREaDZhY6^Pb-`wMK@5P! z57YCVa2Ln-4LAgOjz^yB&4Air8yMcsqiN|Jaq=po_u37CAO6}c@+J1g8=4Td5styE zT-gBO=k;Tj5a{&D;c~YPvB>L2#%dxoho+XSfVP54Rf?(ZG=5DDq17(*RCVenzqCa9 z;b}*eg7}PaXOrQYC2oxNfgg2p^pVBWTj2DfV>&A-*c_2dfKemL$M5r}^No@HRJd4+3o}C6HtK}uDPx0zlX@)nR&vxFa6fG@*_S@yXk|R1f1v}DEw;uo%ydC-DuupHeY2&7DV$|jgV9jan&S^`~Q3df#^v~ zN3t9Dzp~o{_|laC>Q%MdAD^M7>0@MvABaJgGr&Yi30nmw;+09Mt1W`R8D;?i(m3PI z!129C{%-|tB0@~`c1|FjAdX4(b5?P>$b}s~MPF(%rE@H+cUDvv@>|SD%L`1_8Jm1} z;g4Ul!d+OWCFpYf?`~3jK74W{gf{`aAJ(V5e4%JV@X9T+HDO(zGwLu!R7Z`H)~mak z8$P7yY}07FVZU-FJm|`Z=eM-A;9*HXW@nxLct-y%3;a&hLziPWYGk-mms4+oUB!=l zt=JR(7w6_Y=jQa)%+uXfT{YG7)J)f} z>Lgg#w+kvQsmb@xCR%KMgWLQ~J?gOjo(`SsEq6dn_|0(Yk&xAPZN~C3C-YR!_d=h; zox4T;n)e}d1&!>ho46nU>qDSz@BOqulDpg>*OWbEWwpJIUGHI=j`i9aw#2?N@j{dO z-zM~b0QKSLMqEv;|BpuKaYFUZnFX!yTwIQO*f@j7H*XZJE=ksl(%~4ZjRVjl&@@RO zJOyZ{moQVhk##7)t5A!6)IQSGZW@`C@CRdWDolS;P!imM6;?Wda+J^IBF@y+1#Rds*wRTkswuNVx4~Tva5c z5tj)P3#@JWaLLpXEc{$%{+D&A&x89N(bA~!x!nC_Fz>y8fyV2%<*6gY=M1n~?D@|I zS&B1!Sb|X&+9z3&|$Oq zmcM4Cp0JP-pQPf-W!b7wOp^Dcog01gD}2`mICP~4qMZoi@mQ(hwfo+mNj|rd9Qa$Y zhuO@Mb_F2Tme$)Ids6~U-l`q7X&xWG3?~^RVF`gCvIc-?=)1ByI#@0jg~+N_Q|1yW zHGEi9HokQR?A@ATa0n(LLLODXr6&F0azx~ktD(SI454T!(v2w}(4WI2MM|6yUM&5} z)``jq_To%@hxvBsfi_UB{KuHWNnsNs&tHJ37H8)y-@qmq6?c%3M*%!sM0Dd&s zxbUd@n$MZbZp0Hzl@bTvHzY5OSuH12HQPkW|~etNCuRbmJ00 zt34FsZ`4`d#DBDooVP~Z#15GHuvX}Wt0;k_ z%4Prv1R98OaRvzqT7X?OFF~<}OvbD*=SM;|$Hta{f06HyF5W_OrlSDCvoQta8s47w z8{XIb0hnXtqrUdUt;zxY_1-(bctMIJ*I&fa+wRi4?qe|WG}8erm)|YHGIP)j_$q-v z(0G~-mhEEh>S{trq=tF=aFOHxE$W?U}RGBa& zss|a)k{5(cs9Og^WSOX0uDIKdud`DJW2AaHpPg2!gTjzk^tS$xY!o=Fx3lNS_Iur! zw5E9mxNn!eKZ7?9>(ixzHCtn+o;_U-y;lTQ= zi-jV&Z{?IlqT&?!3P;y~RC&YLR}YuCGhuIw*0j!fN2R%#lFyeJC9uEQH0nLz;VAN* zx92X%wM?o+Tl|M)`k4`m&3Z+CC2i_MG>EjO3or3c##I)^>&>{mX}Fqn!hh! z!a!h-+VHm_eTSiJvs;So?*Rn41}t)cZ(*xqcdlcm)&eS6mZ18KRuDyQ`ptJ^$V1)1 zMP@bH?7p?<#uNXyn!ES-7o3aiw|D=tUR>c!o+>?R>P{cHwMh~7naCYK`<0?`+~~82 z6q^(vQqh)&M?{u*R}kKscDQFsX- zq&Obdg^!qU>4N@^U{S6h3b6bX27jHX$kCsg3zNtUdMov<&tzs@3pvnUj-`R{SPPqa z-+F!(++<|~C@?cKdq12%JtALF)?4|jj{PQ-W8*QIR?k0jQ-@7b7@bB?H&}X;O=Y z`(XxDn7>8>t}D990)YP7cls=q>(q9Wh!nqbnzjn~X55He`pb@ypEXnevl zNiT%741|#&@P{6hCxMa+=|Dsxycue&Jg0+fTkj3j2DEocpkJ4j^nhH!=IzVIFb(1! zNht0ZJ?v>f+>VFRQ>~l^nO*Bs(YngET{;<@>v^XT(I}_l4=UtnRzC@3Ft1dyTCqVk zfdhwp`iRr{sgVwr(w~C1nSK+8rD`%SW2lLwn)Jk7(}+DSX?TABSQW|qutSp$ZfP)_ z^%g!tIR9Y~wkBq8gb-5!^G2uv={J&pWc`siFb@ho*v=1U_T)vH!T+)5;E8YcCDSX2 zLK^J}Z&JPn2ehN{_Y%{`)OuUfv+9&H7@gB{Ei zM=vK|h5Q4Belq*bEV1+w5q%}IJ#Gsj!4btf*N322mArnbgp52kMZ92{aOG?g_K%Q#MrksbgP?nH1 zZh!^$YP)K>ww!BD*T}|3z@lc{&5fPEaRzs1{3#C5s*|%`Oj5xBm zPG6T0dM7{p@tlqldakj=_N&OIS^(D4w)&Tcgu1S1eP>Xqo(()qDy$hE`RIZ#l@u+J z3bdKJn{N-!dm}lu_H8w|On>ep^P>Dp0wF27qsZGXYVw`@*S_2c)$Gg)2dE;xQ807g2nevJ@^}_DX zt}U=@HvqS|Naf*gS)J7IkV4}}Q3V|&`p?ghoX~lQ>jX(&KJ;x-4_^*9<|W=e z=FHF6$AK(5LaSuF&@Dfc?^V~#V|}3L~uNI z{mKgXa|P`^#NqazxOC0@*bQD8Mw2Te)nKYsg=81JOH{Ld7j<43k8Pvry^8px#KKE^ z6wKYvowN2yLIl=E7&#xVgd=&X-&2RWRVMCnzz^R8StyhkK|-hNDWE14aKlBt?iY@` zCFdXmQ!En=rD*nMpsugkk!>X97=$s48Vjl{sC`2UM`SZ2z4@#KW%_2b&xT=>Pj1+1 zkC+5i^%a>6Uf=-PlM0Mn^rKi#kU>jd$$3n~*CEDA$%p>TLCTaq^Opy$P36-Er zwP+rPU<+&-p(2*WCl=VxYe%AAvu0XgTVGeKO)Unt#BarE*U9&E=CjC7UP_o-dN2>c z(?(PpxZGX1#~)rfg5RmNTw8q3CYYPY1C=k1MABc4b3i?KZunwNi$ZqTGxt{ z?h8oI>Fd0uH^Z5pM{2`;hm{5z*})rxbgAYhKjl=3EVm7tH|S0%RxDM_!uaoL?baP ztd4%B!S)sV*Kj(8r6t{r)}^Ha>X)o?yHPeRSvfTDTekj zH8N=kXt0q&XT03K&#%n!WvB+VX*2r3rI4EfxAW{&~Fb1zHHiW2{DP&w~K4oizb~tpLR9q;aeBz-_tTm{q)Dw$Xfi?<#kpW-qBFjX9GrBFh z*ePT?Nw*ASx##vlV8ugx-Kg-v@TO_{jsOF>Cg?59mA10Tmat5ijO&$RR4|g!l~nU5 zP%JXeW0Z?OaS?TG(qOVB;*yvN#@=rbFRsQkf2D^zj;Lm{zC0E#tTM&2lzn52}DqQ zIV9P)aRla=y2)qtKF*C#vLAt5+8=++9PAL6C>aP9fU|Edn91zBG*Bm$sOM!PZ*z8K zP?j`LTcpKOmXtv*)*lB22{22jP|(_rkw~5JlL$z)S>jqoHO^DK%|M-%R0mlS=@Urv zjT5`|Cw#6qv)bmVfKkEs@uS9A)h|>7AR1`y2qsJ`vD-n!0eutgy0jzqhRN%oW2}%7 z)|?oIm*;g9H_-4q%}D&AN(fOkZmg&aXUk8_3HT*WALmHXH>Ji!T(6p=|}|T4f_9W)Erl4(wKf3mz8( z#|=iP6DWQFOwlxc&{%|nRllTP&$4_%-2~5{+5M%|tqiXdWEq^IpkR52;ADF&LjoUD zz2JwD25jN!f^B4hFegkKx_oK^#1(DL>bsxo;F=VE%BEjIZ}M%+{m71I%i+b`8^|7z z`kLwut`602kP0M|+~T0Ex3SPiZV%@Oi-8KQHSTq4F}s?CE?mmwFenWth@h8nv-{f} zVf3r;%}AeJ#T)EP@dIrt+R%Aal)SrFCZmgpNJapf^~-j%SC#Z@bpUU#SoWV{Ou=gNbcd#Pk5Z{RP0`ZrFDEqo2j>tbZOp(^tZC!q+%O zfmJQMu(@urpC!^~%TMbmh@tW6sxcjbj9e1eM1_G>t#4p+Vn2+le~*AAtV?khbKs=< zPlV_^&rLlkpw+*(UAaV^c0c!z+BP5()^q5xM$%SRE&gvb#U_mNSsp)zutQo{ACGJU z+Z<6*D0}~GBm6CjzbH9<4YL_|nV$k`Dfx8oA!3Lm_?|J5T$jV;K3cOoxQ+3DGg

-Gm@z$O=7%4t!d?qob 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 Odm!4c9S{E&0xQIulC!BT^bj;A_r_5t9;JQ{o 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

OKM7f68``IG6Q(?q06%eqLvy&Q}JAtHG3h&YWQ z^jqRB#ANpAYr;YxV z^iNI>+SLgnwizCrQjPCQQFE*;C-{

44UzrS(2e`d8)jHONBYK{9F8uW3Z1hWOaH~#%#w{$1Lx{T?xbLduU{>?X^3tChzM{${gWXZu zjqDBrfYK(@0EcUV{f_LY)|3DzYS+j}?)!eUjT5&4wh6W>1NRC^?2rwluywO$#T^rb zIt&EeQ*4Osqs-)^Hz!ml5|B9n#>MYr}T9~e(nc+3-rt`YG zvkwV4Q*xRA`E*BeE>K>(3=$)v7K@8(;o#(Qrq$<);gxxVF+V7s=A!_dcrj zQe%H|3T=%*M^%66E8OFTsAgIwhIsiy;$w6gySFCa}-};q#wm_Hb&ITUvrexN0-TN8AV? zBvdYZV8quCt-23(rDQ9{k=8EP)Jx~bc_ene#DG%yLYZLCtkX;*km=@GAw~*iefb;u zvX^}2a^o@d%>*iIV2MKf(b!%-h2ViSVH?|YP)ko4p-zPclA|1{NV(R@oPx&JV-Wees zZQbIE;tpTrO%jSv)k%MSS@qDi=XnaU_5NY^{7{G26&gm_4=XwP` z97Qi^Loj-N@R?t}a=N?b1oE-WG)kl1Wr0*jihK@$$4|5f;obC_*^nEO=X|6|ShyGw zd}-q8EtB~OFE0_aWXiUjLx}9-etv5)_d==#G7+}wuW_)dHSmO#LVb-WAM)k}Y*t+44e%!6_bDPE z3Tuu)F*7o$nsF$8L}gv)MoiXC9V4q#c$ZVeARRtJ15-)|5!|Bo1gGh`ql>dY0m@57 zCr3X}Xt=DdtBK(gCPYkj3CymUlCTv2jxWKw`^ZH4FjoWGJ1mHKUgwZFv;%h9u<^>) z?@ssTY#4a1(CV!|C6u4&#Waj`6tM3F{2Aa6iaRLzIwsFr!247#FiF+9Cit@$qDC=C zT|5zaFYuK`AW(!lPCPdlkU3^I0QKdy3Kd6^sr^VuND!!+!ps)az|rXGw_<+JJ{=u_pDd4rPH*Rt1a zyk|KtM=m27Cbw)>dngLt0I{dMx2XzX{Pit@cJ8jNqnUg_@z_wXk4Fo8ak)>&d?J9< zRVAh`O{02;vjut_y03l{>cC^H`6lAHSLL{;^y0x4F>@ja@bs4v&pw9RWfLxdWE1Re z%RiAuF;ifTazv_G@lxDOh}tO5_7=}m4K^;I)2OR&AWiQ02lFJ9N#Bt*q}XqN^+k(U zIDIz5o@`*(PH^cqEp3ne0OVJ`Mh`tVfMDz<*93nTGK0bbeQs8^(G_yPYO5|1x_U{hYsg7WCQpl=1G`JXRIm z8z|H?A;aFVJK^G<&|qvJK_B(9KEl7&WALv3T~BP&{}OO0o;-0xbt`&5Vg*Esxqyxv z(3a73|H%T;NFXEoZ$au?GgxL;qAJc_%$v|7Gi1I`ibHbnmG$Ur_tLErj>>j;>#w-YYsez`Af*Nn;Iq?7Bx@P5jUeua^# zl<`#fuMkinY2fe4#>p-Gb~K}dp}PDO5e@gNWZov3LJ7KM1s8szm=ld-_jH?j4kY9)ab`o?pK(K(fc--0eIl1^+@{ooFD&bju)=R;x;zHKm|t8UQuTEe<(FmC2MRIwC0Ovh@N zpAq(}XYpDHon*n~8|NZOHtBCr1SSHPfq_0Fc?#s$kmd91r)YM*FK0uBsOe-5vGFMY zmnZS*e5Ma%|32gU1FGF+JVZE;I`bT|XhuF3*QvWj8xsGoC{4C8R%#iO)1vB&!9Pz+ zsza_{?T003#_yxUGQNe!zrW&%MWNR~DvADP*xA|(ZC{|I!$berk206*z3&IalH(eXtYkF^k{mlDD4nKzs`VA({U`YPg^VX2}G%+KmZNM#2l(r3{iZi^Y++)Df27;K6ROgrK(LE{mYXLdn=!s647*z0wy$-K*AQ72f7FI$CzL%&f{F9v%=I?70F)1;&a7WJ}-*m7oe{n zBye!Z$SV-SsZ)cJXZf+BN+Y|2lkG*r0jJ*l(8*IY2z1>SozN3zpy`I`zLuRyjU5EG zk^p{9((DJvjY;WkCn_M_4Gvk!2vSTFAr+RqdfR`LvT4nml5JU7l{FGz^s1?6@7*k6 zTN`+sYwJt*=CJ(h*{P^8omz|lJ8i`ekfF@51jrCtH^^!X3AUIP&TBmY;-JPF$RtIs z3lt`?w5EXn*))sKasx)A|G!@9eFGhL=wP1729bOVOGwr>M3+m83ICiPRkQ{0S(~o| zYcA3F_cHCZVl+nGG@auh`!DNHN|w{<*;-AVp5*MPEib z$Gev?^9Gfe;Lt6A<3Nc>{CNgS3+cV|B~M8gT;Bq{;qF=f%eH-tMh&aeh7NW)+6T zzgrN3&3=ywO$A*E3JBazBK9PaMEMj=B|xBJ5)=`ZAjh#QE`}hBJUeqN7MN(VX`rr= z5&Lmf?sG5}jU`btCXMfDp=2N(j9AVY#}K;TPw4xKY;q4|PNX0{2w8x%+kHafFSkT$B4vEB5_2E%K2b4hsY9~p;tCpx{Ky;|5IVHjBtXm<79wee}8G#i9u+!7i z2Om@6hS9-t(b3U~-6mh`X1KW#)DQ{Gj-q(7PJs;Rv%-E?+-$0;0B2@6LvlIcMd*dI zWq|ou7BT1w_K3~#qM8Y7qfJ+ock|nao%hHMPJqK|j2AOlKQu#-M#2$N9{2;%Z%hzNj}l73?I&cSjaD+agJ3)gj&+9^8I&u}27R7VbodnPwID&!$%4hMJSeWV!r9 zalfC!1agJV5hnSx(=eyX`j6v`m%!;o1#z|S2ab?GHI=#7Sp^Eoys`M*Ou;b_dOU)Q zT<6JQ>a#R_jf&i02ZZ$MNj7Ie7WV$u!g!)d!X6VP(*GbQ5B&0`1v&O<0<9l1;sFDj zN@%xXf{nM24+rS6jn6@o5_+dJ>Ar>O?^5{@qHmEdqaJ`dE0QS=Sx6YS^ws1?#ECjr z#|Ii|*P=V|y5d^D2VXFR04@6i=fmlF-But_r^-6{sre*IfkmkvDwZ#_elxSPK{NL#oZOn%jlyN>Hv9)l-&|d zmV%CDavU7{{XBrC(FJ5+D<*@swnp_ZZyR$1-OU#Z=!)Ia1c4j}Q2^iiUX%j&QtN?V zK5r!zTRcFjT0d^eBchY*xgoZz2zEuzOmfmYMgGxTAKvr}!x(#a8cDGVj3K^=9kyn9r3YUsdR!2{`U7dU6!gA)vL{jbn9QaiwIe=`N265T3D_>d9OU6 z%ipw=`rV-T<2!J9%^~}mal5+#km@NlEnuKpYmZYxdj`%RSVo*YaOV+4s-twHC>TtT z*##1hmT8hExw-Wn5Bs$d>JF|4qf9p=cy?cq3tx%*;u`US%QGwNF)7~cxA7rPHm20K zh8O@9zEPA^(mnuihmm4&EiNo z&Lvsy&n4;pVX9RNxxZJThs9=9zR;(REIH=^_AVJO^n}`A#S;GF4I4CSeyO30a;Pn1Qws(=0s^pP>504Cn(uU^x_SOY6<5~ph{0ql3 z5CIH^!(lHDs%L5y&F))}gZ1@w8m+Fc$K>*OeQ|M>P9y*{adDNdieu9Bp!AZK{W`Zr z2kD`~_>z8}AA~L;9Kdr9{yS}`75&FT(&tBPt~CO9-Hl#~muCdKrr@NeEmHs!uT24j zbgqxTZ-IrjfH(t|0FGfdty3p(#PrW$sb*@Gkk7i9w|!-{){M~}eM!?kFG;Q*yZknH zF-Et5{F@-9h68xc!GBhD1<`#8j_Df}UC9OTt5)o;2U6FH7hAyM1+9Lcy^;ZhBP!sZ z+fOn9grvAYXPzg);*&1KTVM%bJ1uQp3u8X)qyP?kz20sdRL)en2HwpVK-j-6UvKPy zHGm|wB(JA{3iwnXJdHNxwuP5c9Ke!sN&p|c?>r3$(AMBT3%jxR0+{qfur3?GKEyj! z##_B$l{`Ay(&R3%kk~rfio-GKt)rta;$YR|M!c_C1L&nHb|PYH9T-0YRL`_f@xy5J zFb+!EPINDo&JGUcKuYiLB|(7$XhSZi()-`f%(`3yq4s)bQQT-VggJmJwhJKCHCR@W zwc`NL*n10v`I{cdx;r@q3NnC&nYi2mIV+F6Aobs?2bc>4zN7Gt&(iF!bzD%+)UF)t z?5P9TKj_K|e&Zyy%i)=T$N6tPb{S?lfGYM2U{N#`96-_p=a_??J!Jq}T*nODpi_PH zvZg2joZtYeoYMe;3?R$m0NR2ofDZ;-WH2;KhdyV~0yv=imIJ850W22|cJ@>OtZ|Vl z@#=@5EBKN43Etz!9dxSY@#DugoYDsm>pI%&YQ$A~pMF7`>*%ZcKpnt3-UK7!2z@jV0PtTXHONt zhc43glT$JWFyJI0SIIJX6hK3e185gt1GA^E9qjC>0{DYV*ARU8fi-|LbmGRW{E?ns z#0Po+4G&cT42%y91}}Wh0aW1tmWvM^?ChxmXasNe%lB!lRaal4VMTRywMHlO(I=U$ zk-1C&2dbv@GC0w}L~ z=onB2P-^D@s&D|y#9!>)!E4h{9Ki8k;rCu3Fd-==m(ZpmlpbnIP!VNdVX#6$a%rGM zp-5o6)QeDZozM>a1BNHrahKlx_k6E*c_~TsqAr=g&q03e``LQ>(k@+PKpq}vRg!Nb zRls5Z9WFd?336?E2w);krt)vFqEz1h?AeG*TMA$$dJp_RpcjC(z*)7sm5iEnSqxy0 zA4yaIpUNR-Me*&e$=GIpZc_k%fvy8Ten9GgvtQbM9&srx1aQrdY*YZ>$)Uw6gqPG?oEWE;p>;GtUX=bAW`92gg}C?=qLSpm62a5w{#w!0GjI z0GF(&9jOQO=~v+hArFtU3g+3{L)>2VvxWuJpLdtCOSk24Vekoh>6(QmgC(l~!EfM5Ca=~v^g1+ay&W?5Q_PGQ*Q z0*Kc6#Y{{S40;%9B>~g|ytd_0Mq7Bx1>WR#%xHaXqoWm<<;vV!W1Jo7h+c$~^#TYX z4fE#$Xm*(J*8;e~R)UyxF)a-3TmU@{mYBd3v;l^=EeYTb`v8tS%F`n&w{s$o!waos zc@V91&=U1HIxb-zfad}sq+vL#8xExgxZEM`99J(4+VRf-WyHETZnt;XEeYTf4G@9s z!`9vF0BG^JzYcRd=XeLub2YV`xjWp*j&yOy!Uu-}NJ!%}CV;TAm-E%q4@!n&06p9r zmIQEuI)H%=7|z})=yQw~Za#opwBi`Cbp6C#$017@LhDO=)7RLbUap)BwAr01?01huMPL@}0zhnSN7QNGa z08{L$ixziBLmzkYj}$T%o`M$6b33PzXBt{=Sv>_q3j}pU0VJfcniIesVtRwPEg1k# z5L@{G>Y?j>cjh_(bkI+`ni`mUb<=V~9Wq^Xwl=zLwWGUk;9uWDwyd54CKz;wS7vrZ z0VJfcniIeTv27w6B?CYlxt)CgQyIVn!01I7c{&K5i&2srwlj=^1e8-h!qqSu=XPS- z@3}b6meo_hz;+QWBRd*k7lH|#UjQMbVVV=bU(*ML%f^Owe`XAh2d2X@oykW~JL4NM zwXvs`^G~74mBSGsKiI8f8-!sf0HQ7u=#kP<5JXLHi8azhmOKT$3&vqc7y_Xm=e;3L z$A-ZVBjFsbeq^0(g23Uw4BCeG3=BrKJFl)B1WOpl@>?W62=`2<$>x z#z!9Y3&e1DRTk<000000000000000000000001hPkV4600000 lAjsc(g9$1C00000fEBATSq2rbxD)^Y002ovPDHLkV1l&tQ7`}i diff --git a/chapter_graph/graph_traversal.assets/graph_bfs_step6.png b/chapter_graph/graph_traversal.assets/graph_bfs_step6.png index 762b6456edc4478e5888d21fa08190142dcaf0b3..8f00612388cb400549acdc94745721a5ddffbd79 100644 GIT binary patch literal 36438 zcmbTdWmH>T7cG2};O-6u3KX~EQlPlILve~0YjH|&r?|UQq!cY4io0vE;_j}OKJWMa zyT5M6$jI4Qd#*M2(v0LJOhri=9fbr1004AZ83{E2fPc9Jk0C)`UT*SP%wHDQDhe8s z&(F`Bo16Yke)~uF?d|P1H#cEnVUJIbf`Wpgh5Kh`XDmv?D=RCoMcDE2v1Y19-cauS z!~Na;-R0%w>e0&R=qSG5;MLVt{Zw0KU(Wd7#r5@#i;Ig-K`Yr4my?r|4-b!PYislK z^IBS3@87@g=;)}ct7~a#acntJQ&Srl7#Q8T>+bH>)6?ti?X|VFm6DR0o}LyK77h*$ z77-Eg@bECHsvjO69vd4|P*4a62q-Hn^YQUq%s`Sa&b;=p-&diue^!P3%F zRaKR&tnA#}Ty=GIe}Dg%FJG*ztc;C~o$E4+i;HJxXJIf{YHF&PnOSCLCKL+Y-rinZ zT(q~hzrDSUh=@?Inu?E)?_KRJEiF}6R&JTz?(FP@{kgXNb!=U?+t}2Yn3$N8lf$Y! ze0X^=H(evAAHPnK1P(RNHCg%o`SbTW=f{p}?%dMhb!q*+Rrx~gM9tvj zd1~qQ(&~m!4gdY}W45rbz_4gGwJEi1;-G)-Z~ahR{_x)T!gxqpa8T>U z#LOC1$Z*F5Y<%l7vHcHh>9nwCseiV=vbB;nY{WXX*)1k-cQ>jQ03t|aCB!t`7Y;i7 zUdjT1<~)`XmV*CX{=YqpUH8Wj-cusw>=`N7g#PCet?IOCOR>zYS&;G0;6@W+#bu1UL{_pW&>Ha{pA#C&1o)79sMJZ zHA3icj%3fsZ$Prgz2`S@9x5l8ze16enwa?Z^7#1pX8z`?V3DhJF#8b+;E@Lv72p*F zQp*sAu#(>k-0=);s+HB%PZuu~EPfoLJ5>J`@U`_r)(rdAEUr`Udr&6RZ~T~ZLSv$y zcY^wTPlouj5h|jc?2*sMQCK+57KV%)zUaXw2d$_Mu3zo9(tfF~foGIrQ0e-KNKw;d z{Wa6Fw1Z3zf;ve@MLKo%q*B>1H4R*IY0a&uX6@NHx)$HWu?&6o64`kl)`!U+*?J-u zipZXH=Y35*us24#&dA87{zI0cjFi!M^j9FF&YMQ${@FKrz&8;hL^0!3fW&KKbwn|2 zEjGCw#uvrf-{pLp-w_VX{E~2>g0kLrz>Tp#)#M^tzT61JUi+x!lDhmT_`NHT!=9ZaT>RTpeo;KR;Y?0d}oC2w*;o(VYsn5wwXp# z)>>u{=#l_i7ixlDp^=QL|A40tXXj zmm32iv0auGNT9Psbsd)IH<2_^VrRM!*f6KJn$kXF7>@_b@gM%!U$2PQF#3oHXCSag z+Q&_}l1U@|<*T^4^&%c>`p3_VG~{AQfXLkNOskK$DM>05uns#fj_P2k$g%1j7ci zlVjg~lnQy_*oV44rzY20^z-oI7uE{3ji9HMr=8jYgAW2JA5)k9(1F!L7Ddj~XMpq} z4AuA-4HN>9$AQ>KJc}v*NERtep|4WXF)@Mph){}7Qb~2Nl`{(4l zH#nfdpQhQ(x4uA9QTo@fVTf@r36ZBntM$#n_^ zxyn^5^;Rqi++|?{q|6u1j;oZLbY8)(35Y+A4qLZ=IOZs`jgnjR)jG4NQ^j(=5=a`E z@TpgP>!K|r&?PdEZ9tZO?ql`d^tE6{J*pd9@?-OfCh*PI2UTd?w$EKFw_aSqVMLowC?XG-I zrI*G;#qsTOpJZYffI#U$kZlxz<>7o#FmQ_UrSdDYF>nSONR4~ox|MK-DqwL=_uc^rV^f%ckP75Y&XtYN^k(Yv#&WP7`J?Y>m+^7zV%U0mr`&H z9H)vZN+h|Y2%eklcsP=E?DX1H|3UQ>pU^q?dkhs7H_-9ETRXv^4rgL zvm|_ok4$%RBM_yX()XoM`O;q!uEA@RST}v^0R)74V^&Pk@r!-309a55{AlZ~O_06!O&Dt#8uC<$PruwI=U2|srzQr>UyUPAseC4utot{Ll z3x~5Cct|C`XHNO|ml7gba$+;H5wXx6P%3ioW_$O5yD9I-*RL6W3OE4@H32E5ecq|H zPECC~J$4DiA2)+%zBrNVoA1{x1&hb;jap>ApFgb?X1?zpNEJIb9`-4+!Yt$QH1SR<^+8S-}uu<`z97gn7BqZGBYH+MV8o1fRLik z!6~VraudXc67Ymm=iSttA}%1=i_2UPuAr`K&1<m`!{eU$dHRN%Ku%fp)8F9moKiqx<oi8sd2qu^b1mPu8k76ig&Jd|J7~ z=0n4~$o5HZ^;~}y-ho-zj!1}ox;L{f z9qMs@cDc^$t;%Fc5NhnlD7>6v0aHuzs>ro!m3=?i%d=lQPU7C^;Qxbg) zs*_btSd4EnbmVD-u6eSDeJGL=45t`eyo9)GSTwhZ&>16T*n@pI9(TdY3 zPI11kfpG4s+RN6W;L+Kmbrwi@C9yOnbr|ubh9GcwSjC7Z&8t-lzDR}wjo(kmxPH;n z_C(aX+hh)-N}K8z;2N`P%IqO0i6X;JZ>(L~ztH+b(JsAE>x4PPK0{gSl`8K;FIPOt z>tZO7X>YXv9@7UhJ_}c=JEIjHra^)xHz-m}4y6AK7*+s<>H5&P`qXpwz`1ErS9d+o zhr`=A*;z=#<1?w;9}?QdEVwGoWF7*_PMv`IL_v&lIQ*p#B$AYV)_I4}R+QBpc$u5m z^<`6FV|x4E%(lI+*O0QNIrmp7CU#;gAU4>%d%lYnppwl3TUiF2~lGKFWdQo zBMa@V2^sE6tW4J>MT37L94dUc@>-b@0DMS-kkIg7|4Bzjj;UOtB6%(9mpfOK#$tda|t@EuO9V{|DOZ1*DU15ORWE# z`b`UJzq%msIaCX(RSmFBUS00n;~9s_fkW}m4`LWsWNxbk-UKsnOWn8^1;C7M1!$rO0|aj5S_WSU+Ilwg$Sl-2AG;_gy@eP zusedT6uETKz}|G&OE}C{CaV_P(zfC`2x&|sS-=x>w4y)S6lSqZ=I4#U zyXXxyI6GOzJkyJ+zCOcJ&8g);dpj>jN}JnWRcy!0PP-w3f+c2`XZSwS!rF|e2SsLb zsL*cn3a26V$ge*H(Gd7_6s68}N}E#YAeMX?29XsQn;v-A;2KdIhZts-gAHWjSu z%5mK1TWTTElG<1pZB1o;hQlr-G^ev1DN@B^@6lyAi1)2gJEvHGM6S~O?u!EcDJCuD z!<^n{5?@o*g)`YYA$p|mn(Xkuzo6!b4oeHs9a!L;gjH5{YK$j9!{8~S)o{gi;_JQF zFfMwpm?)1HNmXKaQ!QGm;`l{t!RW-n2o8B;tNK;ZCgrmFtf|k|upQq^m#5@!G74OY z*jk+WE%_Kl5z?l4bULOAi59X8&dB#ae*Ll?OtGbjRj^O3I>%-Ar>Ov4qMxKen25yu zCX)DB?|;A&wjUeV=u!uMH>efPI~oJnT3<@B{5XSL)O;FH%srr){~&ghkZrR)LN4fP zH&NC( z)s7sZ+2N;B(|h}yOmg@y#$T4TL4HQ@pM|oHiGBl(@WCg)7g*;x;&5o+HrH;tK_tGw z`sLI@;L6%;40r`Z(;w-1$C61lF&U-vIeovwz6!b?E$%iuI;r~T%D@wdLUS!8!YL+Q zv}QVJ{%-lnIHCnM>0+VE^ms2g8$8n@k6mu&@r$M(mV6hHdCRyC5c=Fd-d1$`Ggcwl z!eT9P$X<^XOyU#0#!y7@xg`{~A!IQV+L}z-eq1@Z%-)~@#O3V<*ry|<69dFL^Am;# zh()GHjP6MFAQ~u(VR@=>pt~B45`CWt;wi!HFdO!86l*&xF}pq2R17N6x%FV4@T;xBJOX zXUO#;`YeEI1v5or&lu!P8Tx%bMRp}bb!tn2YRAaWu1J<9ilZ_DQL2E`xxJpzGZLOPWbaM`Ia;D_GEdeNZzXvHBF(R zAtR-a%<8bqm zfp_aOJ}fQ*I4W;|yQO-H=jN#5*MU-vE@_}!6#Nc^A( z1s_9##@~p{xPLRwl*M42TyYizaA^DT@cH{1CUS3m)qIh_)3K@tINqgotO($3|kn9>;Dq9Ph}2{G30jVA9j8t$9G zn+wh3m{Mgh;*27=y(_+xy@M-~VQS;kAQI>?cW~2Ee09Y_|EoB#XhIsh^ zKTfu7ZcxsALpzPGhDp$uSZfvSIq0oYfFR+Hu5#ifBM27&r+9YkI$>a1RM(tw=*Zv# zC?@HjQc?!DqLqUz5SzM=;@zmnHd_a)zJ9$usodN~A+q^%S0`NwgO=h6?=7C=mKnJk zQZRzPG$D?YLwgj8kUpHLY!xJIcf9um#xAasy(p(!@sr3mZ0tc1@8NzaxItP>0uugQ zx-f*;EKqVQ!NCvRbHRT2DZ1erNb!SK=k`anp6E8w-23HIQ-Ak)twz*He+K95dQ`a= zJ|VcTl~ys=+1`J|zyJ(cHQAcc?0i-@jqSc0F6Yibd5;PGq}1)HfhJVZpZ@p`xCW(G zpRvmYfp$3$)RwMTPF;pFg?!2OrywYU0aVux1@)7j4%YiaPt*+(a^SmR7SrmM{`W^$ zw1>~lc2o)CkBm5J`>;=ko>H=h1F;DythCUGc?SDJwAeSo{Xr3@@*3^ zM)T>$@po{sQ2~Mau4mMyRx7G#VuS+LI~!xRu}#|rU{4PBjJyh&FrT#ScZG&rF@=s9 zuw`kx0#j*CNM)YZp1VCFt|#s2-1<(3S|+>?U`Ci)>BcJ z1&KPt1CC$Tmq^|2!Iz*^T<>#K@Dnd6Q;VP*RC<$bY@7{UC4fT;Bo+abe zt@y$y3N8s~4Cko*XLTgE6F9qp^d@HmwGjhFl(S>~4glWx8z!CDcwuL2C(_y24wmi< z7uXxihmKa^0DE-nQ;FMl4V;1lM6|jVB!`Z`4MBt{YCGJ?6Bck&2r@48Fa~By9o``U zMsAEfreM*>3(bLMyN0v&gjDm>m^EUL53d0f(0JLk&Y#@90hrr3Q}6LF4d9|_$4F$h z$a>X2W^nWZZVrVAr8MCl!#wD>JtS$HKqBAPSQzAf5!=%5$|RW3VWzt&3OfkQ7bjN7O+Z(H^7t>s(cVxj1SE1AJB1x?w+@m?x-LJ5e!#6RrJrjiaA__njeU@g}a-Nz} zGe9=^VR{TN=(iDCiJFz;7^u+SML*ikDTZ{5*rzKkYZ^nkEnPG>&%jlU{tcw2bxN}= zVyuIm?Q0`a`Yeh4pd3LOZ&tCmZJ<}J;Rqj%GTEXn@mXT<%w0xW5J>y|Ip6LLqMF&{ zQYns+MkVgtY}$Y%9U)*3=t6X?kqZX}r?j4P$ATA(feiUgTp+q|M3x^vpkgs<#z!6( zqG(BX3C>ZB%1?(zK!2`nz4GhRXwpMyvMDhz_aD4;L5FQ`7O8yOB)1vuuSCUv%2!$KA*$#z0 zanZOD@+t&C$Oed4TMi`$i2L|nkG_rK>AF;A*@Af^Z&KqTxCIdn?E2j^Bm$1*T(5uN z``s!;vsie8QY=p&Uil!gzG!9u5X-CVsD3wf<LEN zLGNhK9+IzhWFBeBa&RZ&j*KLqLS=v`03V2Dc>~n|U-__AeQ@X|Qw9h=ZfY9;wcsY# z2As!!zvl1cTBw>8$?ZHcGSdBPXkN`8!}OriRWAx2QH7L`_OA9|L(k<`pzsXYJ%OBG z$0-a`tBRn6|{h&X0|NJ$KM)omKg&%UGl192n@+}Q_eIR`eu=eX=uun)W zHk|#u&sH+s7}#3lwjHl{e$uHXYYF_qPggkTY=8}SKsgct+dn+}QBL*Tg9Jr=i@UBm zSQVPYnn;%-C0Kr`jP_Geq=`=N;3YbN+O<9G>M6{;e)m7b1V>( zTPf!eB3^4?Vomj~hNt|}A>4;mmms&h+V1m?DRqXt{oU+l4D%Y)<2@xul>yyV;vjzQ zX|c&|G7yu=S$z?1&DB%G({kzH>Y!o&8waJni-z`tSq#TW+<9ks>3!8_sj}3{%Ws?T^99ebdq%?O%^GPG^?mhbaVFayr zzOLFU6({MLf;x(?BlGy)B{7MII5~20qKcEjiw#klCtHY8nHQ!9GS>_XP|YLzU>Uvd zyVtDBrM9+~3v>~AZhyl^_Nx~&kYDc4r~=vPvyob{!3<8UmA2-vqOFmDAKyFa$MiQ} z23$yIX!ABLad|6zN~O+8qh)G5oV!Lv>eP=?@kz!#lbWp2MX@06*-Dyu-Cy+}SX}@P zI?O20YoPyIgwAU{A0cb6|90^4rrSvDrxkwqZ%-w`bgNWt-gg|f3J{VhkS~-JMYl)- zTo-55TKrGXZ=fxemU>)m-{U`cO4?GmM0!f1(tq%+09|IB3azF8$z-^IXUZ0J)*suA za<$c)h1`G`n(=Ts8%~A0UW>s0;4F5GIQAAijuRwMN(6RBltin|Zuvj*w!k8$aa^Ai z?k99nq~ZsgdaW>mH;wT#02~L@rzTCVmMOjK-G3&N+-h`a7b0|*q-_CzBGE#telu-u z5~y3HwxzUI>qg#qp#IC@8AgYTILE`k9OVBav3h61d=4(hJe>dkL1FW1TqID#PcI-2 z_sQ@X@~O)gm?Q{owNTfPE6wpmH{YhMSKo^h8p6KK01~PIgs7cBU>u>I-k=tNGCTv* zI3rPSJjv4jb_THHe+82!wUx9L{&ArXsoL}g-ta_9<|8*C7zM01j z=tm>6k96lL4qKj8fNqA5fh}IwGJF*mMRr!Zoe`1sSpeicDTt_>aso z`6R|tYtkc6;_41h07#R;dh9R#`QQ6Gc_MCXMlrKe&~Gs0xEmB z+zYdRE1U6fH69YE$XP9C`)7wHoAEoI{%(E93CI`1SDUL>D_^62Is=d?B^72W_3{)i z%1&|#6cn=LEAxv8l153TTjke8?ErBj%y(>W-bB4j`>+{19+D^|sEBT{nb!ofK+4R= zo@4I|pHWK)_k;N{+WU3-e7+~wo4puz!GoS9I8R-dGL^y$Ec8&E@c=?e z>^v*`DXhHJ4y{nJi>V9hlz^;yJ1rXY)-LfR128hJi9>6kD0^Ux_{Hk|*5RDJz}tBT zSIc?B70j!2R{_$r!EeuA$LXmW)VZ0|S>Rw30i^hiWFCdd0(vW=4N)ZW$L@}=DwJk_ zFawO_-T<3@R(&3J7`Qm_7ZSR7 zMPYaNNpZIy%CF>jgXwXA>%10VwvOpF`x;Kj2*+`Gaik!>z`I(dZad;%} zZto{~N&`_FY9|_O?V#daWbnvNPZxag5TI%mLzWhG5pv}s#>kEb zQ9?TPzq@!%t1YsIhwEpO!Xuf~j`!^CSn0=}GDdoBv|Q=$g+j8HFUn<%ktW(s!|IPy z{ZM$b9pHk_jy9Q8U{U$Dd!FdCy}FQ~bE}cXwLGgsv%S`NuIMh?Yz8R4waN5Jehh1a zdCi^W;|mpKwAiEwt0|~d%~B64WAk&LFVXV|kMV~}me-ZE8~$A8qDK%;1wnr)&drG& zkfK4F95h+#F5reu57HCNS~e=8=4?F%WylI-S0JU9ZvMp;j!ehO;&ID%t8nL_AQ;cF zy&wcL7kl&7dNIA#Nkt)&xY|(Mq!EKDe zBc+I<7pWu+%cz~~_Q6zH$i}GW&a3s16VNV^&pSyvSV&qV;86L-;+e=1m_oBmle~pKQBKl0<*Mf@#nJ4hXJWdPl(+SD&ikxMba6yUs}#S8t)7R& z(RbHjP!#Se4<8jo$v(3*)P`l(l&er^rXl2&P>fyDHDKIZ%}j0=J-g3`(Er^+815yv zS{PTIdUXhYm-v~zR0Jb&JH{#}%!L9xR5A@qF6G251uH>2y|rgxOj=QKEHF(4|z3hflfM|1M8KvQ<3n?K%92P+7&i&qPS7!$$gVXwkbz6ynbr=+`vW#E3Houn5n1#hzVz;aPz ze!ZyZ8eJm*ghVwpp(QfOhetiG^Cefjw~*{~+|}#%Ed)&fc^kaWksfH`Cb^~ViErMXY;u?iUl|m)c49ZJ z2}N|DD>M%yut+JP0u=>evVja-*!&*hZ;l3!=X;Cbc2vQmzym)oZ*oxf_NT@q7&`LF z(suT9H8SW9)2sc=Q`aDm6pns>37)TKI@Ldc1JJ72+Xxq0XMy<;17D!%+Mvq6e{D%EYt}I89^Rq43a0*ZIz=TeFt=PDLDrD4BQmhdO=kr#K~nN=A~tw zCiP-@I+gpSp`_+QZlJvoEuWAW6TDD4X#NK`2w^HiyZftM!4v|k2Qq!wBH~pH3KhqrpS57x(D(@DNPd+-IAq5%J6WZZb4pY+T>dFI zt{}nJ`N@HZ8vM;d2CGFFZ6&;*kKFhfD16(QPanuLkT$hq61GM@n|?T_Ufvz;`hi?! zPIW(G&=6|FL_Xl@3bLzC9Ejbd7InV~1PGO~uqg4K&)4^O*cDJ^)X@(DV z*rgRkX+34qiQAvD$6J6>gsWUZCS#l&!&|j;2WNGu4(ie}gHon1v9I~i4>NTQUW0y* z$wPhv?xNTVT_2BLf$`QOsGrkSr?42(-jLW%c=a5xEIGqIu6>?T=lW-68j0((y2M zmiISPu=ly(cfKA#D7&rkCeoaE%{s-2Wu8bz!*361*ii+vaOdj46u(efV?fh@kYMmq z)Aq|{fx%_86KTtIsx|I}7Rv- zailiRReipM8Ub*R@6mpPA(?rgabGgPo{p*4t7SaM8WSxRp^$n`Xd3h&8mTM_rvhiU z2!(G35Dcb`d`p$cUgxM`XRHBz?DnBp!Qr5&CLkqa55niRP9Y&tsWr({O=yWWyp0PO z6%*!!AkNe>B1F0X<|)4O%>nqux%83i*_*Ywn_F=+fy@cDC~FoIQR&pb7#PuN=+~u6 z1RE;x;d$2rZg3zqC#72;OS7V4{Bqd^|NcdR6^FMbY28a3qt>4m?)vsr+*F>?wB8LO zrzJc`FW8OVvXyxvI5L}_vULkgkxz(VKqa0y5b;z(Bq7|1*H&>?3aG!7pKDVJ59Vut zXAO5zkT|8~b7+e>O~+UGS|CpIIXD0y%J`5YaS#7cKiy8SV-I^oA%cX?iBOBsmVp-} z_Gq<6r&n5pq)81{tdVSS`1Wn-T(p-(?*CGxVO5|INoRVFfA^JsR2-9duKThWIW;eV z6O`MBtoQfx_cEo`yqES=d7fSN6ck5iwdjiGM?$y zLJ&di6VY8Bn!V-VqSa{3E+)>S-|VE5DsuFUb2}PJlrO#Y<4zZ^JUR>#%b{2Bcki%5iuVSwwLy73k6yic<;%Iun=@0$iSh0rU zK?{l3sKgpc79;q(E|L$<4KbIuma1IrU+(Y zl%Z`wxL6MoxY?ugFx*5!qr+lJdx&g7I<|_`yzhKHkp=Ci)L-7KJ{9Z zVCArQKC_{9@*!aLIuY&qh_>C+3NX&}CDHukOMWB2*u=c=;N%gF(s5p2Up9E{_j=~r z4*f1&-)J^loP@Mkq@>ynB@>^UkI$h&(q_px{%thRi}dBja2wpf%hv)ntsgLhB5uWV z?(a~A^5p;g{p=Z5zdI4Sv$I<$M3bmrUp&H1QF&_m({)nFmiX2)!sO@;7;3>ck264M>8fvb8R z*I{&U{Bs+$eNHf7smPBK?YWxnXO*S2Qgs|1U@X*GM#7$gC9uOpforYkV?r zk8Xp*!R-7KV;+$9%k=;aV=3x-edeq*zkTS((iH6^*)MN7!j2!#lUDF6_iP978EHk& zTQ%KzGQJ2;AN#$(^7CJUg^IV;jh}chzb2AO4Q5ZslPNL6iohAsmJ!sk^x@s!pU8SuKLVx&@oZ z_xWa>Xe)Iu`#Bmw;^UrnVYj6VqjITV(|85vt)RROd(fwtWSot>irC=*Q?5=;#E*qt zP+kz+5<{;gaF$*qNg^ARZDOF}Bsuojf#an9kQdO->)wWe>G5!e_f)G>IAL8Z@ZX@#b>X2B5A4X3*9_eI3c zay~!JWs<|C8uqX7to~EcetaO`fV4_`u+nzK+>M>x z!i*&~(PB_d; zSYe4Lo-2os;C!peWLq~-9{A4=3VWO;#dFTR@AbDGwSB@j#2gz^U6d($i8ovs*M*|*sTAVvVigZGj;Y|GzRYFOo*a5t2s4sSWUW-;nQMgNuHvu z77vg0gVI|30rhmmNjxL`^{!H9Xn;#oVwnSkW@6s?U$C;og=&Pl$KZ?5Q-9*5{E}$`~X=k#!T6n zUqjNF`R3fv;d!_+dalj}nvut(Jr&M`D|6VK>@iT+OEaC-Vy4D|XG!QE5zobwIZ>ky z7waoEr2=~Y5G{RmG4pES0~5R*z=iTID_nek&!Hjy=+2LSGA=Ibtqdw@OAJZIux3&G zY0H#^OiIuP;zER1H-}@REu<`ZU|K!yd*>#!wjM`3U5c=J7_E#ptx~Qn`Zt%Rt(X_S z?9=A*y@IWExS@V)9~c9)cJ5D%r=;5}9Y(a1pDyFO}CLUe>dS4q4;eA=1sF(Bh^(@!m`W;(?HU11p51sl=ycnN} zLo@dOi1Ic-LIaMb04*><1ZY1^Juq9<6$d;g(bj(f-a@Ox;{O6p4q>w2OlJTtUmPvw z?3-ncB|cA#59$~|!Bcwzyn{O~?g58&$O--l11sP=6v{|@@`5R|->k?lsN?Fc^r$_e zW!J4jiYp|_J$$)BVtA%7?hs!jy1}kN?7KrFi(G(sUxV0^vdM8LaNNH&oVDe@t|(-1 zRV>hSNSgGf?^fZ;|4mf{2aodNpm&Hz%7|ik9H5&AY$FL_cS3yV52!Xbi2g))318EU z$%ws&@n25a4+KZc%}BlSXSdicF%D%A^P_%A#Pa01rzzrbN+sSH$6mx z379{8Q7gsvr1v)3+NM?^eIfEC_b@ri3Crpej=^3+y6x9s~ZX+^v^ zpJa;aUo08DoD4=`x6Zokca6tf`B|PkM8aFyHVjw7h6ulS z^>25=uJ!(9-aaRu_bedj+e4&~%FjsTk4;El?2c|Qelt0D|C16vDf8pOfxC3$3svci z6biXjuO<{JeWq`b{DrkIv8ZEPcCf|6E`NlmvP+(8(03)2i}H8d8n-_%8An%BBdyhy zhvM93X~CNG_`Qrr82)+E7HdVIO?K;t3U!Ea_*RK%D1*t12R8n++-w?w-r|E#eJac~ zT8?+~Ilk06^FpdC2mU2D1;2kCRr=o6aiu?l%O9h7&;7O~=#lK6~p{_J(WX zA;F=6r9;{XR0)MB_+UQ<4?pMd*@nR`Wl@V1TZ54;G})4uasx_=6Kj|->t32fU0t|# zQT^W~oQ>N-sR54?IxDGvb}ZDvXPuj1&8;ZeByoxE`>c03N~%n+IJf-&)mFWwF1U{+ zlfImdC!PLG6M!|r(3uF86abF4~7T} zJl&g83#`6>1*wXxlki~0+#M4dekDBYYoo_6=ynDD$Lh+VOC6&55pml+=6gV>dBQ7G zIjx+8vtqTsQH5j{9rwQ2x>^ai^dbM^f2J(U6wjgjuT9qZ(tdh_+PMTzz27%XaWY8a zpIx0qLXWwTy8%B?YJHW^7cp?5O)%-eJ>U_P;bqyQgpB=fN<4qJ-aIm_QMP{R(f1## zF_OIcbx@dW|Bt!Wz0Sqvoli56k2O+$^7p4yUWhjx&~OHTX}CyRP1bhc4Jc_lzs$b)c!$ zdwijhe)_P0UDg{tz1vX!qJJIe(M#8i1shb$^pQD;C2KeVgtXD88%nS1SE1_BR>d-l z=A_O#AbuX9 zOND=Iyl|&JGa#*eIQefH#>K@|_3C?kE-e0Mm6n$F=aoB?2zM{ye{Dof4afGSxnY|% z{kOayh>LR#8lLpjZ}d9$|2Gh{H09b0cmfrNV0Cq8LCv2E{^dC`O<()C#$$ovj8)!n zgs2!(gm(LXf;#4r_9tUo?WKa@nWJYvG2dEi&bCwBo{AjYXrPxfCzIw7*MohEMV za-d(%QPCg9|8bnjXC_5&>g;S?zI~KUuP|y|_WP?P0>3)&Wt2$m-v+oigjK)J)`Ef$ z$0t>PR;sWa$t&!lcK>Sy;C^sbJGYP{pX6%K{>k6YPA*VoTL<)DfH3M`zozp5yM}ar zx?4E;Vfdwi#~!e2PW0+Mrcn8(H!#i!e)1I!E&AQ#c+sZOpBJV4{~d&z(GW3{OWl(< zbWMvQ%Srz~@5HOYJy{-O=q(`S@j*pGoCy4trHK1F-Y@wJCoJpl6s9CCt}(3s4EeCI zPw)sllC8O6J$$wBi6Z*U*_=x2f&1JZK@EBq^6;f=)`j!Cn`|DK?r2ai9LG~e2i8#Z zHXG~eCal7X5dbIninGkRYq@-eEE1p#zj~n8jGBbpCbG!g2B^{_E)#lJ^ZyBH5`GTw z&V1D*Q9PXjD03q@qTpG@$0|Hj;^3j@QEboBz#{w-URwY}#D5sl$ zxDsR+s6Uj(4QR;j6kN?Scz)Q|Yask_99B=^-Q4|dtQt1o>}_@kvWTrj9sN3l;z`HJ zgFbF`a;J|t;9T}SLcbxJzm=64|2z)n(d=z?_+c5Fi6rXR$9n&sA_aY4de~azSHTdl z0*dmL&L@AO^9!4&g=V2ttZ^$&l}GsgE9NxhDOnCP^-^mU=w=6U6(mVGNf3Q7<(0Bt z%S`i%*8mPp8ds$58vjLEs%cM=);a~(FGMvQ1Bil-o%P8U?ZjK#inFXbuiJ4gi~Ny! z6q0n)s7}MxvsG5dHO{Xw!qI=bJwiN*jBqsHywUtn>)wmB70swceUBjdj0*o=L7X08gkztRjg>Ij6dGvO{rk>iEV(?@}K8EspBY9ANBHU_SS`!%%z+bJU6||k1Z1Tl1{+0r+XHv`0LTr zpinV&mEY`e6$Z7)uS*m~kY1-ceKhXNL7GmWhtxUZ+2QD;H?mXrX^F|~)W3WmrmtQ3 zhx;w>q2iJ{dSt_P%l$l3_{kbO??+7`M7jZS>`G=Ij^@2zOy2@tmcn~ z++X<9)C}lVHMP8bb7TSLBKH0auM+lI@CA&%fq6ibPh73btk2)xq%p@3rZ4J-;F{4V zGvJo$5!58hiTqV?=+g5;&xl~WB$=l}I2{?+VS>H9w!P=10nfj!NU`6XWhws;X>S=7 zM-%K1&+g*x?(XjH5Zv9}0|`NbEgCd9!2={%fZ!5zaSaZ^*+3w;yXED%_kR6ozOOa8_%8SEL0xj5bOwDxUn<|GI^UJZVnTe14}At!c~CU3WGCCTyW zUD*uq{*4tbd59g0gSPD2B}1XmzsA(S35N%7h9JqYv|AY8(-0DiVr8LC?&dTQfFY>L zI%ofb76NDc48=G3Vn>fE@H;w13Xaw->mJjRoePBXP0L#w7>|6x-ykR?$XRSdu*?kI zJ=nmiGZbPYf(igljOzt{gHE#bc~46KzeG{@&6}X0gbyGIn-)kyt(NFSumXuzVp5Wq zCa7lXa^pD$a4DJ~s&GV|wU4x!3>;K;rUqV(qBSspWFCUjucMsjP2dJi^`%fS={sLY zM+}12JBa_p7q8+D;tJ{Yb`0T@>n9WA@?Siz?l%i$MFv@wo0# z>>}*$X94Y42gvv-hAY>Zod|B`@Y$Uene{y@GvITE-ybb9{*CR=Hd1SQ*8zQ@q?GCd z2tJlnC>+OdYD1eVx_sSJcCikQr<8=GlffyUBXh_faW&I9d9a0qVGWOjf=;(&w(Z^^%-i(l-BVq??2HX7QVUtDDe@~OIvHoJ2w!nu!OiX`4iL2+{)bI z&qWO8572io^0S%4P`7SdL*1cFmdrDEZr! z=;-L!S;Vdr)Iu=CkR?o+#2;qxn82QKr(7~Piu6qW8KSLx$aFiZyL;y2oz=%T14UPo z=s-3rl^px@I z37zT`_)wOr(tl#>0z#Q;`A=v&cGquqX$82Pl#9p&h!afH$x34Wbd*cyF7;bHl-)_dZCepAZ|I0K-^4V!x+Rb(Z~JzBY9 z9EdJj0mmhs(sY_>c(QIJm9Ff2Tn@qac>Bb=KeVx_-i*9DrMZ=TbD5KroV$jR>*K++ z=AT9Bw{b#4he(aRvvI?;cI5Q?D`hvun$e2Fst~e8y5A=C^jbW~|I^1*z&z>Sy?szm zfB3s3Uqfy2qKN?@!Phs83Aa<$#W|3vfkb8L=EtZDxdRsZ%b4Vf;UVTCA#`k`TbHoO zZW&G~Vtr)s4brN0X@>`$9z_=e3GI4T>Wh12rmd1+MT$^f_eXvp4rKZSjpr+H<+t^Y z3ZVYR4s_!Nn+|Hc_j$_ljEG{r*Ld&%bmF@dUjg6orjcA9E^Ry2H##CMc6Qu`KdM~R zjxvg$7Q@SbTCJ?c)q}(#UKdvlszE)CvG21BD*jCh#2nKb((W^W{Da-xPRKs)GMI|9 zOk?vpnC>XON$+DTqolWfCa-PxU|fRcgJKrNmur46fIPyZcB!UGt1yc@|6uVfNR%SO zNShY4@f@EyW{(6mHUu;jx5_WEyV4WXDB3_fd4j%@#W2L zYMo^Ppr%tTI*zj#**YwsL+!FETHyh8`ho#qe`stEf2$@w*A|uP^^>ox@A;1Ui%#ec z6Ei%F5(J?D(waHj0AdF~;lg8d(gj$jeNRp6`y}k~>2G%UKgA3zp?{_^ubDuL#mX89 zlvH|zj75xzQMi;|HFPY|6ma6&GkSS6J4H2aigTr&U5J z&2vcFR>-vr#z<90jAZLu{X7le)2f5jKL{ODay<(~%fPN{ZZ7K-Fl_8iLaTnyf~_P; z+ZIs}n5K8yyQpr)@ee~nrG=C8rkQuJUe8w|dsj^qk889vm04&~e<9(_Di@D6tTB-{ zGe1Y_-9o(d-R^Lam$onW72_)yaKSy_tia-7m+;j0wnaYh>=z-{U`Vy{b+_Kq`J~ox zE42|;nMXq1VdNB&(uy#Z$WjgNsj5>uvH%pfOPQPxN8(OzaW-X92EhDE@fr&y1Lj+*8R+)AhB_a&@uh$oYDVTXgCV3 zU{sLW|;v9GG}<790!>dT{YmhLWSv&-%-NOyx)yD#$n)CmqCFRwN%by}j@ z5%|(H{6w~qS?X0GloC3Kuqrf|rDir7*f3GAJ*sIm$e>m>5t`VLQSR;0EbzcB2E}EE zzX-x*5>iJ7(%Rsr^;ih*!rCFJ9Bay!aYg^}f}&AeH{^r-Js*2|WLOE;D(G9S>i^uA zK3wC)gvt;=rm#LI*Yfh#rW7Khx5|({dy0_$lf>01^A+n76g}{4c)(6}2|ajKKO$Y2 zUovWjIW-shGVJyL+ISXQ>{gY+Ugo1Gki_o)b$DQ=drP;U5fIww z_R%K=={)gJLTxXThVW9je}!3ZkmTV#7JS8rDVW3P!T$S&5#TMzyhQ>bErBUbHKEmh z6ews2GYa8zaQ`~=>lbNm_^&eM94TB9?5|Y-!(40}$#N+w2g|`*z(b32#QfVN&1=QE zG&NX~vj8r5SV?`TqSrtVzg;iMyqh)PeQ`yD4aEv#A)eBcdYhZia50VA&AuSR&?)*;ZWxsk&I0X8Iygk(PJIi zDy-i6_^*Fa?xjVb?g^y1bUBT00sOV@;=sO?C0E_=t3J7TMv*HVt9zJUP&YH(L$=6G z$z5sexFhrhu0qFWmht|H^>3D>>ZqIW6yN1r8W(sWDTx2()GE!Rw+3v-hEu7xVL z7wcaNiPG$IH4fLJlN@vw_6YPuDVzQ&YKl`im>CCk=q2$BX{4#Hxh~Om)BAu{=Z(Z7;Ml%4La&Gqum@7 z?o4@U1DQ|2t<47#1>pM)ImemP1)V z4w9{q`qKjQbHARqv?PijNTQY|ivKL_p1z6 zp}e}dgCRkCMVw$nmrW_$!-~!aBIy?wu3hEPV@7qMoJbviWsOw*&2QSV)U9JKP+X`ApQw>N$ zv-*PFfYMo=&YaGyQ{xyrvpf8P!@@6xeG}>VodKekY)_*-%e&%mJRxmHp1f@A!rd`r zKxh8YCm5V1{7S=bUR@WJT850)pc}Y$Bb53fe^8)vM%PYdcA&$&M-j5wGckJ2^U*CR%+WhndgsXKlv`sSAka)D_r!Ue695?24zG#V)b;zzwI0EEcZezd# z=iR}_EUtIXnR}zx5?_iZ)=FT!3uC7A>!}m&(Od&s$FTbUl>uy{=8z=99gztoNlJ8h=gr6b5PTV)+E7_E z@ysXU9zWfRTTfD$KHHVypHXjWIF6lg-}t};+yopjK_ZTh59$!Wg^l^&o;`V`y}F$K z$b^Tg`i~QimoVLUeuOLCq71%`Mm^Wx>gWwT^RWE(!Y%=Y5@z)UlyRy#oV6nQh?*-;-PgiXrdEuCG0lFt{~yG#YX$zwUQf z2^Cc$Eh4LJowGox6l11RrIKBO4w7I+#9+^dc?JB$c&v$MzmV>s*`EBPA_!$j&9+}z z<1en0N2>3mAXzDwKAt$JN4i!6R^ex&vt-bp?EKfD$IAz;4Z2$*Z-g=w>%XlK`@1$Y z5`x}*iSt~E<~W(y>z7gnYo{S+o+L6Lff82Cht!_ht0loCY9SD^ks&-8j)plNX#4SN zf=bZco6jZSau$B2uzH#N_NhIe9GT`mA{P$mkHi91x^aZlrqa$E&Tt1}uQ(v2$nj){ zuy9ri%>-%Ao(FcfStpUBvV+lwpdKL@)3i;`yze($CJd2?TJPtAz!8$v=DUQZs<0Y| z!^h6J!_1hpnU=#oRR6~gM+oY~a~>u~6~4L&XdVMnGgOL9d0Q5+J+MDA%V^MB%HbI) zu0AblM4tE}iaN@|9|A+d@jalgNKnp}PL-LM#|MX#BP)opZ?|lH=?g{V5q;1&fjLt0 zk%b2$RhYUafbF(?FwAiCR=5-ejtrw~CZ&UJ!vQ6?Qh|ycRO{@16ZYnB7ylZc@nBz3 z?Y9~+vl^8F^k~el2|w-TJqjqT#F_N|xLyfNzpfRmhuR{-KD7;(zr0Hvk=WMz;m$V@ ze-M6Kk1`E6o!z=CcELH^3WAJWYh$AED$T)U9rzB^-2Y-avZKw{e67|#!-4JNZ%nZQ z;eZ${17r+TdgeJM-Od5-NnjO9n0aZheIU6^S0g+Sb1-_?BqAbL9oPMc654(NnC{~! z=wL+#gUj{y&bOOp2tb!LP%EmL@8>wKm_ZnJ9iYaSMpVt)FsI3$vZc!YxTiPo!C8gP zk$Vw;zA>Z0>E_`!0pM0sHxArAs35LPW*k#6NPQ_l7}`8C`6>(NKoJ)63h)!RH9^$Y zaik9d-qCEK!k4(^-)jS}NBWP=`wzbP?rQuQKBE3d3d_RMAFjsv_@oS^u;$frk{cIl z6!Pp_d0d@<7+hAv^~Z^296g7WL61!#>q?&t8K7d-YR;4~KBRY|IYTlQFDy#=FMv$v zatbb}7PT`qeM-&pZyr!b!xkH;b*9~%3L)9@il~qkm=48+lg1DzqixlE_!)-yup^MU59*+zfC*k2>?W{MV`I=% zn-bNH4crzV*W0nA%-IcwIw*+L_Rw2&-kh7NH+D@N8G)FdlB z$fiM~F~#L7z~q6iG0WBV#Z2g3PklUB+df3#I4D|5buycsWfd!;j)6XJqgOWKbL_uW z{J<5UeT2Q zQN95cYsK0TCt{~;PlGCq@B`2#&**2rol@-vn){4(5QU%}vr=RRR39B#iKl4*m@ftSuOb*(Q_Oj_}3uN)^T^{f-O!6`O)w8?(x^o|%WRLXcY67a_}r z1v1B?JqDAM5zJKQ>`}lj2MiJ+Jox2#ZOC5L)8&d&hVBAn*o^=e!BX1`NAlgbz=-_5 z6-$Ch_rmH|;RTuTi+=%gt??Z=2iluaYp<|D65eQVj_lupLCn!ffRPs&D%q3_Q-FNVPHcVPfwek#HNDM1pI0TYxv2@&2^LKyo~d zoIimx`0ZQKraSru!V*gX7G#lNVpt)El6BsC9e2#}ISpyx<)l;Jy%EseW{I!^xPC|S zVvS_e2vpe~0mj_vi3%fl!|m143q`|7TJU~WvV4gd06VT2Lci#ZC@(nztgzWiCX&X* z5`pe;Jt>JpJeU=MjGK#8sSvrNoljPFDuDJ|r!bzTQZD>0el?61nZ64l=+^EZgnYG2 z!oGB`dKRN-7rptm^*KO%$pGMlCMP-IgGf-dptjqa0;(;DUYK@8Ud8kWfkp4| z-A7LG%vF65yefI5(Wm@Xf9in{NGfH_fJ!_WS_w#7?f6)+%;e~G<@0qj;A4jb21SIX z_Q~U`Aer(J)iRE6Ag;~vH6|EVBC#;>xPeXiK3MaAn~&WI_9>OGS0Cf+k-gt#fpA{N zXIYzxO9?ST<@~{qevA)-+*+#>z&AA-VMi)h;W;Yp@>)3XtpVy;gO1Sw5KJ&Y<(xg` zfr^ld?}&MSKv`rgZKv+QVIp8SUIkUfzJE^(QY$&EKRGyJbJ9Vf5{U4AHfKjk5{Vy zd+lMQY+Ye>!T{|JeA#0Wv@s-53%%$-1Q0DSOP&hwuij6o0<%vBhwz%wFfjS?0Fdn8 zr~C1~L02lz)951|hHe&e(ISukC2vxW9Hfg11;<|o3O@(~!jKV+Z9ejPt`N~rKMSen z%uHGDe+#D*{X0Z`@kY~SH2hx~jSPyHL2pnVTJpOHWV$o6*)>a=Wn|qxM9$)4@#M5| zgQ-`tP#kz$Ef>Ph< zmZ+z!o*8P9#1wx%r*_bdK%9ST68C&8JsEo7+g=HY2kRXe`^fej6Cj{~zN=vfMzP{s76&=st1ZOJ ze+sKLzACOVe~o=~dY=D>;;Srd!ot7O%RzI-e`1SYck7?{k<^wIUTti>z3E!z8QI#R zIQaH|kW+c6m7s>I&v*U&(@@#~i_-owBh^w|Bl{U#vl;&;G$Y&Uiykny1Hkoaa+ zt$3<*m3x3%d;?565c&9~d<@`*clWIUCT)w;d<)G?P6#W@u`iVr`*vDWzK$n&G?I~p3vz`>P=EK7!@ z89fg^y)}#*H>N6l2G#fR&)V;IAYf{$)T1>mk!(Y0Lkwo6EU5KfV!(oTg zlERrjXE+=lZnEfkRxgBmQERFE!1&HRM75$Foeso*VmEb?O{l%$JZhwded=xAg zKBNqq^F%&BFmnrKWD{IrCj5^q z1urc9f#+9)6yfb(Jve>Bj$fn?{S5dG;2x|jFZ=q|hO-^iE**ogZH6;#MoS4P^}~Nw zfz`vJUEM`d_?=a(gU`OC{)IUTe`|zBpvQd53uH@0>cua_5axd~nMR(MMbi1LQF6jC zQcgF{e^y+~5Aub}KH3IsP$x%5m|pehydt3>6tFbcvrsU z{riuEogo4#Dm2k}>e!9*mS+gYauAVB!hTqCY4+?p)gRup6B7&I@6%j@jk-MS4BR@l z-{;__Jwa1Gx%Wt3+A+KVD9xIntCjap>O2vQ#KZQH1Fc;$f`T097?rGA&|}2b8p1QI z^uf)+ELNCxAYS0{<;~4&%%uosmy>6R&l?2jx;M4_Wp2AXeb|9aF$TIo_z3B$qm?m3 zkqkrRPb87wzWhi!tB&|Xjx@e2PnPl`NLan)c!*3my=1k{12N1pQD}Ec9XW*0*w|0D z@RXTx0|L1?Rw|7eoH$^9&eeoqOK&UWH+7mgM{u0rH3xr(c?|2Ct~xQQwiKv?h3lT- z`hwN^Q;6A*D&yR2k=&m@Sdwqv`G%9u6PK5ke$a^YXDyQewGmsxS^QkgiUgSIy!laU z>BC}|2PFQM)^ec`{gqFd^rj2T-DGMBtLR6-5lk5-RaaGpa=_ZI0zAPodIHNaBP`SM z;3}pfK~Y4MCzj9LWZqTGATg;aR+%o9hzK4fdcNO}y zGu^U!g$%F+ie&UgUA8ZB>25D?wi=-|L)@Zi8vv0s&hO2y8=SksT*ODw+$=>;E^|fa z5teVok6Q#M*oBcSvN%CGo%NK#RfteY1{q{!-XGYG+IQvt$SaBD+7|Hq?8q7j z?xJO`ca+Ny({gQTGTa}!MBGO#Cn_(!v|#&B&4kwCLR95!7SO4wSe5VzTHH|B*X z8zuvnx2nM**2FwmAR*yw22KzexyH4v&zC4re}-`tWy^pq?qQw6*#e@ zh^qxkcyDodBtH9H<8Y?6UxFW>V_OjitJ~@6PyD}0KkgkjxoJru_G}(hw$uMQ?&=%} zz5j>UDyM!M6eJ>CNXl!V$Kzwqg08J$LMzIuP(xvQIXf3={GcKYInic@=UGwwRer*# z@^p)NsH;OW9aaqc2F!!!)4SBR)0t)bz^iWsP@>U6y-^BH^S=$=(c6wG@x(I42;f{T z8l!5b^<$Yp58&q+szhqz?@eq8jpsI9pg&3SEugD(1#k4_@i`=`(WBzc>kwOWU4||_ z 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 literal 36265 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≀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

H?Z@9MygUCn6}}pNG;YlCOoDd*>1G{ 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 G(*FRTByZ~g literal 37308 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 jYNTqKPn9npw9i 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 Y2VS&1B5)^>zo zt}IPt$y!thpO(kdP|A`bSv%av7_!qI1XC9c!5cs>MW--CLBvKbWE75{L-+|e+tO^q z60Ok!nS=Dy=>@k|i{=g6%oOa-ACZ6E@A}GP<`l2iRH*9;iEH0Ju$8QVq`+SaNpOgS zo>fi&RDelurOhBN?3vsB|K9V&9dt8Ang!uZBt16Z zmDsNz^Fo9gGOx7;Am{k{#46j)!THKxC_)K|DHH)Jvjd9_fhYO>)K{jK z-Fi$|n^#FrdVt``o;s-{C!`v(m0vch&<9^X%_Mfj(trRn5zYkne)iN`zAM5P;Zg8hE4lcLB`?d>7w~?SIriqOQYhSZ0%2Cm*#J<4|ynaF|T& z)QC^M{3xx?rL_W4$}mGp>SufZib)>Av_K)JNc*aDk>K8hj|Eth+j0wSeEY%zZT)D_ zUM@ry2A#qQbSLj}wSpxzfc{vXw)DK33ZDW4Q=1~Z&WExD3x1!i|3ksdnFJZ0t&`Gk z*(6Bn+aTu2K}(@ym!Sgsm#~FZo*r<&`h)WMmLq=qPs){G(pEXB7)j|88`2AXT`(Bp zHLap8FuY^4Y$yARbUpSeHpVQ`sU&fJ%n#c zm8*$eP7jw|z}Q!w@I@$*f;RHV6P2*OguO%rZHWL|OEkL{{zATFD0gjcnvE_-1s0Rw zNq*Pa>Rw2okgt^M$&?yG<$QtZV{AvSsI`aUWA6`K>z$B5ni9>8)W?NNtnj3A!Op{apZ%Bi_{T`BoNB&AzcuB_!S^RZBe8e8 z{BQABjc;tUju%cTh)S=P&RXPMp`ZAnsbSnG>dbpC2#pLQ4wpC}ID0JJu5)J^O%)An zFAzOf_1X#550i{;LDI;G1%2Pc z5$0W$qO@QhOqDj#H2FAHoz!gnXd?k|LR9kLr61t%owr9jINFw^=Bw%%Jzmn8pA*>* zNdW%6VHsN7on#cHj(--7YIxf>vvhuxKv;ktoF%oKY-zi-NyhpZs1d}Tchpdb^N}qr%&TBCiYozJ z6+?q`Y&FY^x9r`|jK6X#^N1zfaXQjyr0Oww5%@_9Be(8>wpkO#vn!@WK%Fkj?S?yZ8;8|fpFpQV+t7M8Q{P!G^7$F8JA0byLer#fjcN00^?C`_39ftJhD9GvUsB}f(RV>MZ_0gN1 zQWsA9Dhc82)7ejXYE`?1yKldf7TQU{E68~$ya?VX-Kb{kcV}nmE*}(3`k_K<&f^>9 z$^Z`19q*Ir^^iDywl9#+aQLAv1ZA!#@I$d*RE+}XYSA4Fnm}rwH`(0*YUg;+G?33* z|GYvSETgrp3i(;x-ku#Y{qMA@5pbnhVJ0|4sbye z=b^^yF-4goUB&3OC`xn_KmVkTwZQ?kZ}rUvJq`G* zHsxn3zt=|6;w3`DC{mf2P-dyaX+~FsWG)1hMoN z{9Q5*U5^=&V;Hlf0+{a7>o4FUetiDay`xSG>|^p9E9Bmyq0Zv3Ooq>IsIBl-=s@%x z1Lhfbjo+Jo}2nY`0@dpKS}oXCoD_*<38_pYOZxp-AX z8^B8EoA8!QQCq zX&MvfK{b}QvxLM@TcHNenj8olA&<9j)u#95p3&r)?p6HXgpUH)wMI_H+)yxvwsKHw zBTJvn^DSOyi;iR?E{M)77Fi~Swx+M{j*P3L;y~r6f_{LZ|I^CrTQ5RQ6-bZeE?vax z&62&|;;(}1+fSQgDsr`b#1nlpkg6J{r>xznNCCuF25-brLz7O4n*}-X`40=Iu>0F~ zHkOe*j7R^T8(&oc^)T-{vCk--dbfQ5GkPVcTyNnFF{9x_1`0!c_C)Vyl9-jrKvv~aqca90 z0uxFU7Fi}Tfo=?~-K)utcD;=Pn5n;47eq)9R{86zv1nc)#(JZ3th^l{dF{s|AwgW_ z$CU&5R*Ni!XJQVE0^B@u8rboHz&)h<=^~6 z#0!|Q+4bTqR$eZC4&-k)-@!aVUYxps^*J7HbY?zKW{kY3YUOmKBcw}viKJN_scNwH z_o-f9)p(ekAgO4;2vWw+f*?S#?Z9Edv}4%h$)T?vPGo8y4Qz^hBS&}qgx4Cl>T0KI zC1qFI4|#m+n8YDQ{Y3+1Y)(@tz*gJ)?xUUQY<(-2w}z~1tn)mF(08_UxWQMhYVWev z6p~aB&r~F^8N>BP_ZH!Z{Yy^ zQ*3Q^z^aUxB?J@0Ix>vQ=cyBlTcHTyLTO36Q%_T?AkGki8DLq)p9-ZL7HU2fasafE z$)*7>{x1sLYn;PWI!6-!Ghd90lFvIu;eh|2eN7T9_4L3DgOm-R4j=N};U6YrX7`EY zhvftCgk({I%^pPvwU{p^>B9$q?1KMDH)H3VL*4SF3G)Bz86DlrCR;MA@Jjs0AXIF5 zJ^T5uC15?kAeH0xf-3cY47kOsQc&rZ;b#9Avw3y0zK2lryK*1@e__eYyDb=CCj`41 zYnqRL=e!GZbDF<%KoL?lWdTR4tgxp!eQSjLva%=54?zjBEL%T-*uW1&^Dvz7yuKo6Yvgyj5M#fGbgBBHzx zOJBGeIrC{)mH%MfeIyW(T-1*6zg#%D z9VRrBR0`U)NRU=22N4eZWw@!d=J^ri&9DE_HGMh`yudY+xBFQ$8;M zY(u!g_S3k-oP=P(um)B^{S3Vpaoz>W)MnUCl1tbNIScz~(n6Z+4@*UT%}fQ!>f+VX zva-b@iE+4k^^N+SXgYi;URR~TrKV6_{x{{HT9b3&pYh0&Ew|K;}!i1gJL zhMpeD#Mva4Ixy4F$YPJHtKtWy1#7&iTlS}&iOyDxH$E1@tRGoy)E&0Sy`~|Oy|l72 zrCx-i6w%mxp9Q?r#Gn}p^BD;-+cPu4r^czE=|A8X$}9f(`$y%&{0Z0Uvq(6O*z8hPevb@`ZmOl(*ysR@ z9OBU6vz81_+ho#9r(RlAnV{7xeR`eg6p0L_u)TPM*Ajk^H1YAJfChFDm20sXIRR&r z`Dbnk>6Ci$X}PBV7`_~|t9@ZLhWR8Dz)yier&DdKA+qF*^l9KfZwh=V;?}b}Yh1eh zDYXhu;io}^1?8!j)2maX)Pi}mFL_u2b1Dm{u!}U<&ZKavTfPI+6a6q+EQE zT1c#2s-?5ue-Zc8@}&9}U|=3ARkR8?vYf6@G)Ky()fFE9FBl?}!f6TaKs3BP@g2($ z43w)%z+j#2qpcu}yJ2}Fw47S`JSx6v5)a_rey%FCA3Rf$@ zleU;Po5a(IF+1>-aAQ>0Emy3ua#gk~@QWvgoL@6J-v6!sEI2~CKu#;W_AB@7WYPl5 z;ZEJ}=xdVd+36(>c(naWX>u{U+0LZI`m31QBYG z*h%)8)W9E~fo4EfZAe3cZam!2b8p`AvrM{eai~Bxv=<3#N(!@jaTT*!&?>cj zcipL}6X^+Jjk1qpMwkZ`R|zxMcAdPly))&cN?hqPOChjFe0e zMF=86?Zt#`3i(q^6=2+q-t>x&OA&k@we14X<5nO7;#pJyJ_@7KoAEv-roX|;!Q`U8 zrrs>!5klCpaxdpPpx)$DCjSZCo6k^KsJH!ow~fsjOalqp=7SVo)9I3#@EUcR5Eu9-y9wtXu9=LBqRq5eQ?a|dCmBGDgNutk9;K#0*xV`4lOmckztH z5{Ps$(7qs`Nn%)m9M7WzHs50a))MK0yI(H62tgTeccCThDS&S3CvF&^HLkB7GY~P4 z$`nHp?DMFk9*ur z?|wZN01NQLn@L*)Ze~LD^!(SwS>VD<$ZW1tCfhnl9g*M_3|GX&#UiZ9*)*mbc zW!p5@mUB1e|2QY92UK^!Dgh#ufCg>J5}gLsKRID~3lwTn&CF4U`j^I*DbxI@FZqS| zey~7DH|Nwm%|36AuA7aniaIhwFFK*Po@qWG1<*Rp0PLWt>1*iu?e zs?fIJ?l0;7-0@zWyf?$={FXBtZYI0-L+O*gF=O_ zy3u?pHtZX(lUvlvEEmeh%L<4cR$>&s)nyQ)@OB(eA*>UGSA<#f|U zyT2OiYR#}6T!=s1&~kpeEqokJ%|7?ROnKrO5pn&*HX8rr$1-*iQ}E|}$CW58lo7F? zfk2!+QLZ5cBxVR)?yg)eO_)oTq?FD*i#0p z5AJ?RId%i*m+e>H!Tb{I^ga)OM_2iX;R*1)ZL2gtc@kHv9v z)Fc$MZ)$Fi`!cpT^@sK(_rLLxxHLpAoLGic%Ekp|qc`77tbq&kRRvLigYKq)=Pobq zKcDlq4ydklkDAB5bQOK|71}hvRSV1?a;D!)8l{j6^W*-&Hl}N??*Pfy*%%S=xfMmf8mzUC|XdMrw|@wY>;@S4thVwxghh9dY`6_`J7Ola?04J&*mG({dp z|D#RLLt0(;DrgL3HSs?)`~D5wlmAIXf!vB=4Me>F_?}e4!fE#WsTX8A07pS^sqv;6 z-u?Hv*$)Cn4{=ZYhw?==(c9UG7a9rwF?VREzLWuN$)!2GWoB7oSDmY#bUt zvIrlhM0Sno-knJiXNS zE*3}bdd)+BcNZk*UG6E#`dn#vaac`;Q91|T#WaeV!ru|<@G+%ntyHn8h&_T;%(*n3 z^=9e#u<1}b3fYSpvAA1Vatq{@6Tn7wx@{4w6NSTbfZ67(&?*p|=}wwlzm*qD#2poU znDdZU^NNubn})s5-;61OU)aoy8|HnC;8I6^|=IK0ChzQl7HX|9~cOpWmJfV{@6bWPq%!{J+XUH}@_*Uujnyc8*)t2R$ooY${9H9K)F)gi2BOby>&@21T8#!bg?;z8SE0U2G2h-W;ys0k~je* zdCyANRF)}qVcL4SP<&-I5t-~04fx+5QViTSb1NDcW1ae{fochDke!Hu$YhH0V*77~ z)I!deWsxI}G9IPl(mw=ikWIl?!9!YkQjtmB!cJW&_4u)IF;`lY^% z^JJ`?uO1;_#~Ei2FMf%i4~4(~G8&18qG^r{|L_c+(vm_-K(>nRIv^Jk4@J=&*~<_h zW4}V4%J^+*Y;&|V9+qdTc)cBNjAR+vdu({6XD;Uw%6ciwn2@L<`6diPH~3pk-* z6@hsvON4c(j4vJ<87q7}%Z6xuY!b{}zb2IWP`F0(8!0KTZ-AdiI&C}}nDM%@1kiQ( zlxzDk6F2Fff(9fMcj|kw=-^E%A-dRpk)L4-iK=C5Lx{8TIReY9FRigQWnSDxyFnn7(lZ(fZgG?xP7s9Y@=dQ)`I)hMT$z4mJE6Z{d2_x>vsyP` z7tULc@n39`)YyTi=}_`GAat7E#^;JwoC!z)&(DVCys5HRIbu_dIHN~ai_ugLCIg)S?tCg66Mc(#o9JA zQBZA8wF%~=Xf~WsNa1F(-w8T?$Ap+so6|@9$$tU$>S=I;o?q9e4d=$7#y6cntHne= z$Y3qM2tEzn@cZ` z_9o8sZ-De_;frqCPoapI6j?9)6qVRthp=zey0(njR|0T9$GSb(w~?7H5v^h*YNEbGQcvI1b# z^kQ=ag~bLSzk|d0%o~QltxOx%FERngf<9R0TRmB zKOR;HNE$JiplZLsw5wp7_AbZ#QRx^!0N@sUZa!I}Kx$gVr&_1=LD#y&)Virl;VS=%ER=KI{rOWVkC9yA zNx|=;izuSeW5;?8t|Z_cJ8>V_(L6t3T-laiIo%K9#_TK3jHE4f3z{{w%i`Gt5*Xd@ zsavu+1|LY*Xwwq|`~E=5?rqZebphrJ^vDenv?AM^5dfYI_P47{n_zJ0J7Yfn)jr7f? zpW@^RU62Btc$;IF=aC%^I;W|rG5h-BSO}W!ckxP)>@F5{WPp8$D|^3-KB&`R(138> zYm&V`2zk$W`d%k}GP}prnyaHMHmp+G{N5rTeRXi_3LjOFkUsA4sR%xD01tu3CXfO- z2Ef}$A+pF6R*TyxkM1Gp3&TiH6HZ_LMeu% zTP(aDCO6K!#1>sz+#-ygXoEm-h*9yP*0PoHXTRkKEL&TKS8i%lLiaeXzsF-c0jqGf zbIE+}n;jYH_|4HFk08^*qBN|-<=@sg`2mVl9$Bz43%b0?Yf`pG&#CNB#){;}O{k$6-h zIx;w~7Nvy|*F4Qx3n5Uw1Z8CezNn6XlM!WO$BDyHkeHYuH24afkYa?hrVm6WVhxS+ zauMOK+T@XHIZ(aCvntG`UP)<05IZT)W>3q79wURv^;KjN*n2Xr`^y^}$*~d6kCp!1@T!KXV_|3ud~^!WYpg zvYw!*{ttSbO$;N4HaJvpaxLI*As~2#y(}rC%U-<_B2xuX+d(JSG|D@pXSwZ;7GK86 z@IkwPx+voKM{>c@1=oTK<6*?xSZ4lEIv)ZGz+3%xeWB=-bcO1RjDxKB*bR3;h^wao z{=NCz0Q`WDX}@`x^m!z23`e5F=n^iYdU8uO8X4}bN4 zd0!tKu92@#yf#l=c0;psjbJaamIdWIkCo{}miUEXh6&>@e;%+n2dTAY z;j53f(tK0Rx4zwW$}GfvibBnz!&MO=r}c*}=T6!@uaKGYff<8!0Ca@SReNmE{N7QLF*8j!BQ5KAxjY)QN|I7ne%*1 zT^w#*&(JSkT8CaD?59pTiXl6tj$}@S!gbp10c>I$xkGYvQK>BB2-59JiA9VF7lCZ3 z$i9sw2ILS@YW=HC!fR(E)0zSMFZvWoaC5iYsE=Q$+7QM8#J&b&0ghT&3LkXC!pur{ z$(4Gc=>?LGe#s=_LSF~z>iNDd`nXAOw|Z>XC^s55DB65it29;v)^OcU?0SvVp%WzO z5cbP|9YPsqgCB$_`qdg{WMprw7Mc!lM;9%o1cDt z^Y1S~4_7T?kRA`bQj0NS9Lz(!#?C!LMo_R}A|e~boih}?%T83bKOX|-TX!$UU7O@v zN9LoZDdwnR@W5D%4yn+FJz^hfC4C9HQVTKqJ(%}JyuXxH3S6FSY*kJb&)mn#IM4$7ve6Z^F;&7QPT5g~OId_P2dx!Yx`Frgwk!Zxf8hm( z{wFr}k>s5w^~MdCHuHInps+8}V5|(J+p%)RtFTD2V2dI4v9J7PT*OAEj!wP#W{z zPP%h-cA*i;t35q8zb0y2(O*>lFYL&Q{ zlvb2i@#DHsL`1u?6zpXhMky)k<-Q+p>}QT5ymd>+!M*lr_Bv3U&A=>ABOj;}+xv>L zdGWY{UN?(hT$lvz%WLeoM!N;N?Hcol#EGgO8q-qFd`>S*{Hq^ueH3DdnKsvR46xsLWdaht&u`EK%qN*4*vK|kO}2)AHMFKOxtM8V~D*t9T_m}ZOWtbg`ElC2_E>^#Y+|} zy`{P6WDsoZPr0s<29Z4Na?IKs7b}~r&tD{y2k>>b-2mIEZy%F$ zwg+okd`w~J<#M|RN^$U5iJ+xwT%Zk@QW@DMEmvE~d`VW3{Ge6u_rg&wwRj zs+|V=YW$2>9f1DH_c5?}JYa?}6dlB?LPA5M>0yW0-R3D2fPNDl&r#E%#v+krrYs4M z5i2C<^7IxTop+0wBI&UrM;n%%Btu6CQ&<4&m-ujb4^7sJh8tGpt*$)hx;9XwmG|zu z9ZvJ$D)*YFk+kSxXqVi%7ay6(s{p9%g-pMgy(qSjzLL^veBqeF^8tY)Wn}rmj2n5^$`K)gSujLY4~lJY2avA&bT|*s^0Idw!uSbP6GaS0Pn{aBmS;%=uh5 zM{M}}mgRiXLiTm@DI-6xI9~?!XcT52eTIyVYbG-Q@d_=54WQh%+9u$;APWk9tO^?1JP1+D9fK- zyi?%CHa>%z{t~TEbF)1A6h{qhl%7x{i{R@JozF_aYYII1KfHvWq0M$gVwJT1yiz$L zQ3Qnsf}roS-EEVGSaws?HOxjZO}LY?EE0-7bLU4QM-oT1VpV_Jfd$8(8z^z-Im=Aj7Ca-fdoiFVrpxZ+CZE%Y{##UzhL=~-=-fd zlp(VnFU;rm?N_4dIZ?|Fi(^wBc3E-PQriY?8NPt$22oTM8dus*!p8J~)ZTlLjgLOK8<6gBXgqJT+?4kB7V!05n(%0>^mj6F z(xI#0D00Mt{XLcr#b>@p(N9(krby*uboUp*1)7)p?DEHF1n^xv?d@9&54;g_nUkJh%N-A6zlT@eY0$Sb7=L)0%-Xd1DYv< zW{+?T9fn9H!>(M+Y!d^jcmnwg`^8*9GC$t3Q0DCNdIK*~1-R`4a?RGyF-n z9j>uKazR0H)cDCoAhk8wJfI{U6f4GANFqYj6+=P ze$I0gUD~jOQ@jl+kvBO=3RbMo%y{r{var5s-(4w+e>{LLjx+V0D68dm$sH*%E-arM zJJE8y4iDb%)Qa(!3i$#UF}m0=@v+Z-;vxzYOA$KuNttgQHEEQ|TFORBymesQ0b0H@ z6WegT`G%zT2-xTLv~|GQt-*R>po*f(v(Ntg^yKu{WRbWBj&lfN7&|pL0#-=kEzd!5 z)y25X@)nZ^MR*Zg4y=t4sXyi@U1yZi^TW7JaWO^pLK;Wt{QtKXNjMfgRHc!8G_w=y zHzC}x%p5~az;}TR_3>{!7Al(+NV`0Uvdn;i7;~T()Xx5x0;#J@!&D)S`Xhth{6{f<@~p2_O#W!#92J0f)6CCYr6;vvQl*PfpMw_2 zH`~U>4M0Bu=bE3-Q1@y8JMVrYL+jxINUUGlxi>_hugYVMcYY`*2W~IOU_+MJ+5P}(57gEe)QG*P~LuB|>j|E&x^~RQF52?=h z*`w%7M#pCaq69;CSXA2JdSplrRuDTXDqR~94h&@LR!0z|D0=_-t(btyMt#n3M1jl! z9X;~&)6w%ix1vDPu`&&EZ_6jO4bW?;1C;Am(Q0_1$6-BvC<4&9C*|cs4Cg-t>VM_~ zs0n#kwEfbscD0*0j;c|wt2mjMFF*9p=LSanNJ5|B|DjV*7N`VI??hv>Zn_>JYnNVm|T#o3iuGJB{qm%tO);Gc zFPGA3q#O(7e>jghh_M0&Ja}`+F+TDL^ASoreM@g+2}2>x4xqf`w~}0mCwZzp<e;wHq*Vbt1EYfFS;T@!fetY#NsdBVYjtS$$g=c2kz67W3{ zr$ez7Q&CfNE`8vA%;LDaj)BHm`JiCL^l;O;1f;H^iHgw*ZK(es3;sM<^u|JC^au!L zIF*wjXG04CRynOM^1BLtL8-u=&mFMF69T}Iv5btfK!XbDOGb!vNSOy%@l&qlj1LQb zEjv)q$=l$S%R~Jz(3zyz%)o^LU-n3vw^_!aRZ#Pb;=DiB^Q)j01FRFwB$#84!ekQJ7DcA5-byS%P3{$UH@ zZ7E#ze4EoLtKP@Jn)a6!75uk7&>CAPCaokjcz6>EwIP>|qTL`YEFtLj0&K&@OOltr z2pv9j`8$@|W#BtDUk1iL{vy;Sk$%PTBQ`LDWCo@p3GlmrZ-1mAaQi*< z$B3>PT<|$);I+Mq|IHQf>#PRf%f@IqV@&-EzNo4GvJOxVswt0(+CP2BBO1B<`w7X* zMI(C~b+A4{B4N(C-~w@Wo=zqM8M8*ha4zH_#p_Q2x%5+r8uKkSHS_ofAaPYGM?DhS z{dDRT)a_SUa8AiO&&3n|+|+Y<{gDep;QZqxt;`FFDTvPy1=BHZVh|L4ppIIwy{aL4 zXzD%DIu1>N3(>IJfG>-{=B4dt6sVD7N@SckT)HHPRq0>1xL<)YSStu}_dft!`P7Gd z2R598Y?Pp-1N7E-QdV~%Sg2@d`-@It(tq(48(E@a0I6ewQ^B@oJ#1N(HQ#V9fUBv4 zF1!<`mL|_vh&6;s1yAZPq;LUD-;Lb+=B7E-m=XpCkUOh` zYV(5!JzDR*!Zo|~Fc`n*+Rj!DU~{Zg0bI$-FoL@|TIbi=INx*PAy_%E^6QxsWHC zBmUs@L4o2lllon|$1L%(3;Ne@PucL^-ZuvqF1Iu8D$|4Y+6>QUyJ2wY-GV`%@mrEA z)5jx}-Zt%C-e37n=dPazQ73Q9>oVtOjr9wpCT;7>I?Lxcva8|MhT}#5r-9=Se0cf( zGl2g2JfcS;s#s#?G`v7z{V+`VWXI0R54(Q%313z`flUR&Ag92NSHvRJ0NyGV<>-MR zj+Y3xtzCECN!w&Hw0NLF!TpvG>7z=w{Be%j&Rr~O6(wMySVVY?a96Y!sw3Dp@qC{i zsF?WZ4M%H?XQNr;UI-&FePZ>5Kk|BT*=BaJV`ZXg#ogquY$~oyp>*E6+}(e47*W=t zh5|V;21^LfK@}cjGd~9O!e@+-;Ksj4Mh1%7hZuow%hcuF`z4?rxaoT;p)vlCq-s8Y z9QJRw2QxSOU)_f)H)Iy)eCIglSkoRY^PYO9T2(%@e*7Pe$Y#BOI5CNJjaiN=z(o^$ zIB_FAh)rGtSMh6z*2w<0)WJ!Ao9OKP1)N3bnNnu$C9rCAmi>a(h_-ohkzG`=*nv*eF?$#PHjE z6(MW6mBq@&b1aqrdkrpkl#r`OalhCUj8(&o=>Ey~*JYcym^mC~>Zv<2$R{bB$l~@A zsYF?fLiT(zHm^Pq&U+4>Lu8zrx6e||^$I=~P7xlXw*P8vkQ(M1Tn1I zmLk4QrJ=1#cU^a@3b`U<%S*}NdgYt>_s=q5`BUqR8my_A%%B`EvO%wl6@~5mc9^pB z6!BqMMbOI&PXf!UNl+{@q?%uI8R#~cZXnb6;{O!x-3W?pxfIp_t$mxHnZJSq+8IAt zfWvowZ$;MXwe9qO#qCLQH8qI^a*`(}5)u!w*woDX&YZN7oyw(H?<&89*ZSpu_zUhc z>C_~@J#X9j`xbE`as`RNE$xkK=N#=<$qH9F?EX|&5q#kbbYOnysj8zz=js;-%(e1J zBU7%q16ZgD*>}&$_wZ3^y@OS1WUwut zRpW(J=y-SJ`unLtY%ws#l?L_Ntpsadi_{7l4MppOSREqSIn5_5P3{cMAs#@n+iZL;jMCrl$(HVvqj(>JtzpM7Mp1q2>B# z3$3BM@S|ZNIVGW~Ib-VAY3E!FHE(Y$6ZlpL;6vqjmF}zcY z$uuGuo$#a8g@!dhCh_o-;CdzECxz7i<@j#fWw8LQfMnyS>gM9G_4UHDLW~3=t+m)V zkR$9OWd7^iNH;5w_A8JcS8{*Mjb<|JJs9TN2Nb^XB0+JlP|J>r(w4807>_GVTmdri zwy~($-F9{{?{Zg3v);VJ+1yZ!bh54RCEDpXy*a~vk=%TWEzWWtZ$4lWn>?n-Ku>7q zdCfoioY}IbMuBx?{tVc0T?|FL0Szen#-H=%v`8!<*=<}iUmK{QCwNMCa8uX&_f@{Y2R373y#>7uMV9(b9 zG-w{Zr9UFyexP!A6#m0Ji^tFZs`5g%uJ0$t-~=wv3vFMm}jU zQH;1YYlyhDYM$7>p*O>vk%umlGReKNpktd|hdOTrQheRG=WO@{BA;+6l`<@y+dn$f|ayzM(Fr&c0EC5 z?)$R_wF~wdtrt?r!R6jAN{%5ROXp`r@uf=J#~%IZ1zx^3u(JgK2h+LFfg||Z-@J_F4f0`r%x)FP)biy zq1;cP=eU1g*gv3AAfL9) zyVt`d#dJjc`pYl1T~*lJtMd70F!^P877FoH0lAj*5-2auYtVo!i)c!JHkHs6cLpx; zURLuXvwVhWe$VJ@0xnzE8%E2&4Y+>N4>%r=gqBmBv4rvkw;jMr+Z5=o4ea(I=up*ks_~>heL>?0=v)(*91K->Qu%tL zB6ZT<#&3>K)h$f0l?_9%v>o#aSDw52FOFMmCIur&B|-jN!X)}FLEVEB{yGSz_!rQD z9;HFJ#e2RtNTQ#epuG57XMank z&1c@cN;IOTKL(IaeKP6LXg>1}SL4k;={G;<}$ICW>hCg%lFU}$@c z+6c-t>g$xaH1c3}MBJzEhK+9}`7Mmg_wuQlauMxPGX>){5dUKuyQsZ22tivLdBMf- z%DjBz-lYD$Ne?k{lu6IpCgA!pZBK6JvGdg4N|;>yd)GywRF02|$antQ4JLJazWF6G z3+`(68;?3pTw=Cc=}H#7h|H~oU@}C(Qn!~B246{b-69~n;Y2f=m@{p+EhPSFO$p+e zF7<(!+6caVi>4*K{PK&7b5M>lO)!RN{q`AX^wtaPdcS!b&fK-N*26`N%DxgrTFbQe zku94HcN6{iKAGbt^!;q2;b`fMcFZunx3x3tldB`$_(vyTxYNUJywyXSj`C~syH^Y) z6AoiGE&SR>nUPRV_b)rEC$7u5_PWnipZHA)5qe_nKBhY6xHK`e$scZ`%_x= z+I>f9B5S_?`gKPRSIu)1veoT=k!WkG1_|1H>DJ~BU@%@bw#G+YhBdO^{k{QC4ptjSy?bmuBqeCy3OKG|G3cNYa0Cb_RnZ318U2 zwS)a$OprP#Xt22D!7E?@HqC)Qw`VOxf-1P^h6H}HgU#CCMxv%B3Tbc9v}bKq7MI=$6sihNufbfg^uj zjb%31I5qy==*QWW-0mJJS(-bp!S&6bQlEU5qX-9=X4cc}+Cn+9ysp}UB#BGNpfONiCI;{l1L;{=RpQFx48qVtSH4dYjgvvC?! zk~~sf7l`jeIQg?nVWabCmxTHE9s;sg7(%%+M7ee9q;USWkG25bq8GUs&@i`Ta!;z0 zW;4ZM{%GwiQ4n0Z>=5Y8k8C+8_CfrD9Q8LH-du2+>48qzi06O$v7D-6j7F02g&drb zC!_YJlyUMcA=X%bWkj*)7FU1z#TNeKLnSw7d$q&RVrhJN1CN5 z0+Nd|NLdz0e`5XvD{u{}kp}LY9jGR${Wyu-C%U6SHJ%bYipMQ2r{@%fdB3r90Y<;M zzdywtIlwsToes2n_bKGt91Y|G6nZXyM2vb73f#mC=!zs!|9aK!i8=fjm3YgBJ3Eix}$=occ=f<_7o{ zr#yLs`(tY;c4=TqMCuH6zj@OYB`O`RkVo#_BE&SU&_d=02N0UiC5WL`1C%y!%8?@x81c$%1a+Ccd)QWZnO zI3BS6^S9o>vVIz9kmtLfvD4>q33Z`pJa1}PGXZ&wTw2dJ`QG)X3C~?_d{!aUrH^su zu$VRFBgWT|sV;bkWg*jg#pIvZ%wPW2a6)q5xR?NLGTywk%9&!N&-^rbm&qsp;~1)M zQ0}=0mOxWZJgFxb#){WlfTzb4{@#XO2>A}f;P;KY1`{*V?9JMn4gzM@-k%q>k!ly~ zAiIl|3hy?4>5L+l8n~ZLNzm?W4aqGf!0{ku{Sw!yp-rvv2H^eRzRie|BJl6SI+`O{ z?}7<}Df<@R0nhX5$rwP(DoJh{tiAREn&3Z}A@dMVGCazQ7;DdNIRLB8>FdD;}pK>FX$;~c<7^E*)GnQ*XAEQ}?)d8kS zJbkO^%5|hm958#psxlRfsnM`Q3MVB+VU?&F!wd|cik<_%Qp=!yM*&`NCf(MRLx-p+c`moFLIg&CBK; zVC69=xjbIJ$4$|Pxv33N=ohDVq?Tj|qO zv@hVFLV~d1{Y>x{{|5(*DB^z~{8V#ldNI?7sx{p`LMll})&Ne@Q4O}--@v(>xw#=ZPdVDjn>?Of^KSYsMS zRAu8HhwX=rp9JcF*N#RqbbNW8HXN7@-+vPEI5BPFmb2gOEipkzVa<@(3{SLf0%pLM zGu;^~F8WSuh}q!tr!G)t##1&B<8S&IDWA}j_ldFZ9I$<#EqhuA94`aB1bx>8=KWpr zFAc4r&e(o*viVaRnigr_BL^k;k(pbC%ci+lXjS5|FkJe@5L3ym?X-&!t;E{mviG;_ z@NN~lW6EQu?dV-fM0L6T0qEBl9oFNwaT=Q=PK;ZcDvrbpW|=b{*}RfU57Nbkx({tL zSo>la6ui?m3B7ro8A~j!T={?vW!bXr_m&Bc@BOwsYIVp`8dM&a#NoHG$%aXyg09rj9Z)waj6i-Jv?}V^a)5`eJ0LaJeJ0|jS^JUrB{S{mhdD0 zy*mj{ddMbfj-vhg^z_HeYn@P_1W!(X%h~lcq=##FjTDuJRd7C@WkXZSANWsxUC>L- z9}jJfyY8-8nmG_#^R$JjjvhXCjZ>I?wl_NzBMify{zXI;C*9Atxgl4rqO$Wbm1XV> z_#k~Gv_mh7D5o>&dH~9$S${EhP;1sq6PL^Dp{1y!Hp?QweYuTYswMx+1ILh;X+^Nj z0S8^k9895O%bXQc5*vM5&)dib|M&LmgpAEo2scv5U$rubiP=5^ruVUJPthKUn3T$Pj%|Mg) z;$e|KSD|KCjVP4%k)%W5a*>MOOh5Z<^{R>|2_o=8&}L)n6tFlhmi!29W^*HZ>sA||1Dxm7qq66pl! zFF?fdN^0zK_w)VVVc0O@6hJpx*n1`FW)nmsA_&lW7)7?5oY4VF@1PaUa<#}WV(=fg z1e9@U zCP`xANGA->R6IE&Y_<)fL0K0AX&wFJp4Oi8SDfM(O*J(|WD2xVfbI0KO z5_N!#CMm~w1eG=JBm5XH9a;Pg$h-3f^sC#}I`yKYBW?aqd4HEYcW;LQEB%rPE4^m} zXhm%TB9ioQ${>39c0BYVpoOD|b*RGkgXL!SEu&zz%^UDYmKYv02p0Z)|hLs>)z>m&nF!$KEWBPnUl@ z>_73WV8#MbToREwu<_OEc#Ug=jbQ?nUTH_Vnb}qyXwusz7A|1|Y!D*pew&NkOvx+a zTSxVhQBPZSsaSN$z$!hTVAs*S(^6C5GZ~3|dgfoD{~9Edh^z(PZ>9Ei5qYb$Ju)O% zdE`;6NrP$C&c8VS9ps?8IyhkSeuij0kj22ZYQD5*hYM_NTwIm8n(>;*9)%}qPNx~2 zcfIEMg51lYSi6c`;mN0u06`t zDp5`2QF3{1Wy_+3i-%o@LbTTFN2;2_rxYCq9m}|jc64<~0U1TniPq!~aTSOqe_LMw z))z$GKZoL2yUz=I@*G6wXhdgmSHnu}#Rk`W1*dkTGj9L<&N}$W8}9s2n&(RU_`Qh@ zdd{ylk<%ug;#Vc@h-qrC- zkfJ+b%<`uqAN1_OuQ&VmJ=)(NkI5LAb&cY|lp+kI=RSuB>ekhb(7Qax*!3RI9wJTijIA)us``Na0Bu|ayS?qaeH6v6=!52*oXS!Sm%}g( z`284MEe8X^%`|&@<6naB_gM6C)1r!F8fdQ#N--ssc%aJ|ob`uNP#J-Jf!$V|X{D%7 zr)pX$R47Y>k#(y|GI9w!f~g00`9O}_nB-o|hYFmDhf``_?49ahnXhY6(#wm56y54H zNQOmjW$!1BJ2n)h494Ih7BO8&XlS5+OY|Z=%5%X@U8wp)voc3C?IQ9+J%k=Yc4imG zkU2v$68~NOGKpy|UhRA72J82bgW@E1WG$`%k)-IqVy-Kpyf6`W=g@XtSezfvcaNu^ zTPZd&75;SJt!C6aCOGm7$p&}awY;}AEEOKb=Ttlz{nm*oI&u4xA^`VCOnQB@S&~fe zXHcqO;>1K2BjZLR+61y z*Lu}4|L*4~8&ssk$0Rw&%ESKqd%&0iK|_F+?_#d@;na;YXM0sd{C(TKVVrla%7+iu zrnAGLWmd(wh+Dn>dQZ4oihIQ9?ec2&P6vW9+nRY!kezI-YKji^?4?tmANF<)k`gB1 z?^7*dzq}Ymh5m(Y$Cmki$opRW>7FwQ~*r;1JwpctBmT-Xr@L^BLZ5 z?K_CAL3gt5FD7;cZsJtiE-Edl=&QN(A&6!(EGM#W>0 z_Gs5@-L}h{vq^e%zO=0Fh+Jum?)X@Q1?HT`OOTquR?Ss7bZNY9n^$9I-*oj}GkR`Y zo5pA=k$NM!$iwk#d4OE7ukWH-6hF#I^XcbulmaE1^8kDyN~Xl#kvDuz-aOrhBJ!i1 zsI*KB9qZU`1FYY7Yk$GrI>sILXGb+MW71LnDU^-fc$)5>tV#z}AwI_<*Mqb{W8m~@ zYKP^5A1=x?2pFX@YY2f))sJldRwZKNcyG?k7$lh7|Kb1bB$oja=|D15Eg6E26Rs?K zrgB>UaZs2ZQq2o50zQs?mYhFq=8ugi-op9hPHLay@r@tm{PJ^L{QI7B%MJ3hQ=KeaTUE$r}RP<+wsfm`P011`UG# zF=09o2t^H$ft%V!fC07`V(oJwA1#ypC_>g*_JO$9fH~4p2h}x7 zE>7%&6xDfLow2MeT-?ulkN$f)NtXugQ^a1T*zeMnMXMA|1 z!6(m%7p-3xMos5Y23huPPik+HgxpVlfl%L^=6~V?+IJ!&TscA7aLt=y;?DMRjNDrP&$DFpRdWz=CLxWvHo#S!KXZ1R&N7ER|=o zp^m~7C|SNY{rU*IxM2{6mgS`d{_aCZNA~qb-d^7XD#HJ4&E3fE94h8+ME<*jb*CJ1 zL`X@BPc}Q>Vy83GXn_`04jLuotQABLE*yX5*NU5eV9)YTdP6ui*6FjB_I2~;XOnxy zvIn?pY+Q(Bfdwfj9o`T7<-*5j*?Eo)_aET!_j*wb;Ls>qZDr#Ui&%I7BoB#Jfg~E@ zH-Tn{!vg(47b;I%R)hZ$(#_z#UAh<=2PvcTQ2_2qBIx|O3@6)$F|mWHrxLe0m1b0> z;72Jh%D zzm2OsU}}Gi7$j!yE+Ah4ENA|HxE%x%ypil${e0!91oABU_(0U8+H#jK3 zBLp3Z6hP6RGn27qkl0-aVjtx*%MpHoglQCaa-becPXBEh#g&CjCCZTnz{aIamnjgR zc&ZsBFf?>+_GlqK$SRFHgD8p!15^|AmGOn$EUwm+Lu&;aM#a_O~h4fjVPaya&F8F;Roq zM@uJds_(-&|4mJNJD-r{S7o&mR=B-A7-qQi((%PH=!#b4?PU@Hbrd_yeE#|S-&pk7 zAjb^Fqr0PAdh%ysH0nG?eVYOu8wUTlCALFt=InXILoDlePB(uVuH-X_i@s}d)6aP! z@T0mrg4>!%W$AOR(v{|>M^fkm+R!=iv3wF{VFJ9FtWzwv6j2NP$`few68IAwsfm=3o&AL^Q=ds5B+CH?lxE3O)N`PGQBP&Kz1trl z>5fTa#IPDE*D59R0ZC?k+Gp(~z9e)SBC&`sCIpH|h1(z3jO79&ubw|pxnj{rAnOu;YHsC>Z!Ic_aed+LXVfZKxqn-g|^Bul498%GT($a zenX@m6gk@9;uXy;wKBC}ZZ~)7Rc4#(lk1o;4B+DfG5zVg~+d1^cBABOe*!%0Ei^!4Ge??fEQ}tdLn39=%eg zcygKy_&P^7C`D+|82gAVLc$4XfNxPGnc#VA682QqNU%AXy(??PMCn4olh4 z2nTIg<3$HVx(}~T_8_C$0S4Bd+ zF=b)zU^j3#uox>lC5_#BmvvMjXr)UjHpzzy9(^y_;})!cVGCCEl@L9qyhy)=f&v}ma_qjA zIRi%lT^wVODF=~11kE~}H(j+`3w*(nzdvd{*$`=j(Ad(C-u4EhO;F=I7G^sxJ8*g? zOX>@jWc9k{m3VqbPhDLK{@~`?w#cTzcVtGrX+5u0BukgX|1FV^2x-|m4dM*6>)$d= zZF!2J!2wYw6hS*so@=uoO<>#u-iE8GOPzEV%V)_m5uV%LMo?Xdn<`Q)Vluu zCEo$|%|!uhL>ouV_Gb+)EtB&}K|eRN@YqnR{!IA5zezyv>)0jc#1DTV!u|ApO8g^3 zOo*7jWzT6}(WppZ-!V?>KZmI>1^uC*=o+b(UaLz*{f|Spt)!*17{UBcZ!c1SJ6=?S zaFFE$(zm}7LnDF2vyQTK@^Jlw=@F#Jm;+_M)5*aS(krjtxvb$MM8BrIbLHWnPq4~; ze?pCGN^eus3j3BYj_@r37 z+zR*LSNIsavlzQPo=`ow3B5!oB)B{EXnCrEzm|^9Kdk>dHO05Y=XLJ< zEsr-E5}tW%fX6hExa5=)_^y`w-rwT1TB-|_Xy?tY(Xj6{HVl%&4^37Udj33I>vs|( z$1_-m(O6FPUgC!^kCFXo*-*^hT+j0u?*gx6PCOHBt%zSVdXl+{JX!-Gn`&va+WGS9vPc*!|>jr4TAtmFXw zEadr7#%qhky5P{**R@=0->2$$F7wtcjKEb&vi4cv67+!HR%prZa2eh>4udT1ZE`5SJ>i@Xqtw3IF`TfwPLEh&9Q zP-rqXZ;GlpC979lj0~rpdYOv>=ik2n7?_5Gufzu`l#n|hhN&V6M$JZNwM%r(V*;zR;Mb7i&%SqQu-y@+*2?9zsDW%u42|Nm z#Tb)VO_E*ktx^mmv9kr;xBErikKq+_PL3B+1^!|Q+LGlQN*}XY^{*r5!eK;OqFg?@ z)_$^75p350&w9T8#=v-1hufWIg!4s+*+jOgeHF@v#3pR|sec-H(DyAb&7sSH$n$eH zqvIdlVK>4+T;2L&`8wXGY9%Xyxyf0|H6Ym7{vo~iDbDSchwdFl4`w#0l_{4)kqm*G)^zx` z#x<^$36VG}oK`^5=^M>iF&?_?<6 z0Lhd56;;)F& zN-HDek-chN3#&+|i|;NAS6TYtJH@4&rz0=*0y$5X%Ph~rbK-RdKb>QKOIzY_2-rRw zz5MiLhw5&OeQn}w@6Xgj2XiU;o{Qtx&2J;SzcBCZLTv_vd|&+ZzGTEGir`JUa*)Vf+)@=r@3CPxx<1L*KgM!n+Rl?4&~dE->f`s zyP6v@gLHrVoHKn$NH|EL_a+8wG;&q;ZCFUn`0FoNsDo{hRyNh|+z=t5&gf(&p?fh; zjQQmqK!XA=>c!$ko3y9;00N10 zM*QI_hO6f-nhf9_=8)tJX8E^3wt3!6F%cg@A;-gYi`(HJ)N=GW*W) zxhJp3`-+P1oa?I3Ev2d05ZkSYM?DY=jOZwTg0lsJoA%(Uy#L@og;(6-04ZWZt6F7G zD8_J>`bdm$a)e(#o6Y_C9ky?3US|nLAxbfi+c9sDicjHSX)V=%ff;nB77Ce;sQ!?D zZr2+GUKvq(@mYf*dj1W0APgC~+?!LZ(khg)dE<~6tn@t~U=idc#wVwYg_oJFxo5`e zmEx0$(H^QfRgLYM3{}oCl}WahcnRSxwe5d&|F@^}nBjM)mMERzsUS;1IP=GCgi*)EZvbm zf$RpSP{F4Qc3?-(66%<(X8WR}RDke7hC+lzNz!C)b5ARQ=|T+}2gJ9=IEG&8%6Xei zRdAi)+}VH1Drb735kRu(!&{Ap&7AlIgJDxg@wHJ9yj>$NJl>Fi?gY((Nj3=ek??bz zP%-p{M!Ya5iHwAu_W{!a9{9IT*XDav%9!Kj$SKJSiOuvzGmYys=?5PSw}VoIpSalA z^Zo~FCKbvFT01sT6%!M48V_N1Z=pc8s~W`_{}PpAy>$6`jRwdbbK&m&FjzjYo0mjxH@JQBn;5 zbhWIjm3zGk0c@MM7W`I(acEb())P9Us>I%@Oph3TsbQD6%Ob-8%{Dz|vm7HT-g|m( z%it4U=}uO#Bv_ck@J3ZQOFDd=0I{t%qp_02IlW=Q*;XR`iw+T~o?U%I4U{@h*+-{A z-xg%_lXl!^o+a1AuyipUAwVCzi?b}G__Z}37Rh*vBB0MB)W+=SBZET|apU8`b}75y zcxfh_QW5oHKH$@0{C}MDp)Uv6_LoTQl`_8%-#?#^2>|G5JF289Pz0y=m92T&qaL&c z&vNjU@0cofe4g<5yg-?m)vt#{H{;xI%v+jvF@<0*ahRB|y9hHD4-%W2F9|3iw_fCv zB1o)HF_E6XvwMAg-7XyFA$m3Z_KX*o(m6&vsVl}aOP(d7UppJlx?mFI`+U?}_gGf% zu~bj}>pO{C8xn(H?nzp$FKN%>65LJ5k8*^N=e;VO@YkrYeeTN~`~G|p<4q?)br!=n z3I@%_?gYWd3?4KnVUl-SSTSRD9!{l&ZNVFu&10C&YCQPuK^TZ+amQ@w2XEh!?J4=I zTS-6fv}=+>Mm`9;8$F2#e{!)mOc%q1SBx@5OX@f_DElz*rq|8x&R7)j>!&tgq&K|I zuyrZwjm1wU^?l&W#W_KYqucoBGl8p{ci85ZMovlsXv`}n#Ns;B*G)2M;OSEBjCg4R z7`!$O)v>uh^D7vdVy>7?FyAiJt|{o#_X@xKqw4f$G6y2-y}uLXmKqqe1z!7ZtUr-E zTw2GAj0mznsw52*D$;(yV;U62_bQIssyDv@^9#eNP&4;(F1|LS(-KouCBAkp+4g&g zb6^#|X|hKTmh&P0w_Z?ZyHdNmQ=?zR`>?o8Sw5P#AOV}Y0h?g$n4Eea6j)WaG+{Hf z8;!^=vHi5chyY zcwS!Mg&&}p$8T>D02o!z^|}Kz5?gpG_kpJpvim;^<>*j^YPn>fj^OrTZgj&CS_SCv z?BX-q4WOur{KOM8TWqDM60w{~$K)OWh%zvyU>qSPOq^^d{N;uV`vFg{@-gD(54cuQ zq!OUnqKyu1qPfj=A z<42KRwE3(FpE+4cxg2RFI+I~!Q#f-4X3;&e8Ar~aVt-QQhg_{!`Jle zhWlHVg+o^XBj!vK&;k)>T8+M&B1cv03K6hd@N*;eDBw}Lb7BQzGl)QH)Z^5mQbd{H z3Q_5YfqO!qdkYMHT;H2E#*^5;Mj2V&^=eYD1Gt&~nQVMz&PQj=mHgQI1 zG>(+|^XiH?zHda3pz0RJc=QYcw(RXVQHWn!E}Gb<*BV^B)%~%g$k#VPV$%)(9cA9% zcU;h2GAqS!KJahQH)1)hh8bLYEz8P@Qv=z^)qo$|s|Uj`0k!-1hi#I?Hku&^;Ei0# znGssd-IV;DXz+!=m-MqBNo?lUEN={9iszA}$L}He6 zmHfzTX~D&RC6J}d)A;%}%n7{G_a_kfSw#N)eyKgxaioSq1$s$`*5Xm?_c^Y*0S2cxKq7LggF&WbVXi@i#5J9@iSYsH>PmppB z`2@8rRy)^ootfS=dlZauSutFd(HC94)J$5K0JK!UL9l0|$;-y&u+fR^mBB?%UMw3r z0!wMy4)=8KOy}u@PqChXTyD+?rM;HVU1e}ndsR$#Hux3 zX23%v?t4RX(=ud&MW4Cg#QJ@cSV25do(9w zfomzJ{G!si?^%OE8k8XW<_DpBKH3<}g8&gPjRo=>jYsEyRHphtyuMCcLk=Wv)E2c?qiM?|1nJkSu#; zZbt8W9;6qsMnrtlab9o;dfxXKttHx!M~zq7bTGMO{ui=)nbzN%;IfGimHMqdRHL3s z^Sbj_fP@sYfxA7w@d*Vs)0T2M2~!nBD+ULHgDyVF4__&173_+Md(Hn6S%sIJqb(~` z`oXT2dc07Gnw>g5o%mq+yr(T({*&piMINW?>&mnKP4OQ^w{Mr4G?!0fBBv}Vk$g~% zYy;=%`RWH!>q&_>F(TbPj8bijdpW>IsCi>6BMh~(U zLV-bX3?ZQuhv<8H)oDz0UL6z05i8_2t*!PV^hP4Rp}H$TiXTqI|6W3%0? z@Md?Uojs3}bHO&n{M?gMJbu~K*7xRSg8HxKzpi+-$by+{nKhi(JE;{4GUTlz_e7cK z`=FRV@9rNkkt-g=fEq!m@Ot#m%Fl@A)N9?bZPav3DF_Z5Ntsh-rl}4wX8-e8tTt84+^8-yEUf z`8IlEWR2=?N6*ShJuZvquD3%O}~@}sYK#iu9LF1 zH^;Yp`X4b%23t>!p-Xzro_tk^=JWpFo{9(R`~CFryZQM{rmJ>9ZKEjHdDxuUM)A|b z_*=p1bv!rMRKAb;Lmc~X&*JXfwNHmN);A%9%=Vm}1k7>~Nxv_(LHhq`?8?8P{@(a~ z&tS5|WH0+($i7V0AzMPSmu;-sY1A0|TN0^6WXX~&Sq3G9P$Nqc8rjBD82eTd#Yg4q z^F7}`;Cp|%&pFTYy64{KJm=hV&+GMEbhBO+pd8euyv@}=@IZSjoHWvgZF89W^L$Ig zE!CWAY@f4-Hmg~uUTuAtByp%&;zFL}y`afJGK2WvT@-dE@-WrlFE4j?yPSxpTAY<3 zQ|ISP_!6ZO&~&vPzP`R-$xNo-cuQO&zBHei{)Nk6hbStw)*U4Ls1SObjc~XxBD}*J zcZ0e3k^q*oj$1g%1(bK388T%~MiM>3BO=6e%d4*|Ofpc0ZaGAsg1wq#k>BTzIHX>1 zZ4GZDt#54PBlweMS+HL?IE7J5&s<;Y=*IJlUe`w(uk|!8mx<8L+%pgq9W@fYpjd^X z)LY3UIyySO6JGb>>CH5XtDo!qxk{jk=Y*@Cp|kb#_qU!uofh5P$~8ItnwqAUo_zZU z8!Jw6g)y?tBKIV7D73*xmNW=xr%0Gi?2>CL@&^H;u4GsD`7tqhx#ELJS_k3$`b z+ek6*?;J{)#Fq#Pk*FQ;$j;Ae`e97Rw@B0D0+9d9Pdg>y>=!IYM;mfg|3nTAi%Sam zsFU9J)d|f4?)wu;W%(I9m~3<8E=%GR)tv=Ln$%{{r&DBU&X39SW-W9h$Ug=aGYa7M zjbGc~k-cBsjmBAMGl1ef%1M6gbeuE_nFYr$tpCwzQ)_q+$tpFtm9^c}X7&CESUp^k ztUXz5daFo4xj_YIBvuB$ZF~*?3Ir*{n3u-!4-N^r?%F`BD^(DC=iwuX73Wq?tn}xG zIS1LFNP5f1pTB4%cc~MwCY|p45kTI(*8CCAG!24z`}s@l8jR1eb>X#-%>izNblZV!Bd1$V^_}@p-V%#&AbbGeF?X$gG1#2S3UmTSkvY`QOxk>Fs;}ThJ@+xO$ejffs_;Fk zVeSXF`ywy}p7VpzGN;4H!N`nPPEeG{EoZ}v1HL!U8~xLxlu|jz^v{SQLSLRx9(Z>Z zs=r(@o;FId?R|I(-n#W_&YaR`3)%SSXL?PT1^0yLH%2iz*#z)l%jR(e790mn1v`RH z;X`7ozeb}d_dbebIX4iwA(qzCG@m-7i+vJwZfQQ@(tOEoP!-+qBphZT2m7JLb@ z6lPB97uMRE3yuJ7GWUWGOX%(2UlR(RJ9N9Bq~Xm6ZyQPD@lJw8``Sa1u%ND8(yYvH zeYU~{(|(KcXho)+Q?P-~c6Xz45nc zaDrGUGVXG-7<-^zuk87NGb{JpS^F_0KiT~))H+)zEd7V~w?;ln$o(WAxp&kQ48ER; zv|Q-cBU#Tl@5$~f^6Fi5@qvbe!njPnwp}Ef1+HbBfdw3lKgK1wcz}MHhACvaK@E@` zWnGyaP=ft48cU?E=e_=74>G97C~nU~5Smw6af37ep4O3vA22oyzN#IV;RlR`(l=Mq zXK-BEM3)mOX9l)4nQ&Y8B6c#>x|Oouzj52-um&xYA!aPDb7(C3?4ZwZV(6%hs^3xr!*3YPemN^R6IA9`+b)!c{cu&zY;m~j+VpZwZTLNZU5D=y?Bb@ zO(e0SJyuFLthj~##p36rXhCh*D{#4(s9n%0C!d{n9FZO6e?<7?xX#}wAi2d(6V66Z z;Sco}Hrmg1xF&klewvEJx%FSm5P8v%-!`sQB;<=(l3w5P6@d=#~L zEB>IW^;qqO;P0*|bgdj8S?Dvy2{~WGhcdzo#2=A&^?`0GH^7nGi__nPDM8u4pTOq= zd1&%DCLBj#;C|+b-&8$_e`hc11LjJbmGbG(+fLBUj=pEVD%;Z4k3!-Vsyustd2be9 z=eeZI2&WPaoz1U;JKbE6Q|p3k6<;xCP$-QxpT3-4D_BX{9B1-qR*7Ne##oHgW)?LrA zQc{0MliYV-*ffZn!oY-Wb*NQU4I_50ZuaTNJo*>JFsBD41MMF%@aSRbHchT5O1Pf@ zlK;d)ZnL*}lmu&t?Kil|zqg}CST1=WbD9Xc)lky*&!3jWvMWB>A-&hHVE_{}z(vVkP{kLNsAy(#AJgj#dvK=oDlbm49gaUDRCymuEmG)8R69P?UHY z{_0M+2~(SV!SvVZ;LMxJ`@gKI=C$ETxLC@EmqMz@~+vn%l1RILBTZP z(Zef(68_7gy-uT0?v0n zK2$*@Pgrs?Y>MSYBCT1d%XTUU3P8!APrInmQjNZo~lzWqR|OJuO+$yClx9YoFQ{gBMw_<0?nU?tXp zi|x@I8wUX&w9{D0V^-ryENd;pF2dk|ZjEewzwk)O zZgGhE(QC?3Q);B02GBJr6@8)hj20iAQOk`bzLA zk#Prrk+_~3Ybav)dYKdz^J^#T629xi?^g*OR?oUErBf{Jip7CUOT{c-TJZJP+EZ&s zpxsni16*2@1CV1mg|D9O9IKf7(N2_{^UF&K!%bJY4QVB zG{LYS)9>DAmG77;l%#AG15f;&T^aW9O^YTK*G{#w%|C1do6qKC@6f<-jlHPMtIV)3 zi9}&(zzK8iNsd(z{jb=??E8_PafDFE*|5g*;jv-$OEOyQLLeENjI8>o-V&nee>;ET z8nJP0ipzA@Ptv1~=Y0pdATTj7Z7ozw{Wp!Kt_KQvOEBf5TkD1Ub|uw14ajFBXwBT) z6IE5#B(j?-Z=iwBQeQC5eijrelr*tvfP-%z-7h!FZR8RQq^?~}3hI^`28Un9(-(dS z_MP@r@jB0wxa=KumU-qo<|hzetu4LN@j|=%l^zJ`Gv$EITZ~LUfAwTi=Ypl|nOlma z>*})a8w7!xXNZ^pRuijNN=+p%-dsl}aHxp1klTz{bSd046kT6Z`ipf>i zZv1YH)4>(U!ELPE?r2t4j;H|a)V7JV4cBV(n(Sf3di3T8X=NzLX%0vvRtVnV;c<33 zF}~Q;RUk_>zh$<_Sl8Gj4o)6F_4UpOdg2diCRyfK=&+}{^{^F0RqUBfDhSE4nO&sA z^_(s$Ju&ekgH%zFPNe?4m*<_nBzZhdC*?isc;KU5Iv^otIB3%A^@2kw@w~1h@BU+` zTV!Y~`Y0!{mkJW)QF;|m^-pm?O04@6h~YP49X=#M&Mf-3wlVxFK`v1pKR)@mD#Ko{2c za=>5eHMS}VQjYV7jgZuxOA9z)0d51*c1h4%DanTGKw40Fa;MchE7IT}Og4nba0o|G zzW?En;;qLs6)nGre#DB+%8eMLy>}U;Dg2$YD(Wrsq!KEZGBiggOjOsbkJLOUN<_n; z)V2Vy%@1v4v2bYs|~ zAeQD*d1a{Wl|YER?`WBD=)AK1+WXY^=6;da;sD*r{4Khf$2s2K7e1RvhrU6-QP<^K z^;#`(DX%;+y}G!4>TZ*l`e9lKvJml&Q4BR?e@X;kygiIL&5j``m!IPk7zN2!Wt;#W zOOI1gBUvNhxls*{F1%e5po5Lw`ie}F6`{kKC`QJNPGev^8vsEIbk7am`;K(r{~nul n+8Fe|-st(@wstzM{|1to7A5UQ=U#R!|7)Hzv@odA$KCi3^jY%g literal 36931 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�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 JFAT7e{{b7QLec;L diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step1.png b/chapter_graph/graph_traversal.assets/graph_dfs_step1.png index 5475e3c6129b9a7a0b8fe2ec546b2303fe6f1106..1b5c6545b50ac74be094182d846ff2601327e8e3 100644 GIT binary patch literal 16812 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 diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step10.png b/chapter_graph/graph_traversal.assets/graph_dfs_step10.png index c749a5f85db0697dd77d99f48b6852c0a9237ec8..1546427bdfcdf901342ad42517f8e0725278d6b5 100644 GIT binary patch literal 29244 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 arZwruyYU(fAtpTk+G@($N_7g>5&s9szTaB_ literal 29134 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�e3*ph&7AI@;kp? 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 G#D4$+7yR)6 diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step3.png b/chapter_graph/graph_traversal.assets/graph_dfs_step3.png index e69a50d3d8c80a84afabf2b03f70ad576d59a21f..3be25b69988f037614517bb0f292f5ccef1e1223 100644 GIT binary patch literal 22088 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 IX`!C}59BqN3jhEB diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step4.png b/chapter_graph/graph_traversal.assets/graph_dfs_step4.png index a0ff56f92f41804fec081accfd111a63ba23cf9c..c5a8c881060e2afb17bfb88514b043d1845d495e 100644 GIT binary patch literal 23038 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 Qo97tNP}8|tq+<2-KUpxW+W-In diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step5.png b/chapter_graph/graph_traversal.assets/graph_dfs_step5.png index 7c174e36677220c22b2c562206834f46ebe5792c..1f12ccb5f3c174ec294724f529beae1bf9cd8452 100644 GIT binary patch literal 23475 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 aI2+n9aV=-g;dx8 literal 23368 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 Vs?N!Ilm4GNEp@${@2}&Y{6Ae%8%O{E diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step6.png b/chapter_graph/graph_traversal.assets/graph_dfs_step6.png index 23a01664a91df1774b64c7892169706b36ed0d41..08086c855f308f7bbb7c6f35f7f05904e167fdfc 100644 GIT binary patch literal 25774 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 TL-cmSzwL)A+V{)vS%>}?=@pF- literal 25699 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⋁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 literal 24425 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 diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step8.png b/chapter_graph/graph_traversal.assets/graph_dfs_step8.png index b2d529514fe129a2f3017f87ffc30a14c248cc90..d6cf543ab96e8e29a83db455405021de92365950 100644 GIT binary patch literal 27528 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 ?kI(@g>5^*^SXpCpoDvdNbTV7i=L|Px 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 diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step9.png b/chapter_graph/graph_traversal.assets/graph_dfs_step9.png index 1a114f14c0993f691e21ed581464cda1e554c396..78759442f1a6e8afb24ccc72e7f79e887eb5b79f 100644 GIT binary patch literal 33033 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 Ku3pAG?Ee9mfdlLS literal 32797 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 TuqGez?=KYv4f)y^<{|$N^>4Me diff --git a/chapter_stack_and_queue/deque/index.html b/chapter_stack_and_queue/deque/index.html index 0e3c837b9..bdc0601e6 100644 --- a/chapter_stack_and_queue/deque/index.html +++ b/chapter_stack_and_queue/deque/index.html @@ -3788,28 +3788,28 @@
diff --git a/chapter_tree/array_representation_of_tree/index.html b/chapter_tree/array_representation_of_tree/index.html index bb3491d52..5f43155bd 100644 --- a/chapter_tree/array_representation_of_tree/index.html +++ b/chapter_tree/array_representation_of_tree/index.html @@ -3811,7 +3811,7 @@ """列表容量""" return len(self._tree) - def val(self, i: int) -> int: + def val(self, i: int) -> int | None: """获取索引为 i 节点的值""" # 若索引越界,则返回 None ,代表空位 if i < 0 or i >= self.size(): diff --git a/en/chapter_stack_and_queue/deque/index.html b/en/chapter_stack_and_queue/deque/index.html index c593185ae..3db3baaf5 100644 --- a/en/chapter_stack_and_queue/deque/index.html +++ b/en/chapter_stack_and_queue/deque/index.html @@ -2258,28 +2258,28 @@
deque.py
from collections import deque
 
 # Initialize the deque
-deque: deque[int] = deque()
+deq: deque[int] = deque()
 
 # Enqueue elements
-deque.append(2)      # Add to the tail
-deque.append(5)
-deque.append(4)
-deque.appendleft(3)  # Add to the head
-deque.appendleft(1)
+deq.append(2)      # Add to the tail
+deq.append(5)
+deq.append(4)
+deq.appendleft(3)  # Add to the head
+deq.appendleft(1)
 
 # Access elements
-front: int = deque[0]  # The first element
-rear: int = deque[-1]  # The last element
+front: int = deq[0]  # The first element
+rear: int = deq[-1]  # The last element
 
 # Dequeue elements
-pop_front: int = deque.popleft()  # The first element dequeued
-pop_rear: int = deque.pop()       # The last element dequeued
+pop_front: int = deq.popleft()  # The first element dequeued
+pop_rear: int = deq.pop()       # The last element dequeued
 
 # Get the length of the deque
-size: int = len(deque)
+size: int = len(deq)
 
 # Check if the deque is empty
-is_empty: bool = len(deque) == 0
+is_empty: bool = len(deq) == 0
 
diff --git a/en/chapter_tree/array_representation_of_tree/index.html b/en/chapter_tree/array_representation_of_tree/index.html index 1ddad7875..16db62f93 100644 --- a/en/chapter_tree/array_representation_of_tree/index.html +++ b/en/chapter_tree/array_representation_of_tree/index.html @@ -2279,7 +2279,7 @@ """列表容量""" return len(self._tree) - def val(self, i: int) -> int: + def val(self, i: int) -> int | None: """获取索引为 i 节点的值""" # 若索引越界,则返回 None ,代表空位 if i < 0 or i >= self.size(): diff --git a/en/search/search_index.json b/en/search/search_index.json index 864418205..b36d4b372 100644 --- a/en/search/search_index.json +++ b/en/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"chapter_array_and_linkedlist/","title":"Chapter 4. \u00a0 Arrays and linked lists","text":"

Abstract

The world of data structures resembles a sturdy brick wall.

In arrays, envision bricks snugly aligned, each resting seamlessly beside the next, creating a unified formation. Meanwhile, in linked lists, these bricks disperse freely, embraced by vines gracefully knitting connections between them.

"},{"location":"chapter_array_and_linkedlist/#chapter-contents","title":"Chapter contents","text":"
  • 4.1 \u00a0 Array
  • 4.2 \u00a0 Linked list
  • 4.3 \u00a0 List
  • 4.4 \u00a0 Memory and cache
  • 4.5 \u00a0 Summary
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 Array","text":"

An \"array\" is a linear data structure that operates as a lineup of similar items, stored together in a computer's memory in contiguous spaces. It's like a sequence that maintains organized storage. Each item in this lineup has its unique 'spot' known as an \"index\". Please refer to the Figure 4-1 to observe how arrays work and grasp these key terms.

Figure 4-1 \u00a0 Array definition and storage method

"},{"location":"chapter_array_and_linkedlist/array/#411-common-operations-on-arrays","title":"4.1.1 \u00a0 Common operations on arrays","text":""},{"location":"chapter_array_and_linkedlist/array/#1-initializing-arrays","title":"1. \u00a0 Initializing arrays","text":"

Arrays can be initialized in two ways depending on the needs: either without initial values or with specified initial values. When initial values are not specified, most programming languages will set the array elements to \\(0\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig array.py
# Initialize array\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]\n
array.cpp
/* Initialize array */\n// Stored on stack\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// Stored on heap (manual memory release needed)\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* Initialize array */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* Initialize array */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* Initialize array */\nvar arr [5]int\n// In Go, specifying the length ([5]int) denotes an array, while not specifying it ([]int) denotes a slice.\n// Since Go's arrays are designed to have compile-time fixed length, only constants can be used to specify the length.\n// For convenience in implementing the extend() method, the Slice will be considered as an Array here.\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* Initialize array */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* Initialize array */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* Initialize array */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* Initialize array */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* Initialize array */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* Initialize array */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
\n
array.zig
// Initialize array\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
"},{"location":"chapter_array_and_linkedlist/array/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

Elements in an array are stored in contiguous memory spaces, making it simpler to compute each element's memory address. The formula shown in the Figure below aids in determining an element's memory address, utilizing the array's memory address (specifically, the first element's address) and the element's index. This computation streamlines direct access to the desired element.

Figure 4-2 \u00a0 Memory address calculation for array elements

As observed in the above illustration, array indexing conventionally begins at \\(0\\). While this might appear counterintuitive, considering counting usually starts at \\(1\\), within the address calculation formula, an index is essentially an offset from the memory address. For the first element's address, this offset is \\(0\\), validating its index as \\(0\\).

Accessing elements in an array is highly efficient, allowing us to randomly access any element in \\(O(1)\\) time.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#3-inserting-elements","title":"3. \u00a0 Inserting elements","text":"

Array elements are tightly packed in memory, with no space available to accommodate additional data between them. Illustrated in Figure below, inserting an element in the middle of an array requires shifting all subsequent elements back by one position to create room for the new element.

Figure 4-3 \u00a0 Array element insertion example

It's important to note that due to the fixed length of an array, inserting an element will unavoidably result in the loss of the last element in the array. Solutions to address this issue will be explored in the \"List\" chapter.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#4-deleting-elements","title":"4. \u00a0 Deleting elements","text":"

Similarly, as depicted in the Figure 4-4 , to delete an element at index \\(i\\), all elements following index \\(i\\) must be moved forward by one position.

Figure 4-4 \u00a0 Array element deletion example

Please note that after deletion, the former last element becomes \"meaningless,\" hence requiring no specific modification.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
Code Visualization

Full Screen >

In summary, the insertion and deletion operations in arrays present the following disadvantages:

  • High time complexity: Both insertion and deletion in an array have an average time complexity of \\(O(n)\\), where \\(n\\) is the length of the array.
  • Loss of elements: Due to the fixed length of arrays, elements that exceed the array's capacity are lost during insertion.
  • Waste of memory: Initializing a longer array and utilizing only the front part results in \"meaningless\" end elements during insertion, leading to some wasted memory space.
"},{"location":"chapter_array_and_linkedlist/array/#5-traversing-arrays","title":"5. \u00a0 Traversing arrays","text":"

In most programming languages, we can traverse an array either by using indices or by directly iterating over each element:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#6-finding-elements","title":"6. \u00a0 Finding elements","text":"

Locating a specific element within an array involves iterating through the array, checking each element to determine if it matches the desired value.

Because arrays are linear data structures, this operation is commonly referred to as \"linear search.\"

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#7-expanding-arrays","title":"7. \u00a0 Expanding arrays","text":"

In complex system environments, ensuring the availability of memory space after an array for safe capacity extension becomes challenging. Consequently, in most programming languages, the length of an array is immutable.

To expand an array, it's necessary to create a larger array and then copy the elements from the original array. This operation has a time complexity of \\(O(n)\\) and can be time-consuming for large arrays. The code are as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
array.cpp
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.java
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.go
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.swift
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.js
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.ts
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.dart
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
array.rs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
array.c
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.kt
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.rb
### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
array.zig
// \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#412-advantages-and-limitations-of-arrays","title":"4.1.2 \u00a0 Advantages and limitations of arrays","text":"

Arrays are stored in contiguous memory spaces and consist of elements of the same type. This approach provides substantial prior information that systems can leverage to optimize the efficiency of data structure operations.

  • High space efficiency: Arrays allocate a contiguous block of memory for data, eliminating the need for additional structural overhead.
  • Support for random access: Arrays allow \\(O(1)\\) time access to any element.
  • Cache locality: When accessing array elements, the computer not only loads them but also caches the surrounding data, utilizing high-speed cache to enchance subsequent operation speeds.

However, continuous space storage is a double-edged sword, with the following limitations:

  • Low efficiency in insertion and deletion: As arrays accumulate many elements, inserting or deleting elements requires shifting a large number of elements.
  • Fixed length: The length of an array is fixed after initialization. Expanding an array requires copying all data to a new array, incurring significant costs.
  • Space wastage: If the allocated array size exceeds the what is necessary, the extra space is wasted.
"},{"location":"chapter_array_and_linkedlist/array/#413-typical-applications-of-arrays","title":"4.1.3 \u00a0 Typical applications of arrays","text":"

Arrays are fundamental and widely used data structures. They find frequent application in various algorithms and serve in the implementation of complex data structures.

  • Random access: Arrays are ideal for storing data when random sampling is required. By generating a random sequence based on indices, we can achieve random sampling efficiently.
  • Sorting and searching: Arrays are the most commonly used data structure for sorting and searching algorithms. Techniques like quick sort, merge sort, binary search, etc., are primarily operate on arrays.
  • Lookup tables: Arrays serve as efficient lookup tables for quick element or relationship retrieval. For instance, mapping characters to ASCII codes becomes seamless by using the ASCII code values as indices and storing corresponding elements in the array.
  • Machine learning: Within the domain of neural networks, arrays play a pivotal role in executing crucial linear algebra operations involving vectors, matrices, and tensors. Arrays serve as the primary and most extensively used data structure in neural network programming.
  • Data structure implementation: Arrays serve as the building blocks for implementing various data structures like stacks, queues, hash tables, heaps, graphs, etc. For instance, the adjacency matrix representation of a graph is essentially a two-dimensional array.
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 Linked list","text":"

Memory space is a shared resource among all programs. In a complex system environment, available memory can be dispersed throughout the memory space. We understand that the memory allocated for an array must be continuous. However, for very large arrays, finding a sufficiently large contiguous memory space might be challenging. This is where the flexible advantage of linked lists becomes evident.

A \"linked list\" is a linear data structure in which each element is a node object, and the nodes are interconnected through \"references\". These references hold the memory addresses of subsequent nodes, enabling navigation from one node to the next.

The design of linked lists allows for their nodes to be distributed across memory locations without requiring contiguous memory addresses.

Figure 4-5 \u00a0 Linked list definition and storage method

As shown in the figure, we see that the basic building block of a linked list is the \"node\" object. Each node comprises two key components: the node's \"value\" and a \"reference\" to the next node.

  • The first node in a linked list is the \"head node\", and the final one is the \"tail node\".
  • The tail node points to \"null\", designated as null in Java, nullptr in C++, and None in Python.
  • In languages that support pointers, like C, C++, Go, and Rust, this \"reference\" is typically implemented as a \"pointer\".

As the code below illustrates, a ListNode in a linked list, besides holding a value, must also maintain an additional reference (or pointer). Therefore, a linked list occupies more memory space than an array when storing the same quantity of data..

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class ListNode:\n    \"\"\"Linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # Node value\n        self.next: ListNode | None = None # Reference to the next node\n
/* Linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the next node\n    ListNode(int x) : val(x), next(nullptr) {}  // Constructor\n};\n
/* Linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
/* Linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;         // Node value\n    ListNode? next;      // Reference to the next node\n}\n
/* Linked list node structure */\ntype ListNode struct {\n    Val  int       // Node value\n    Next *ListNode // Pointer to the next node\n}\n\n// NewListNode Constructor, creates a new linked list\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // Node value\n        this.next = (next === undefined ? null : next); // Reference to the next node\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // Node value\n        this.next = next === undefined ? null : next;  // Reference to the next node\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n  int val; // Node value\n  ListNode? next; // Reference to the next node\n  ListNode(this.val, [this.next]); // Constructor\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* Linked list node class */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to the next node\n}\n
/* Linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the next node\n} ListNode;\n\n/* Constructor */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
\n
// Linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the next node\n\n        // Constructor\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421-common-operations-on-linked-lists","title":"4.2.1 \u00a0 Common operations on linked lists","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1-initializing-a-linked-list","title":"1. \u00a0 Initializing a linked list","text":"

Constructing a linked list is a two-step process: first, initializing each node object, and second, forming the reference links between the nodes. After initialization, we can traverse all nodes sequentially from the head node by following the next reference.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig linked_list.py
# Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4\n# Initialize each node\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// Build references between nodes\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// Build references between nodes\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
\n
linked_list.zig
// Initialize linked list\n// Initialize each node\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// Build references between nodes\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n

The array as a whole is a variable, for instance, the array nums includes elements like nums[0], nums[1], and so on, whereas a linked list is made up of several distinct node objects. We typically refer to a linked list by its head node, for example, the linked list in the previous code snippet is referred to as n0.

"},{"location":"chapter_array_and_linkedlist/linked_list/#2-inserting-nodes","title":"2. \u00a0 Inserting nodes","text":"

Inserting a node into a linked list is very easy. As shown in the figure, let's assume we aim to insert a new node P between two adjacent nodes n0 and n1. This can be achieved by simply modifying two node references (pointers), with a time complexity of \\(O(1)\\).

By comparison, inserting an element into an array has a time complexity of \\(O(n)\\), which becomes less efficient when dealing with large data volumes.

Figure 4-6 \u00a0 Linked list node insertion example

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3-deleting-nodes","title":"3. \u00a0 Deleting nodes","text":"

As shown in the figure, deleting a node from a linked list is also very easy, involving only the modification of a single node's reference (pointer).

It's important to note that even though node P continues to point to n1 after being deleted, it becomes inaccessible during linked list traversal. This effectively means that P is no longer a part of the linked list.

Figure 4-7 \u00a0 Linked list node deletion

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
linked_list.kt
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4-accessing-nodes","title":"4. \u00a0 Accessing nodes","text":"

Accessing nodes in a linked list is less efficient. As previously mentioned, any element in an array can be accessed in \\(O(1)\\) time. In contrast, with a linked list, the program involves starting from the head node and sequentially traversing through the nodes until the desired node is found. In other words, to access the \\(i\\)-th node in a linked list, the program must iterate through \\(i - 1\\) nodes, resulting in a time complexity of \\(O(n)\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5-finding-nodes","title":"5. \u00a0 Finding nodes","text":"

Traverse the linked list to locate a node whose value matches target, and then output the index of that node within the linked list. This procedure is also an example of linear search. The corresponding code is provided below:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-arrays-vs-linked-lists","title":"4.2.2 \u00a0 Arrays vs. linked lists","text":"

The Table 4-1 summarizes the characteristics of arrays and linked lists, and it also compares their efficiencies in various operations. Because they utilize opposing storage strategies, their respective properties and operational efficiencies exhibit distinct contrasts.

Table 4-1 \u00a0 Efficiency comparison of arrays and linked lists

Arrays Linked Lists Storage Contiguous Memory Space Dispersed Memory Space Capacity Expansion Fixed Length Flexible Expansion Memory Efficiency Less Memory per Element, Potential Space Wastage More Memory per Element Accessing Elements \\(O(1)\\) \\(O(n)\\) Adding Elements \\(O(n)\\) \\(O(1)\\) Deleting Elements \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423-common-types-of-linked-lists","title":"4.2.3 \u00a0 Common types of linked lists","text":"

As shown in the figure, there are three common types of linked lists.

  • Singly linked list: This is the standard linked list described earlier. Nodes in a singly linked list include a value and a reference to the next node. The first node is known as the head node, and the last node, which points to null (None), is the tail node.
  • Circular linked list: This is formed when the tail node of a singly linked list points back to the head node, creating a loop. In a circular linked list, any node can function as the head node.
  • Doubly linked list: In contrast to a singly linked list, a doubly linked list maintains references in two directions. Each node contains references (pointer) to both its successor (the next node) and predecessor (the previous node). Although doubly linked lists offer more flexibility for traversing in either direction, they also consume more memory space.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class ListNode:\n    \"\"\"Bidirectional linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.next: ListNode | None = None  # Reference to the successor node\n        self.prev: ListNode | None = None  # Reference to a predecessor node\n
/* Bidirectional linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the successor node\n    ListNode *prev;  // Pointer to the predecessor node\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // Constructor\n};\n
/* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
/* Bidirectional linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;    // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n}\n
/* Bidirectional linked list node structure */\ntype DoublyListNode struct {\n    Val  int             // Node value\n    Next *DoublyListNode // Pointer to the successor node\n    Prev *DoublyListNode // Pointer to the predecessor node\n}\n\n// NewDoublyListNode initialization\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n    var prev: ListNode? // Reference to the predecessor node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(this.val, [this.next, this.prev]);  // Constructor\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Bidirectional linked list node type */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to successor node\n    prev: Option<Rc<RefCell<ListNode>>>, // Pointer to predecessor node\n}\n\n/* Constructors */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* Bidirectional linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the successor node\n    struct ListNode *prev; // Pointer to the predecessor node\n} ListNode;\n\n/* Constructors */\nListNode *newListNode(int val) {\n    ListNode *node, *next;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
\n
// Bidirectional linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the successor node\n        prev: ?*Self = null, // Pointer to the predecessor node\n\n        // Constructor\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

Figure 4-8 \u00a0 Common types of linked lists

"},{"location":"chapter_array_and_linkedlist/linked_list/#424-typical-applications-of-linked-lists","title":"4.2.4 \u00a0 Typical applications of linked lists","text":"

Singly linked lists are frequently utilized in implementing stacks, queues, hash tables, and graphs.

  • Stacks and queues: In singly linked lists, if insertions and deletions occur at the same end, it behaves like a stack (last-in-first-out). Conversely, if insertions are at one end and deletions at the other, it functions like a queue (first-in-first-out).
  • Hash tables: Linked lists are used in chaining, a popular method for resolving hash collisions. Here, all collided elements are grouped into a linked list.
  • Graphs: Adjacency lists, a standard method for graph representation, associate each graph vertex with a linked list. This list contains elements that represent vertices connected to the corresponding vertex.

Doubly linked lists are ideal for scenarios requiring rapid access to preceding and succeeding elements.

  • Advanced data structures: In structures like red-black trees and B-trees, accessing a node's parent is essential. This is achieved by incorporating a reference to the parent node in each node, akin to a doubly linked list.
  • Browser history: In web browsers, doubly linked lists facilitate navigating the history of visited pages when users click forward or back.
  • LRU algorithm: Doubly linked lists are apt for Least Recently Used (LRU) cache eviction algorithms, enabling swift identification of the least recently used data and facilitating fast node addition and removal.

Circular linked lists are ideal for applications that require periodic operations, such as resource scheduling in operating systems.

  • Round-robin scheduling algorithm: In operating systems, the round-robin scheduling algorithm is a common CPU scheduling method, requiring cycling through a group of processes. Each process is assigned a time slice, and upon expiration, the CPU rotates to the next process. This cyclical operation can be efficiently realized using a circular linked list, allowing for a fair and time-shared system among all processes.
  • Data buffers: Circular linked lists are also used in data buffers, like in audio and video players, where the data stream is divided into multiple buffer blocks arranged in a circular fashion for seamless playback.
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 List","text":"

A \"list\" is an abstract data structure concept that represents an ordered collection of elements, supporting operations such as element access, modification, addition, deletion, and traversal, without requiring users to consider capacity limitations. Lists can be implemented based on linked lists or arrays.

  • A linked list inherently serves as a list, supporting operations for adding, deleting, searching, and modifying elements, with the flexibility to dynamically adjust its size.
  • Arrays also support these operations, but due to their immutable length, they can be considered as a list with a length limit.

When implementing lists using arrays, the immutability of length reduces the practicality of the list. This is because predicting the amount of data to be stored in advance is often challenging, making it difficult to choose an appropriate list length. If the length is too small, it may not meet the requirements; if too large, it may waste memory space.

To solve this problem, we can implement lists using a \"dynamic array.\" It inherits the advantages of arrays and can dynamically expand during program execution.

In fact, many programming languages' standard libraries implement lists using dynamic arrays, such as Python's list, Java's ArrayList, C++'s vector, and C#'s List. In the following discussion, we will consider \"list\" and \"dynamic array\" as synonymous concepts.

"},{"location":"chapter_array_and_linkedlist/list/#431-common-list-operations","title":"4.3.1 \u00a0 Common list operations","text":""},{"location":"chapter_array_and_linkedlist/list/#1-initializing-a-list","title":"1. \u00a0 Initializing a list","text":"

We typically use two initialization methods: \"without initial values\" and \"with initial values\".

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Initialize list\n# Without initial values\nnums1: list[int] = []\n# With initial values\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* Initialize list */\n// Note, in C++ the vector is the equivalent of nums described here\n// Without initial values\nvector<int> nums1;\n// With initial values\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* Initialize list */\n// Without initial values\nList<Integer> nums1 = new ArrayList<>();\n// With initial values (note the element type should be the wrapper class Integer[] for int[])\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* Initialize list */\n// Without initial values\nnums1 := []int{}\n// With initial values\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* Initialize list */\n// Without initial values\nlet nums1: [Int] = []\n// With initial values\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* Initialize list */\n// Without initial values\nconst nums1 = [];\n// With initial values\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* Initialize list */\n// Without initial values\nconst nums1: number[] = [];\n// With initial values\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* Initialize list */\n// Without initial values\nlet nums1: Vec<i32> = Vec::new();\n// With initial values\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Initialize list\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
"},{"location":"chapter_array_and_linkedlist/list/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

Lists are essentially arrays, thus they can access and update elements in \\(O(1)\\) time, which is very efficient.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Access elements\nnum: int = nums[1]  # Access the element at index 1\n\n# Update elements\nnums[1] = 0    # Update the element at index 1 to 0\n
list.cpp
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.java
/* Access elements */\nint num = nums.get(1);  // Access the element at index 1\n\n/* Update elements */\nnums.set(1, 0);  // Update the element at index 1 to 0\n
list.cs
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list_test.go
/* Access elements */\nnum := nums[1]  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0     // Update the element at index 1 to 0\n
list.swift
/* Access elements */\nlet num = nums[1] // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0 // Update the element at index 1 to 0\n
list.js
/* Access elements */\nconst num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.ts
/* Access elements */\nconst num: number = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.dart
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.rs
/* Access elements */\nlet num: i32 = nums[1];  // Access the element at index 1\n/* Update elements */\nnums[1] = 0;             // Update the element at index 1 to 0\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Access elements\nvar num = nums.items[1]; // Access the element at index 1\n\n// Update elements\nnums.items[1] = 0; // Update the element at index 1 to 0  \n
"},{"location":"chapter_array_and_linkedlist/list/#3-inserting-and-removing-elements","title":"3. \u00a0 Inserting and removing elements","text":"

Compared to arrays, lists offer more flexibility in adding and removing elements. While adding elements to the end of a list is an \\(O(1)\\) operation, the efficiency of inserting and removing elements elsewhere in the list remains the same as in arrays, with a time complexity of \\(O(n)\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Clear list\nnums.clear()\n\n# Append elements at the end\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# Insert element in the middle\nnums.insert(3, 6)  # Insert number 6 at index 3\n\n# Remove elements\nnums.pop(3)        # Remove the element at index 3\n
list.cpp
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* Insert element in the middle */\nnums.insert(nums.begin() + 3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.erase(nums.begin() + 3);      // Remove the element at index 3\n
list.java
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.add(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);  // Remove the element at index 3\n
list.cs
/* Clear list */\nnums.Clear();\n\n/* Append elements at the end */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* Insert element in the middle */\nnums.Insert(3, 6);\n\n/* Remove elements */\nnums.RemoveAt(3);\n
list_test.go
/* Clear list */\nnums = nil\n\n/* Append elements at the end */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* Insert element in the middle */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Insert number 6 at index 3\n\n/* Remove elements */\nnums = append(nums[:3], nums[4:]...) // Remove the element at index 3\n
list.swift
/* Clear list */\nnums.removeAll()\n\n/* Append elements at the end */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* Insert element in the middle */\nnums.insert(6, at: 3) // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(at: 3) // Remove the element at index 3\n
list.js
/* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
list.ts
/* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
list.dart
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6); // Insert number 6 at index 3\n\n/* Remove elements */\nnums.removeAt(3); // Remove the element at index 3\n
list.rs
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);    // Remove the element at index 3\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Clear list\nnums.clearRetainingCapacity();\n\n// Append elements at the end\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// Insert element in the middle\ntry nums.insert(3, 6); // Insert number 6 at index 3\n\n// Remove elements\n_ = nums.orderedRemove(3); // Remove the element at index 3\n
"},{"location":"chapter_array_and_linkedlist/list/#4-iterating-the-list","title":"4. \u00a0 Iterating the list","text":"

Similar to arrays, lists can be iterated either by using indices or by directly iterating through each element.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Iterate through the list by index\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# Iterate directly through list elements\nfor num in nums:\n    count += num\n
list.cpp
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* Iterate directly through list elements */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* Iterate through the list by index */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* Iterate through the list by index */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* Iterate through the list by index */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// Iterate through the list by index\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// Iterate directly through list elements\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Iterate through the list by index\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// Iterate directly through list elements\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
"},{"location":"chapter_array_and_linkedlist/list/#5-concatenating-lists","title":"5. \u00a0 Concatenating lists","text":"

Given a new list nums1, we can append it to the end of the original list.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Concatenate two lists\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # Concatenate nums1 to the end of nums\n
list.cpp
/* Concatenate two lists */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// Concatenate nums1 to the end of nums\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* Concatenate two lists */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
list.cs
/* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // Concatenate nums1 to the end of nums\n
list_test.go
/* Concatenate two lists */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // Concatenate nums1 to the end of nums\n
list.swift
/* Concatenate two lists */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // Concatenate nums1 to the end of nums\n
list.js
/* Concatenate two lists */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
list.ts
/* Concatenate two lists */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
list.dart
/* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
list.rs
/* Concatenate two lists */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Concatenate two lists\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // Concatenate nums1 to the end of nums\n
"},{"location":"chapter_array_and_linkedlist/list/#6-sorting-the-list","title":"6. \u00a0 Sorting the list","text":"

Once the list is sorted, we can employ algorithms commonly used in array-related algorithm problems, such as \"binary search\" and \"two-pointer\" algorithms.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Sort the list\nnums.sort()  # After sorting, the list elements are in ascending order\n
list.cpp
/* Sort the list */\nsort(nums.begin(), nums.end());  // After sorting, the list elements are in ascending order\n
list.java
/* Sort the list */\nCollections.sort(nums);  // After sorting, the list elements are in ascending order\n
list.cs
/* Sort the list */\nnums.Sort(); // After sorting, the list elements are in ascending order\n
list_test.go
/* Sort the list */\nsort.Ints(nums)  // After sorting, the list elements are in ascending order\n
list.swift
/* Sort the list */\nnums.sort() // After sorting, the list elements are in ascending order\n
list.js
/* Sort the list */  \nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
list.ts
/* Sort the list */\nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
list.dart
/* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
list.rs
/* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Sort the list\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
"},{"location":"chapter_array_and_linkedlist/list/#432-list-implementation","title":"4.3.2 \u00a0 List implementation","text":"

Many programming languages come with built-in lists, including Java, C++, Python, etc. Their implementations tend to be intricate, featuring carefully considered settings for various parameters, like initial capacity and expansion factors. Readers who are curious can delve into the source code for further learning.

To enhance our understanding of how lists work, we will attempt to implement a simplified version of a list, focusing on three crucial design aspects:

  • Initial capacity: Choose a reasonable initial capacity for the array. In this example, we choose 10 as the initial capacity.
  • Size recording: Declare a variable size to record the current number of elements in the list, updating in real-time with element insertion and deletion. With this variable, we can locate the end of the list and determine whether expansion is needed.
  • Expansion mechanism: If the list reaches full capacity upon an element insertion, an expansion process is required. This involves creating a larger array based on the expansion factor, and then transferring all elements from the current array to the new one. In this example, we stipulate that the array size should double with each expansion.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 Memory and cache *","text":"

In the first two sections of this chapter, we explored arrays and linked lists, two fundamental and important data structures, representing \"continuous storage\" and \"dispersed storage\" respectively.

In fact, the physical structure largely determines the efficiency of a program's use of memory and cache, which in turn affects the overall performance of the algorithm.

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441-computer-storage-devices","title":"4.4.1 \u00a0 Computer storage devices","text":"

There are three types of storage devices in computers: \"hard disk,\" \"random-access memory (RAM),\" and \"cache memory.\" The following table shows their different roles and performance characteristics in computer systems.

Table 4-2 \u00a0 Computer storage devices

Hard Disk Memory Cache Usage Long-term storage of data, including OS, programs, files, etc. Temporary storage of currently running programs and data being processed Stores frequently accessed data and instructions, reducing the number of CPU accesses to memory Volatility Data is not lost after power off Data is lost after power off Data is lost after power off Capacity Larger, TB level Smaller, GB level Very small, MB level Speed Slower, several hundred to thousands MB/s Faster, several tens of GB/s Very fast, several tens to hundreds of GB/s Price Cheaper, several cents to yuan / GB More expensive, tens to hundreds of yuan / GB Very expensive, priced with CPU

We can imagine the computer storage system as a pyramid structure shown in the Figure 4-9 . The storage devices closer to the top of the pyramid are faster, have smaller capacity, and are more costly. This multi-level design is not accidental, but the result of careful consideration by computer scientists and engineers.

  • Hard disks are difficult to replace with memory. Firstly, data in memory is lost after power off, making it unsuitable for long-term data storage; secondly, the cost of memory is dozens of times that of hard disks, making it difficult to popularize in the consumer market.
  • It is difficult for caches to have both large capacity and high speed. As the capacity of L1, L2, L3 caches gradually increases, their physical size becomes larger, increasing the physical distance from the CPU core, leading to increased data transfer time and higher element access latency. Under current technology, a multi-level cache structure is the best balance between capacity, speed, and cost.

Figure 4-9 \u00a0 Computer storage system

Tip

The storage hierarchy of computers reflects a delicate balance between speed, capacity, and cost. In fact, this kind of trade-off is common in all industrial fields, requiring us to find the best balance between different advantages and limitations.

Overall, hard disks are used for long-term storage of large amounts of data, memory is used for temporary storage of data being processed during program execution, and cache is used to store frequently accessed data and instructions to improve program execution efficiency. Together, they ensure the efficient operation of computer systems.

As shown in the Figure 4-10 , during program execution, data is read from the hard disk into memory for CPU computation. The cache can be considered a part of the CPU, smartly loading data from memory to provide fast data access to the CPU, significantly enhancing program execution efficiency and reducing reliance on slower memory.

Figure 4-10 \u00a0 Data flow between hard disk, memory, and cache

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442-memory-efficiency-of-data-structures","title":"4.4.2 \u00a0 Memory efficiency of data structures","text":"

In terms of memory space utilization, arrays and linked lists have their advantages and limitations.

On one hand, memory is limited and cannot be shared by multiple programs, so we hope that data structures can use space as efficiently as possible. The elements of an array are tightly packed without extra space for storing references (pointers) between linked list nodes, making them more space-efficient. However, arrays require allocating sufficient continuous memory space at once, which may lead to memory waste, and array expansion also requires additional time and space costs. In contrast, linked lists allocate and reclaim memory dynamically on a per-node basis, providing greater flexibility.

On the other hand, during program execution, as memory is repeatedly allocated and released, the degree of fragmentation of free memory becomes higher, leading to reduced memory utilization efficiency. Arrays, due to their continuous storage method, are relatively less likely to cause memory fragmentation. In contrast, the elements of a linked list are dispersedly stored, and frequent insertion and deletion operations make memory fragmentation more likely.

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443-cache-efficiency-of-data-structures","title":"4.4.3 \u00a0 Cache efficiency of data structures","text":"

Although caches are much smaller in space capacity than memory, they are much faster and play a crucial role in program execution speed. Since the cache's capacity is limited and can only store a small part of frequently accessed data, when the CPU tries to access data not in the cache, a \"cache miss\" occurs, forcing the CPU to load the needed data from slower memory.

Clearly, the fewer the cache misses, the higher the CPU's data read-write efficiency, and the better the program performance. The proportion of successful data retrieval from the cache by the CPU is called the \"cache hit rate,\" a metric often used to measure cache efficiency.

To achieve higher efficiency, caches adopt the following data loading mechanisms.

  • Cache lines: Caches don't store and load data byte by byte but in units of cache lines. Compared to byte-by-byte transfer, the transmission of cache lines is more efficient.
  • Prefetch mechanism: Processors try to predict data access patterns (such as sequential access, fixed stride jumping access, etc.) and load data into the cache according to specific patterns to improve the hit rate.
  • Spatial locality: If data is accessed, data nearby is likely to be accessed in the near future. Therefore, when loading certain data, the cache also loads nearby data to improve the hit rate.
  • Temporal locality: If data is accessed, it's likely to be accessed again in the near future. Caches use this principle to retain recently accessed data to improve the hit rate.

In fact, arrays and linked lists have different cache utilization efficiencies, mainly reflected in the following aspects.

  • Occupied space: Linked list elements occupy more space than array elements, resulting in less effective data volume in the cache.
  • Cache lines: Linked list data is scattered throughout memory, and since caches load \"by line,\" the proportion of loading invalid data is higher.
  • Prefetch mechanism: The data access pattern of arrays is more \"predictable\" than that of linked lists, meaning the system is more likely to guess which data will be loaded next.
  • Spatial locality: Arrays are stored in concentrated memory spaces, so the data near the loaded data is more likely to be accessed next.

Overall, arrays have a higher cache hit rate and are generally more efficient in operation than linked lists. This makes data structures based on arrays more popular in solving algorithmic problems.

It should be noted that high cache efficiency does not mean that arrays are always better than linked lists. Which data structure to choose in actual applications should be based on specific requirements. For example, both arrays and linked lists can implement the \"stack\" data structure (which will be detailed in the next chapter), but they are suitable for different scenarios.

  • In algorithm problems, we tend to choose stacks based on arrays because they provide higher operational efficiency and random access capabilities, with the only cost being the need to pre-allocate a certain amount of memory space for the array.
  • If the data volume is very large, highly dynamic, and the expected size of the stack is difficult to estimate, then a stack based on a linked list is more appropriate. Linked lists can disperse a large amount of data in different parts of the memory and avoid the additional overhead of array expansion.
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 Summary","text":""},{"location":"chapter_array_and_linkedlist/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Arrays and linked lists are two basic data structures, representing two storage methods in computer memory: contiguous space storage and non-contiguous space storage. Their characteristics complement each other.
  • Arrays support random access and use less memory; however, they are inefficient in inserting and deleting elements and have a fixed length after initialization.
  • Linked lists implement efficient node insertion and deletion through changing references (pointers) and can flexibly adjust their length; however, they have lower node access efficiency and consume more memory.
  • Common types of linked lists include singly linked lists, circular linked lists, and doubly linked lists, each with its own application scenarios.
  • Lists are ordered collections of elements that support addition, deletion, and modification, typically implemented based on dynamic arrays, retaining the advantages of arrays while allowing flexible length adjustment.
  • The advent of lists significantly enhanced the practicality of arrays but may lead to some memory space wastage.
  • During program execution, data is mainly stored in memory. Arrays provide higher memory space efficiency, while linked lists are more flexible in memory usage.
  • Caches provide fast data access to CPUs through mechanisms like cache lines, prefetching, spatial locality, and temporal locality, significantly enhancing program execution efficiency.
  • Due to higher cache hit rates, arrays are generally more efficient than linked lists. When choosing a data structure, the appropriate choice should be made based on specific needs and scenarios.
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Does storing arrays on the stack versus the heap affect time and space efficiency?

Arrays stored on both the stack and heap are stored in contiguous memory spaces, and data operation efficiency is essentially the same. However, stacks and heaps have their own characteristics, leading to the following differences.

  1. Allocation and release efficiency: The stack is a smaller memory block, allocated automatically by the compiler; the heap memory is relatively larger and can be dynamically allocated in the code, more prone to fragmentation. Therefore, allocation and release operations on the heap are generally slower than on the stack.
  2. Size limitation: Stack memory is relatively small, while the heap size is generally limited by available memory. Therefore, the heap is more suitable for storing large arrays.
  3. Flexibility: The size of arrays on the stack needs to be determined at compile-time, while the size of arrays on the heap can be dynamically determined at runtime.

Q: Why do arrays require elements of the same type, while linked lists do not emphasize same-type elements?

Linked lists consist of nodes connected by references (pointers), and each node can store data of different types, such as int, double, string, object, etc.

In contrast, array elements must be of the same type, allowing the calculation of offsets to access the corresponding element positions. For example, an array containing both int and long types, with single elements occupying 4 bytes and 8 bytes respectively, cannot use the following formula to calculate offsets, as the array contains elements of two different lengths.

# Element memory address = array memory address + element length * element index\n

Q: After deleting a node, is it necessary to set P.next to None?

Not modifying P.next is also acceptable. From the perspective of the linked list, traversing from the head node to the tail node will no longer encounter P. This means that node P has been effectively removed from the list, and where P points no longer affects the list.

From a garbage collection perspective, for languages with automatic garbage collection mechanisms like Java, Python, and Go, whether node P is collected depends on whether there are still references pointing to it, not on the value of P.next. In languages like C and C++, we need to manually free the node's memory.

Q: In linked lists, the time complexity for insertion and deletion operations is O(1). But searching for the element before insertion or deletion takes O(n) time, so why isn't the time complexity O(n)?

If an element is searched first and then deleted, the time complexity is indeed O(n). However, the O(1) advantage of linked lists in insertion and deletion can be realized in other applications. For example, in the implementation of double-ended queues using linked lists, we maintain pointers always pointing to the head and tail nodes, making each insertion and deletion operation O(1).

Q: In the image \"Linked List Definition and Storage Method\", do the light blue storage nodes occupy a single memory address, or do they share half with the node value?

The diagram is just a qualitative representation; quantitative analysis depends on specific situations.

  • Different types of node values occupy different amounts of space, such as int, long, double, and object instances.
  • The memory space occupied by pointer variables depends on the operating system and compilation environment used, usually 8 bytes or 4 bytes.

Q: Is adding elements to the end of a list always O(1)?

If adding an element exceeds the list length, the list needs to be expanded first. The system will request a new memory block and move all elements of the original list over, in which case the time complexity becomes O(n).

Q: The statement \"The emergence of lists greatly improves the practicality of arrays, but may lead to some memory space wastage\" - does this refer to the memory occupied by additional variables like capacity, length, and expansion multiplier?

The space wastage here mainly refers to two aspects: on the one hand, lists are set with an initial length, which we may not always need; on the other hand, to prevent frequent expansion, expansion usually multiplies by a coefficient, such as \\(\\times 1.5\\). This results in many empty slots, which we typically cannot fully fill.

Q: In Python, after initializing n = [1, 2, 3], the addresses of these 3 elements are contiguous, but initializing m = [2, 1, 3] shows that each element's id is not consecutive but identical to those in n. If the addresses of these elements are not contiguous, is m still an array?

If we replace list elements with linked list nodes n = [n1, n2, n3, n4, n5], these 5 node objects are also typically dispersed throughout memory. However, given a list index, we can still access the node's memory address in O(1) time, thereby accessing the corresponding node. This is because the array stores references to the nodes, not the nodes themselves.

Unlike many languages, in Python, numbers are also wrapped as objects, and lists store references to these numbers, not the numbers themselves. Therefore, we find that the same number in two arrays has the same id, and these numbers' memory addresses need not be contiguous.

Q: The std::list in C++ STL has already implemented a doubly linked list, but it seems that some algorithm books don't directly use it. Is there any limitation?

On the one hand, we often prefer to use arrays to implement algorithms, only using linked lists when necessary, mainly for two reasons.

  • Space overhead: Since each element requires two additional pointers (one for the previous element and one for the next), std::list usually occupies more space than std::vector.
  • Cache unfriendly: As the data is not stored continuously, std::list has a lower cache utilization rate. Generally, std::vector performs better.

On the other hand, linked lists are primarily necessary for binary trees and graphs. Stacks and queues are often implemented using the programming language's stack and queue classes, rather than linked lists.

Q: Does initializing a list res = [0] * self.size() result in each element of res referencing the same address?

No. However, this issue arises with two-dimensional arrays, for example, initializing a two-dimensional list res = [[0] * self.size()] would reference the same list [0] multiple times.

Q: In deleting a node, is it necessary to break the reference to its successor node?

From the perspective of data structures and algorithms (problem-solving), it's okay not to break the link, as long as the program's logic is correct. From the perspective of standard libraries, breaking the link is safer and more logically clear. If the link is not broken, and the deleted node is not properly recycled, it could affect the recycling of the successor node's memory.

"},{"location":"chapter_computational_complexity/","title":"Chapter 2. \u00a0 Complexity analysis","text":"

Abstract

Complexity analysis is like a space-time navigator in the vast universe of algorithms.

It guides us in exploring deeper within the the dimensions of time and space, seeking more elegant solutions.

"},{"location":"chapter_computational_complexity/#chapter-contents","title":"Chapter contents","text":"
  • 2.1 \u00a0 Algorithm efficiency assessment
  • 2.2 \u00a0 Iteration and recursion
  • 2.3 \u00a0 Time complexity
  • 2.4 \u00a0 Space complexity
  • 2.5 \u00a0 Summary
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 Iteration and recursion","text":"

In algorithms, the repeated execution of a task is quite common and is closely related to the analysis of complexity. Therefore, before delving into the concepts of time complexity and space complexity, let's first explore how to implement repetitive tasks in programming. This involves understanding two fundamental programming control structures: iteration and recursion.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221-iteration","title":"2.2.1 \u00a0 Iteration","text":"

\"Iteration\" is a control structure for repeatedly performing a task. In iteration, a program repeats a block of code as long as a certain condition is met until this condition is no longer satisfied.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for-loops","title":"1. \u00a0 For loops","text":"

The for loop is one of the most common forms of iteration, and it's particularly suitable when the number of iterations is known in advance.

The following function uses a for loop to perform a summation of \\(1 + 2 + \\dots + n\\), with the sum being stored in the variable res. It's important to note that in Python, range(a, b) creates an interval that is inclusive of a but exclusive of b, meaning it iterates over the range from \\(a\\) up to \\(b\u22121\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
Code Visualization

Full Screen >

The flowchart below represents this sum function.

Figure 2-1 \u00a0 Flowchart of the sum function

The number of operations in this summation function is proportional to the size of the input data \\(n\\), or in other words, it has a \"linear relationship.\" This \"linear relationship\" is what time complexity describes. This topic will be discussed in more detail in the next section.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while-loops","title":"2. \u00a0 While loops","text":"

Similar to for loops, while loops are another approach for implementing iteration. In a while loop, the program checks a condition at the beginning of each iteration; if the condition is true, the execution continues, otherwise, the loop ends.

Below we use a while loop to implement the sum \\(1 + 2 + \\dots + n\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
iteration.cpp
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
iteration.zig
// while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
Code Visualization

Full Screen >

While loops provide more flexibility than for loops, especially since they allow for custom initialization and modification of the condition variable at each step.

For example, in the following code, the condition variable \\(i\\) is updated twice each round, which would be inconvenient to implement with a for loop.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
Code Visualization

Full Screen >

Overall, for loops are more concise, while while loops are more flexible. Both can implement iterative structures. Which one to use should be determined based on the specific requirements of the problem.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-nested-loops","title":"3. \u00a0 Nested loops","text":"

We can nest one loop structure within another. Below is an example using for loops:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
Code Visualization

Full Screen >

The flowchart below represents this nested loop.

Figure 2-2 \u00a0 Flowchart of the nested loop

In such cases, the number of operations of the function is proportional to \\(n^2\\), meaning the algorithm's runtime and the size of the input data \\(n\\) has a 'quadratic relationship.'

We can further increase the complexity by adding more nested loops, each level of nesting effectively \"increasing the dimension,\" which raises the time complexity to \"cubic,\" \"quartic,\" and so on.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222-recursion","title":"2.2.2 \u00a0 Recursion","text":"

\"Recursion\" is an algorithmic strategy where a function solves a problem by calling itself. It primarily involves two phases:

  1. Calling: This is where the program repeatedly calls itself, often with progressively smaller or simpler arguments, moving towards the \"termination condition.\"
  2. Returning: Upon triggering the \"termination condition,\" the program begins to return from the deepest recursive function, aggregating the results of each layer.

From an implementation perspective, recursive code mainly includes three elements.

  1. Termination Condition: Determines when to switch from \"calling\" to \"returning.\"
  2. Recursive Call: Corresponds to \"calling,\" where the function calls itself, usually with smaller or more simplified parameters.
  3. Return Result: Corresponds to \"returning,\" where the result of the current recursion level is returned to the previous layer.

Observe the following code, where simply calling the function recur(n) can compute the sum of \\(1 + 2 + \\dots + n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
recursion.cpp
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.java
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.cs
/* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.go
/* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.swift
/* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.js
/* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.ts
/* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.dart
/* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
recursion.rs
/* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
recursion.c
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.kt
/* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.rb
### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
recursion.zig
// \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
Code Visualization

Full Screen >

The Figure 2-3 shows the recursive process of this function.

Figure 2-3 \u00a0 Recursive process of the sum function

Although iteration and recursion can achieve the same results from a computational standpoint, they represent two entirely different paradigms of thinking and problem-solving.

  • Iteration: Solves problems \"from the bottom up.\" It starts with the most basic steps, and then repeatedly adds or accumulates these steps until the task is complete.
  • Recursion: Solves problems \"from the top down.\" It breaks down the original problem into smaller sub-problems, each of which has the same form as the original problem. These sub-problems are then further decomposed into even smaller sub-problems, stopping at the base case whose solution is known.

Let's take the earlier example of the summation function, defined as \\(f(n) = 1 + 2 + \\dots + n\\).

  • Iteration: In this approach, we simulate the summation process within a loop. Starting from \\(1\\) and traversing to \\(n\\), we perform the summation operation in each iteration to eventually compute \\(f(n)\\).
  • Recursion: Here, the problem is broken down into a sub-problem: \\(f(n) = n + f(n-1)\\). This decomposition continues recursively until reaching the base case, \\(f(1) = 1\\), at which point the recursion terminates.
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-call-stack","title":"1. \u00a0 Call stack","text":"

Every time a recursive function calls itself, the system allocates memory for the newly initiated function to store local variables, the return address, and other relevant information. This leads to two primary outcomes.

  • The function's context data is stored in a memory area called \"stack frame space\" and is only released after the function returns. Therefore, recursion generally consumes more memory space than iteration.
  • Recursive calls introduce additional overhead. Hence, recursion is usually less time-efficient than loops.

As shown in the Figure 2-4 , there are \\(n\\) unreturned recursive functions before triggering the termination condition, indicating a recursion depth of \\(n\\).

Figure 2-4 \u00a0 Recursion call depth

In practice, the depth of recursion allowed by programming languages is usually limited, and excessively deep recursion can lead to stack overflow errors.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-tail-recursion","title":"2. \u00a0 Tail recursion","text":"

Interestingly, if a function performs its recursive call as the very last step before returning, it can be optimized by the compiler or interpreter to be as space-efficient as iteration. This scenario is known as \"tail recursion.\"

  • Regular recursion: In standard recursion, when the function returns to the previous level, it continues to execute more code, requiring the system to save the context of the previous call.
  • Tail recursion: Here, the recursive call is the final operation before the function returns. This means that upon returning to the previous level, no further actions are needed, so the system does not need to save the context of the previous level.

For example, in calculating \\(1 + 2 + \\dots + n\\), we can make the result variable res a parameter of the function, thereby achieving tail recursion:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
Code Visualization

Full Screen >

The execution process of tail recursion is shown in the following figure. Comparing regular recursion and tail recursion, the point of the summation operation is different.

  • Regular recursion: The summation operation occurs during the \"returning\" phase, requiring another summation after each layer returns.
  • Tail recursion: The summation operation occurs during the \"calling\" phase, and the \"returning\" phase only involves returning through each layer.

Figure 2-5 \u00a0 Tail recursion process

Tip

Note that many compilers or interpreters do not support tail recursion optimization. For example, Python does not support tail recursion optimization by default, so even if the function is in the form of tail recursion, it may still encounter stack overflow issues.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-recursion-tree","title":"3. \u00a0 Recursion tree","text":"

When dealing with algorithms related to \"divide and conquer\", recursion often offers a more intuitive approach and more readable code than iteration. Take the \"Fibonacci sequence\" as an example.

Question

Given a Fibonacci sequence \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\), find the \\(n\\)th number in the sequence.

Let the \\(n\\)th number of the Fibonacci sequence be \\(f(n)\\), it's easy to deduce two conclusions:

  • The first two numbers of the sequence are \\(f(1) = 0\\) and \\(f(2) = 1\\).
  • Each number in the sequence is the sum of the two preceding ones, that is, \\(f(n) = f(n - 1) + f(n - 2)\\).

Using the recursive relation, and considering the first two numbers as termination conditions, we can write the recursive code. Calling fib(n) will yield the \\(n\\)th number of the Fibonacci sequence:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
recursion.cpp
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.js
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
recursion.c
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.rb
### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
recursion.zig
// \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
Code Visualization

Full Screen >

Observing the above code, we see that it recursively calls two functions within itself, meaning that one call generates two branching calls. As illustrated below, this continuous recursive calling eventually creates a \"recursion tree\" with a depth of \\(n\\).

Figure 2-6 \u00a0 Fibonacci sequence recursion tree

Fundamentally, recursion embodies the paradigm of \"breaking down a problem into smaller sub-problems.\" This divide-and-conquer strategy is crucial.

  • From an algorithmic perspective, many important strategies like searching, sorting, backtracking, divide-and-conquer, and dynamic programming directly or indirectly use this way of thinking.
  • From a data structure perspective, recursion is naturally suited for dealing with linked lists, trees, and graphs, as they are well suited for analysis using the divide-and-conquer approach.
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223-comparison","title":"2.2.3 \u00a0 Comparison","text":"

Summarizing the above content, the following table shows the differences between iteration and recursion in terms of implementation, performance, and applicability.

Table: Comparison of iteration and recursion characteristics

Iteration Recursion Approach Loop structure Function calls itself Time Efficiency Generally higher efficiency, no function call overhead Each function call generates overhead Memory Usage Typically uses a fixed size of memory space Accumulative function calls can use a substantial amount of stack frame space Suitable Problems Suitable for simple loop tasks, intuitive and readable code Suitable for problem decomposition, like trees, graphs, divide-and-conquer, backtracking, etc., concise and clear code structure

Tip

If you find the following content difficult to understand, consider revisiting it after reading the \"Stack\" chapter.

So, what is the intrinsic connection between iteration and recursion? Taking the above recursive function as an example, the summation operation occurs during the recursion's \"return\" phase. This means that the initially called function is the last to complete its summation operation, mirroring the \"last in, first out\" principle of a stack.

Recursive terms like \"call stack\" and \"stack frame space\" hint at the close relationship between recursion and stacks.

  1. Calling: When a function is called, the system allocates a new stack frame on the \"call stack\" for that function, storing local variables, parameters, return addresses, and other data.
  2. Returning: When a function completes execution and returns, the corresponding stack frame is removed from the \"call stack,\" restoring the execution environment of the previous function.

Therefore, we can use an explicit stack to simulate the behavior of the call stack, thus transforming recursion into an iterative form:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
Code Visualization

Full Screen >

Observing the above code, when recursion is transformed into iteration, the code becomes more complex. Although iteration and recursion can often be transformed into each other, it's not always advisable to do so for two reasons:

  • The transformed code may become more challenging to understand and less readable.
  • For some complex problems, simulating the behavior of the system's call stack can be quite challenging.

In conclusion, whether to choose iteration or recursion depends on the specific nature of the problem. In programming practice, it's crucial to weigh the pros and cons of both and choose the most suitable approach for the situation at hand.

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 Algorithm efficiency assessment","text":"

In algorithm design, we pursue the following two objectives in sequence.

  1. Finding a Solution to the Problem: The algorithm should reliably find the correct solution within the stipulated range of inputs.
  2. Seeking the Optimal Solution: For the same problem, multiple solutions might exist, and we aim to find the most efficient algorithm possible.

In other words, under the premise of being able to solve the problem, algorithm efficiency has become the main criterion for evaluating the merits of an algorithm, which includes the following two dimensions.

  • Time efficiency: The speed at which an algorithm runs.
  • Space efficiency: The size of the memory space occupied by an algorithm.

In short, our goal is to design data structures and algorithms that are both fast and memory-efficient. Effectively assessing algorithm efficiency is crucial because only then can we compare various algorithms and guide the process of algorithm design and optimization.

There are mainly two methods of efficiency assessment: actual testing and theoretical estimation.

"},{"location":"chapter_computational_complexity/performance_evaluation/#211-actual-testing","title":"2.1.1 \u00a0 Actual testing","text":"

Suppose we have algorithms A and B, both capable of solving the same problem, and we need to compare their efficiencies. The most direct method is to use a computer to run these two algorithms and monitor and record their runtime and memory usage. This assessment method reflects the actual situation but has significant limitations.

On one hand, it's difficult to eliminate interference from the testing environment. Hardware configurations can affect algorithm performance. For example, algorithm A might run faster than B on one computer, but the opposite result may occur on another computer with different configurations. This means we would need to test on a variety of machines to calculate average efficiency, which is impractical.

On the other hand, conducting a full test is very resource-intensive. As the volume of input data changes, the efficiency of the algorithms may vary. For example, with smaller data volumes, algorithm A might run faster than B, but the opposite might be true with larger data volumes. Therefore, to draw convincing conclusions, we need to test a wide range of input data sizes, which requires significant computational resources.

"},{"location":"chapter_computational_complexity/performance_evaluation/#212-theoretical-estimation","title":"2.1.2 \u00a0 Theoretical estimation","text":"

Due to the significant limitations of actual testing, we can consider evaluating algorithm efficiency solely through calculations. This estimation method is known as \"asymptotic complexity analysis,\" or simply \"complexity analysis.\"

Complexity analysis reflects the relationship between the time and space resources required for algorithm execution and the size of the input data. It describes the trend of growth in the time and space required by the algorithm as the size of the input data increases. This definition might sound complex, but we can break it down into three key points to understand it better.

  • \"Time and space resources\" correspond to \"time complexity\" and \"space complexity,\" respectively.
  • \"As the size of input data increases\" means that complexity reflects the relationship between algorithm efficiency and the volume of input data.
  • \"The trend of growth in time and space\" indicates that complexity analysis focuses not on the specific values of runtime or space occupied but on the \"rate\" at which time or space grows.

Complexity analysis overcomes the disadvantages of actual testing methods, reflected in the following aspects:

  • It is independent of the testing environment and applicable to all operating platforms.
  • It can reflect algorithm efficiency under different data volumes, especially in the performance of algorithms with large data volumes.

Tip

If you're still confused about the concept of complexity, don't worry. We will introduce it in detail in subsequent chapters.

Complexity analysis provides us with a \"ruler\" to measure the time and space resources needed to execute an algorithm and compare the efficiency between different algorithms.

Complexity is a mathematical concept and may be abstract and challenging for beginners. From this perspective, complexity analysis might not be the best content to introduce first. However, when discussing the characteristics of a particular data structure or algorithm, it's hard to avoid analyzing its speed and space usage.

In summary, it's recommended that you establish a preliminary understanding of complexity analysis before diving deep into data structures and algorithms, so that you can carry out simple complexity analyses of algorithms.

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 Space complexity","text":"

\"Space complexity\" is used to measure the growth trend of the memory space occupied by an algorithm as the amount of data increases. This concept is very similar to time complexity, except that \"running time\" is replaced with \"occupied memory space\".

"},{"location":"chapter_computational_complexity/space_complexity/#241-space-related-to-algorithms","title":"2.4.1 \u00a0 Space related to algorithms","text":"

The memory space used by an algorithm during its execution mainly includes the following types.

  • Input space: Used to store the input data of the algorithm.
  • Temporary space: Used to store variables, objects, function contexts, and other data during the algorithm's execution.
  • Output space: Used to store the output data of the algorithm.

Generally, the scope of space complexity statistics includes both \"Temporary Space\" and \"Output Space\".

Temporary space can be further divided into three parts.

  • Temporary data: Used to save various constants, variables, objects, etc., during the algorithm's execution.
  • Stack frame space: Used to save the context data of the called function. The system creates a stack frame at the top of the stack each time a function is called, and the stack frame space is released after the function returns.
  • Instruction space: Used to store compiled program instructions, which are usually negligible in actual statistics.

When analyzing the space complexity of a program, we typically count the Temporary Data, Stack Frame Space, and Output Data, as shown in the Figure 2-15 .

Figure 2-15 \u00a0 Space types used in algorithms

The relevant code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class Node:\n    \"\"\"Classes\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x               # node value\n        self.next: Node | None = None   # reference to the next node\n\ndef function() -> int:\n    \"\"\"Functions\"\"\"\n    # Perform certain operations...\n    return 0\n\ndef algorithm(n) -> int:    # input data\n    A = 0                   # temporary data (constant, usually in uppercase)\n    b = 0                   # temporary data (variable)\n    node = Node(0)          # temporary data (object)\n    c = function()          # Stack frame space (call function)\n    return A + b + c        # output data\n
/* Structures */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    const int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node* node = new Node(0);   // temporary data (object)\n    int c = func();             // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    final int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node node = new Node(0);    // temporary data (object)\n    int c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint Function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint Algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    Node node = new(0); // temporary data (object)\n    int c = Function(); // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
/* Structures */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* Create node structure */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* Functions */\nfunc function() int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n int) int { // input data\n    const a = 0             // temporary data (constant)\n    b := 0                  // temporary storage of data (variable)\n    newNode(0)              // temporary data (object)\n    c := function()         // stack frame space (call function)\n    return a + b + c        // output data\n}\n
/* Classes */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* Functions */\nfunc function() -> Int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // input data\n    let a = 0                   // temporary data (constant)\n    var b = 0                   // temporary data (variable)\n    let node = Node(x: 0)       // temporary data (object)\n    let c = function()          // stack frame space (call function)\n    return a + b + c            // output data\n}\n
/* Classes */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc() {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n) {         // input data\n    const a = 0;                // temporary data (constant)\n    let b = 0;                  // temporary data (variable)\n    const node = new Node(0);   // temporary data (object)\n    const c = constFunc();      // Stack frame space (calling function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n: number): number { // input data\n    const a = 0;                        // temporary data (constant)\n    let b = 0;                          // temporary data (variable)\n    const node = new Node(0);           // temporary data (object)\n    const c = constFunc();              // Stack frame space (calling function)\n    return a + b + c;                   // output data\n}\n
/* Classes */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* Functions */\nint function() {\n  // Perform certain operations...\n  return 0;\n}\n\nint algorithm(int n) {  // input data\n  const int a = 0;      // temporary data (constant)\n  int b = 0;            // temporary data (variable)\n  Node node = Node(0);  // temporary data (object)\n  int c = function();   // stack frame space (call function)\n  return a + b + c;     // output data\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Structures */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* Constructor */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* Functions */\nfn function() -> i32 {     \n    // Perform certain operations...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {   // input data\n    const a: i32 = 0;           // temporary data (constant)\n    let mut b = 0;              // temporary data (variable)\n    let node = Node::new(0);    // temporary data (object)\n    let c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    int c = func();     // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242-calculation-method","title":"2.4.2 \u00a0 Calculation method","text":"

The method for calculating space complexity is roughly similar to that of time complexity, with the only change being the shift of the statistical object from \"number of operations\" to \"size of used space\".

However, unlike time complexity, we usually only focus on the worst-case space complexity. This is because memory space is a hard requirement, and we must ensure that there is enough memory space reserved under all input data.

Consider the following code, the term \"worst-case\" in worst-case space complexity has two meanings.

  1. Based on the worst input data: When \\(n < 10\\), the space complexity is \\(O(1)\\); but when \\(n > 10\\), the initialized array nums occupies \\(O(n)\\) space, thus the worst-case space complexity is \\(O(n)\\).
  2. Based on the peak memory used during the algorithm's execution: For example, before executing the last line, the program occupies \\(O(1)\\) space; when initializing the array nums, the program occupies \\(O(n)\\) space, hence the worst-case space complexity is \\(O(n)\\).
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                           // O(1)\n    let b = [0; 10000];                  // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];  // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
\n
\n

In recursive functions, stack frame space must be taken into count. Consider the following code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def function() -> int:\n    # Perform certain operations\n    return 0\n\ndef loop(n: int):\n    \"\"\"Loop O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"Recursion O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* Recursion O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // Perform certain operations\n  return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
\n
\n

The time complexity of both loop() and recur() functions is \\(O(n)\\), but their space complexities differ.

  • The loop() function calls function() \\(n\\) times in a loop, where each iteration's function() returns and releases its stack frame space, so the space complexity remains \\(O(1)\\).
  • The recursive function recur() will have \\(n\\) instances of unreturned recur() existing simultaneously during its execution, thus occupying \\(O(n)\\) stack frame space.
"},{"location":"chapter_computational_complexity/space_complexity/#243-common-types","title":"2.4.3 \u00a0 Common types","text":"

Let the size of the input data be \\(n\\), the following chart displays common types of space complexities (arranged from low to high).

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Quadratic Order} < \\text{Exponential Order} \\end{aligned} \\]

Figure 2-16 \u00a0 Common types of space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

Constant order is common in constants, variables, objects that are independent of the size of input data \\(n\\).

Note that memory occupied by initializing variables or calling functions in a loop, which is released upon entering the next cycle, does not accumulate over space, thus the space complexity remains \\(O(1)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/space_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

Linear order is common in arrays, linked lists, stacks, queues, etc., where the number of elements is proportional to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
Code Visualization

Full Screen >

As shown below, this function's recursive depth is \\(n\\), meaning there are \\(n\\) instances of unreturned linear_recur() function, using \\(O(n)\\) size of stack frame space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
Code Visualization

Full Screen >

Figure 2-17 \u00a0 Recursive function generating linear order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#3-quadratic-order-on2","title":"3. \u00a0 Quadratic order \\(O(n^2)\\)","text":"

Quadratic order is common in matrices and graphs, where the number of elements is quadratic to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
Code Visualization

Full Screen >

As shown below, the recursive depth of this function is \\(n\\), and in each recursive call, an array is initialized with lengths \\(n\\), \\(n-1\\), \\(\\dots\\), \\(2\\), \\(1\\), averaging \\(n/2\\), thus overall occupying \\(O(n^2)\\) space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
Code Visualization

Full Screen >

Figure 2-18 \u00a0 Recursive function generating quadratic order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#4-exponential-order-o2n","title":"4. \u00a0 Exponential order \\(O(2^n)\\)","text":"

Exponential order is common in binary trees. Observe the below image, a \"full binary tree\" with \\(n\\) levels has \\(2^n - 1\\) nodes, occupying \\(O(2^n)\\) space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
Code Visualization

Full Screen >

Figure 2-19 \u00a0 Full binary tree generating exponential order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

Logarithmic order is common in divide-and-conquer algorithms. For example, in merge sort, an array of length \\(n\\) is recursively divided in half each round, forming a recursion tree of height \\(\\log n\\), using \\(O(\\log n)\\) stack frame space.

Another example is converting a number to a string. Given a positive integer \\(n\\), its number of digits is \\(\\log_{10} n + 1\\), corresponding to the length of the string, thus the space complexity is \\(O(\\log_{10} n + 1) = O(\\log n)\\).

"},{"location":"chapter_computational_complexity/space_complexity/#244-balancing-time-and-space","title":"2.4.4 \u00a0 Balancing time and space","text":"

Ideally, we aim for both time complexity and space complexity to be optimal. However, in practice, optimizing both simultaneously is often difficult.

Lowering time complexity usually comes at the cost of increased space complexity, and vice versa. The approach of sacrificing memory space to improve algorithm speed is known as \"space-time tradeoff\"; the reverse is known as \"time-space tradeoff\".

The choice depends on which aspect we value more. In most cases, time is more precious than space, so \"space-time tradeoff\" is often the more common strategy. Of course, controlling space complexity is also very important when dealing with large volumes of data.

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 Summary","text":""},{"location":"chapter_computational_complexity/summary/#1-key-review","title":"1. \u00a0 Key review","text":"

Algorithm Efficiency Assessment

  • Time efficiency and space efficiency are the two main criteria for assessing the merits of an algorithm.
  • We can assess algorithm efficiency through actual testing, but it's challenging to eliminate the influence of the test environment, and it consumes substantial computational resources.
  • Complexity analysis can overcome the disadvantages of actual testing. Its results are applicable across all operating platforms and can reveal the efficiency of algorithms at different data scales.

Time Complexity

  • Time complexity measures the trend of an algorithm's running time with the increase in data volume, effectively assessing algorithm efficiency. However, it can fail in certain cases, such as with small input data volumes or when time complexities are the same, making it challenging to precisely compare the efficiency of algorithms.
  • Worst-case time complexity is denoted using big O notation, representing the asymptotic upper bound, reflecting the growth level of the number of operations \\(T(n)\\) as \\(n\\) approaches infinity.
  • Calculating time complexity involves two steps: first counting the number of operations, then determining the asymptotic upper bound.
  • Common time complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n \\log n)\\), \\(O(n^2)\\), \\(O(2^n)\\), and \\(O(n!)\\), among others.
  • The time complexity of some algorithms is not fixed and depends on the distribution of input data. Time complexities are divided into worst, best, and average cases. The best case is rarely used because input data generally needs to meet strict conditions to achieve the best case.
  • Average time complexity reflects the efficiency of an algorithm under random data inputs, closely resembling the algorithm's performance in actual applications. Calculating average time complexity requires accounting for the distribution of input data and the subsequent mathematical expectation.

Space Complexity

  • Space complexity, similar to time complexity, measures the trend of memory space occupied by an algorithm with the increase in data volume.
  • The relevant memory space used during the algorithm's execution can be divided into input space, temporary space, and output space. Generally, input space is not included in space complexity calculations. Temporary space can be divided into temporary data, stack frame space, and instruction space, where stack frame space usually affects space complexity only in recursive functions.
  • We usually focus only on the worst-case space complexity, which means calculating the space complexity of the algorithm under the worst input data and at the worst moment of operation.
  • Common space complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n^2)\\), and \\(O(2^n)\\), among others.
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the space complexity of tail recursion \\(O(1)\\)?

Theoretically, the space complexity of a tail-recursive function can be optimized to \\(O(1)\\). However, most programming languages (such as Java, Python, C++, Go, C#) do not support automatic optimization of tail recursion, so it's generally considered to have a space complexity of \\(O(n)\\).

Q: What is the difference between the terms \"function\" and \"method\"?

A \"function\" can be executed independently, with all parameters passed explicitly. A \"method\" is associated with an object and is implicitly passed to the object calling it, able to operate on the data contained within an instance of a class.

Here are some examples from common programming languages:

  • C is a procedural programming language without object-oriented concepts, so it only has functions. However, we can simulate object-oriented programming by creating structures (struct), and functions associated with these structures are equivalent to methods in other programming languages.
  • Java and C# are object-oriented programming languages where code blocks (methods) are typically part of a class. Static methods behave like functions because they are bound to the class and cannot access specific instance variables.
  • C++ and Python support both procedural programming (functions) and object-oriented programming (methods).

Q: Does the \"Common Types of Space Complexity\" figure reflect the absolute size of occupied space?

No, the figure shows space complexities, which reflect growth trends, not the absolute size of the occupied space.

If you take \\(n = 8\\), you might find that the values of each curve don't correspond to their functions. This is because each curve includes a constant term, intended to compress the value range into a visually comfortable range.

In practice, since we usually don't know the \"constant term\" complexity of each method, it's generally not possible to choose the best solution for \\(n = 8\\) based solely on complexity. However, for \\(n = 8^5\\), it's much easier to choose, as the growth trend becomes dominant.

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 Time complexity","text":"

Time complexity is a concept used to measure how the run time of an algorithm increases with the size of the input data. Understanding time complexity is crucial for accurately assessing the efficiency of an algorithm.

  1. Determining the Running Platform: This includes hardware configuration, programming language, system environment, etc., all of which can affect the efficiency of code execution.
  2. Evaluating the Run Time for Various Computational Operations: For instance, an addition operation + might take 1 ns, a multiplication operation * might take 10 ns, a print operation print() might take 5 ns, etc.
  3. Counting All the Computational Operations in the Code: Summing the execution times of all these operations gives the total run time.

For example, consider the following code with an input size of \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Under an operating platform\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # Cycle n times\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        System.out.println(0);     // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // Loop n times\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // Loop n times\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // Loop n times\n  for (int i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n    print(0); // 5 ns\n  }\n}\n
// Under a particular operating platform\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // Loop n times\n    for _ in 0..n {     // 1 ns for each round i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // 1 ns , every round i++ is executed\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
\n
// Under a particular operating platform\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // Loop n times\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

Using the above method, the run time of the algorithm can be calculated as \\((6n + 12)\\) ns:

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

However, in practice, counting the run time of an algorithm is neither practical nor reasonable. First, we don't want to tie the estimated time to the running platform, as algorithms need to run on various platforms. Second, it's challenging to know the run time for each type of operation, making the estimation process difficult.

"},{"location":"chapter_computational_complexity/time_complexity/#231-assessing-time-growth-trend","title":"2.3.1 \u00a0 Assessing time growth trend","text":"

Time complexity analysis does not count the algorithm's run time, but rather the growth trend of the run time as the data volume increases.

Let's understand this concept of \"time growth trend\" with an example. Assume the input data size is \\(n\\), and consider three algorithms A, B, and C:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Time complexity of algorithm A: constant order\ndef algorithm_A(n: int):\n    print(0)\n# Time complexity of algorithm B: linear order\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# Time complexity of algorithm C: constant order\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// Time complexity of algorithm B: linear order\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// Time complexity of algorithm B: linear order\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// Time complexity of algorithm C: constant order\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// Time complexity of algorithm B: linear order\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// Time complexity of algorithm C: constant order\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithmA(int n) {\n  print(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// Time complexity of algorithm A: constant order\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
\n
// Time complexity of algorithm A: constant order\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

The following figure shows the time complexities of these three algorithms.

  • Algorithm A has just one print operation, and its run time does not grow with \\(n\\). Its time complexity is considered \"constant order.\"
  • Algorithm B involves a print operation looping \\(n\\) times, and its run time grows linearly with \\(n\\). Its time complexity is \"linear order.\"
  • Algorithm C has a print operation looping 1,000,000 times. Although it takes a long time, it is independent of the input data size \\(n\\). Therefore, the time complexity of C is the same as A, which is \"constant order.\"

Figure 2-7 \u00a0 Time growth trend of algorithms a, b, and c

Compared to directly counting the run time of an algorithm, what are the characteristics of time complexity analysis?

  • Time complexity effectively assesses algorithm efficiency. For instance, algorithm B has linearly growing run time, which is slower than algorithm A when \\(n > 1\\) and slower than C when \\(n > 1,000,000\\). In fact, as long as the input data size \\(n\\) is sufficiently large, a \"constant order\" complexity algorithm will always be better than a \"linear order\" one, demonstrating the essence of time growth trend.
  • Time complexity analysis is more straightforward. Obviously, the running platform and the types of computational operations are irrelevant to the trend of run time growth. Therefore, in time complexity analysis, we can simply treat the execution time of all computational operations as the same \"unit time,\" simplifying the \"computational operation run time count\" to a \"computational operation count.\" This significantly reduces the complexity of estimation.
  • Time complexity has its limitations. For example, although algorithms A and C have the same time complexity, their actual run times can be quite different. Similarly, even though algorithm B has a higher time complexity than C, it is clearly superior when the input data size \\(n\\) is small. In these cases, it's difficult to judge the efficiency of algorithms based solely on time complexity. Nonetheless, despite these issues, complexity analysis remains the most effective and commonly used method for evaluating algorithm efficiency.
"},{"location":"chapter_computational_complexity/time_complexity/#232-asymptotic-upper-bound","title":"2.3.2 \u00a0 Asymptotic upper bound","text":"

Consider a function with an input size of \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # Cycle n times\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // Loop n times\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // Loop n times\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // Loop n times\n  for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // Loop n times\n    for _ in 0..n { // +1 (execute i ++ every round)\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        printf(\"%d\", 0);            // +1\n    }\n} \n
\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for (0..n) |_| { // +1 (execute i ++ every round)\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

Given a function that represents the number of operations of an algorithm as a function of the input size \\(n\\), denoted as \\(T(n)\\), consider the following example:

\\[ T(n) = 3 + 2n \\]

Since \\(T(n)\\) is a linear function, its growth trend is linear, and therefore, its time complexity is of linear order, denoted as \\(O(n)\\). This mathematical notation, known as \"big-O notation,\" represents the \"asymptotic upper bound\" of the function \\(T(n)\\).

In essence, time complexity analysis is about finding the asymptotic upper bound of the \"number of operations \\(T(n)\\)\". It has a precise mathematical definition.

Asymptotic Upper Bound

If there exist positive real numbers \\(c\\) and \\(n_0\\) such that for all \\(n > n_0\\), \\(T(n) \\leq c \\cdot f(n)\\), then \\(f(n)\\) is considered an asymptotic upper bound of \\(T(n)\\), denoted as \\(T(n) = O(f(n))\\).

As illustrated below, calculating the asymptotic upper bound involves finding a function \\(f(n)\\) such that, as \\(n\\) approaches infinity, \\(T(n)\\) and \\(f(n)\\) have the same growth order, differing only by a constant factor \\(c\\).

Figure 2-8 \u00a0 Asymptotic upper bound of a function

"},{"location":"chapter_computational_complexity/time_complexity/#233-calculation-method","title":"2.3.3 \u00a0 Calculation method","text":"

While the concept of asymptotic upper bound might seem mathematically dense, you don't need to fully grasp it right away. Let's first understand the method of calculation, which can be practiced and comprehended over time.

Once \\(f(n)\\) is determined, we obtain the time complexity \\(O(f(n))\\). But how do we determine the asymptotic upper bound \\(f(n)\\)? This process generally involves two steps: counting the number of operations and determining the asymptotic upper bound.

"},{"location":"chapter_computational_complexity/time_complexity/#1-step-1-counting-the-number-of-operations","title":"1. \u00a0 Step 1: counting the number of operations","text":"

This step involves going through the code line by line. However, due to the presence of the constant \\(c\\) in \\(c \\cdot f(n)\\), all coefficients and constant terms in \\(T(n)\\) can be ignored. This principle allows for simplification techniques in counting operations.

  1. Ignore constant terms in \\(T(n)\\), as they do not affect the time complexity being independent of \\(n\\).
  2. Omit all coefficients. For example, looping \\(2n\\), \\(5n + 1\\) times, etc., can be simplified to \\(n\\) times since the coefficient before \\(n\\) does not impact the time complexity.
  3. Use multiplication for nested loops. The total number of operations equals the product of the number of operations in each loop, applying the simplification techniques from points 1 and 2 for each loop level.

Given a function, we can use these techniques to count operations:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 1      # +0 (trick 1)\n    a = a + n  # +0 (trick 1)\n    # +n (technique 2)\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n (technique 3)\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0 (trick 1)\n    a = a + n  // +0 (trick 1)\n    // +n (technique 2)\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n (technique 3)\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0 (trick 1)\n    a = a + n // +0 (trick 1)\n    // +n (technique 2)\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n (technique 3)\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0 (trick 1)\n  a = a + n; // +0 (trick 1)\n  // +n (technique 2)\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n (technique 3)\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0 (trick 1)\n    a = a + n;        // +0 (trick 1)\n\n    // +n (technique 2)\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n (technique 3)\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0 (trick 1)\n    a = a + @as(i32, @intCast(n));        // +0 (trick 1)\n\n    // +n (technique 2)\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n (technique 3)\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

The formula below shows the counting results before and after simplification, both leading to a time complexity of \\(O(n^2)\\):

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{Complete Count (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{Simplified Count (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2-step-2-determining-the-asymptotic-upper-bound","title":"2. \u00a0 Step 2: determining the asymptotic upper bound","text":"

The time complexity is determined by the highest order term in \\(T(n)\\). This is because, as \\(n\\) approaches infinity, the highest order term dominates, rendering the influence of other terms negligible.

The following table illustrates examples of different operation counts and their corresponding time complexities. Some exaggerated values are used to emphasize that coefficients cannot alter the order of growth. When \\(n\\) becomes very large, these constants become insignificant.

Table: Time complexity for different operation counts

Operation Count \\(T(n)\\) Time Complexity \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234-common-types-of-time-complexity","title":"2.3.4 \u00a0 Common types of time complexity","text":"

Let's consider the input data size as \\(n\\). The common types of time complexities are illustrated below, arranged from lowest to highest:

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Linear-Logarithmic Order} < \\text{Quadratic Order} < \\text{Exponential Order} < \\text{Factorial Order} \\end{aligned} \\]

Figure 2-9 \u00a0 Common types of time complexity

"},{"location":"chapter_computational_complexity/time_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

Constant order means the number of operations is independent of the input data size \\(n\\). In the following function, although the number of operations size might be large, the time complexity remains \\(O(1)\\) as it's unrelated to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/time_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

Linear order indicates the number of operations grows linearly with the input data size \\(n\\). Linear order commonly appears in single-loop structures:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Operations like array traversal and linked list traversal have a time complexity of \\(O(n)\\), where \\(n\\) is the length of the array or list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

It's important to note that the input data size \\(n\\) should be determined based on the type of input data. For example, in the first example, \\(n\\) represents the input data size, while in the second example, the length of the array \\(n\\) is the data size.

"},{"location":"chapter_computational_complexity/time_complexity/#3-quadratic-order-on2","title":"3. \u00a0 Quadratic order \\(O(n^2)\\)","text":"

Quadratic order means the number of operations grows quadratically with the input data size \\(n\\). Quadratic order typically appears in nested loops, where both the outer and inner loops have a time complexity of \\(O(n)\\), resulting in an overall complexity of \\(O(n^2)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

The following image compares constant order, linear order, and quadratic order time complexities.

Figure 2-10 \u00a0 Constant, linear, and quadratic order time complexities

For instance, in bubble sort, the outer loop runs \\(n - 1\\) times, and the inner loop runs \\(n-1\\), \\(n-2\\), ..., \\(2\\), \\(1\\) times, averaging \\(n / 2\\) times, resulting in a time complexity of \\(O((n - 1) n / 2) = O(n^2)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/time_complexity/#4-exponential-order-o2n","title":"4. \u00a0 Exponential order \\(O(2^n)\\)","text":"

Biological \"cell division\" is a classic example of exponential order growth: starting with one cell, it becomes two after one division, four after two divisions, and so on, resulting in \\(2^n\\) cells after \\(n\\) divisions.

The following image and code simulate the cell division process, with a time complexity of \\(O(2^n)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-11 \u00a0 Exponential order time complexity

In practice, exponential order often appears in recursive functions. For example, in the code below, it recursively splits into two halves, stopping after \\(n\\) divisions:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
Code Visualization

Full Screen >

Exponential order growth is extremely rapid and is commonly seen in exhaustive search methods (brute force, backtracking, etc.). For large-scale problems, exponential order is unacceptable, often requiring dynamic programming or greedy algorithms as solutions.

"},{"location":"chapter_computational_complexity/time_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

In contrast to exponential order, logarithmic order reflects situations where \"the size is halved each round.\" Given an input data size \\(n\\), since the size is halved each round, the number of iterations is \\(\\log_2 n\\), the inverse function of \\(2^n\\).

The following image and code simulate the \"halving each round\" process, with a time complexity of \\(O(\\log_2 n)\\), commonly abbreviated as \\(O(\\log n)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-12 \u00a0 Logarithmic order time complexity

Like exponential order, logarithmic order also frequently appears in recursive functions. The code below forms a recursive tree of height \\(\\log_2 n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
Code Visualization

Full Screen >

Logarithmic order is typical in algorithms based on the divide-and-conquer strategy, embodying the \"split into many\" and \"simplify complex problems\" approach. It's slow-growing and is the most ideal time complexity after constant order.

What is the base of \\(O(\\log n)\\)?

Technically, \"splitting into \\(m\\)\" corresponds to a time complexity of \\(O(\\log_m n)\\). Using the logarithm base change formula, we can equate different logarithmic complexities:

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

This means the base \\(m\\) can be changed without affecting the complexity. Therefore, we often omit the base \\(m\\) and simply denote logarithmic order as \\(O(\\log n)\\).

"},{"location":"chapter_computational_complexity/time_complexity/#6-linear-logarithmic-order-on-log-n","title":"6. \u00a0 Linear-logarithmic order \\(O(n \\log n)\\)","text":"

Linear-logarithmic order often appears in nested loops, with the complexities of the two loops being \\(O(\\log n)\\) and \\(O(n)\\) respectively. The related code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

The image below demonstrates how linear-logarithmic order is generated. Each level of a binary tree has \\(n\\) operations, and the tree has \\(\\log_2 n + 1\\) levels, resulting in a time complexity of \\(O(n \\log n)\\).

Figure 2-13 \u00a0 Linear-logarithmic order time complexity

Mainstream sorting algorithms typically have a time complexity of \\(O(n \\log n)\\), such as quicksort, mergesort, and heapsort.

"},{"location":"chapter_computational_complexity/time_complexity/#7-factorial-order-on","title":"7. \u00a0 Factorial order \\(O(n!)\\)","text":"

Factorial order corresponds to the mathematical problem of \"full permutation.\" Given \\(n\\) distinct elements, the total number of possible permutations is:

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

Factorials are typically implemented using recursion. As shown in the image and code below, the first level splits into \\(n\\) branches, the second level into \\(n - 1\\) branches, and so on, stopping after the \\(n\\)th level:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-14 \u00a0 Factorial order time complexity

Note that factorial order grows even faster than exponential order; it's unacceptable for larger \\(n\\) values.

"},{"location":"chapter_computational_complexity/time_complexity/#235-worst-best-and-average-time-complexities","title":"2.3.5 \u00a0 Worst, best, and average time complexities","text":"

The time efficiency of an algorithm is often not fixed but depends on the distribution of the input data. Assume we have an array nums of length \\(n\\), consisting of numbers from \\(1\\) to \\(n\\), each appearing only once, but in a randomly shuffled order. The task is to return the index of the element \\(1\\). We can draw the following conclusions:

  • When nums = [?, ?, ..., 1], that is, when the last element is \\(1\\), it requires a complete traversal of the array, achieving the worst-case time complexity of \\(O(n)\\).
  • When nums = [1, ?, ?, ...], that is, when the first element is \\(1\\), no matter the length of the array, no further traversal is needed, achieving the best-case time complexity of \\(\\Omega(1)\\).

The \"worst-case time complexity\" corresponds to the asymptotic upper bound, denoted by the big \\(O\\) notation. Correspondingly, the \"best-case time complexity\" corresponds to the asymptotic lower bound, denoted by \\(\\Omega\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

It's important to note that the best-case time complexity is rarely used in practice, as it is usually only achievable under very low probabilities and might be misleading. The worst-case time complexity is more practical as it provides a safety value for efficiency, allowing us to confidently use the algorithm.

From the above example, it's clear that both the worst-case and best-case time complexities only occur under \"special data distributions,\" which may have a small probability of occurrence and may not accurately reflect the algorithm's run efficiency. In contrast, the average time complexity can reflect the algorithm's efficiency under random input data, denoted by the \\(\\Theta\\) notation.

For some algorithms, we can simply estimate the average case under a random data distribution. For example, in the aforementioned example, since the input array is shuffled, the probability of element \\(1\\) appearing at any index is equal. Therefore, the average number of loops for the algorithm is half the length of the array \\(n / 2\\), giving an average time complexity of \\(\\Theta(n / 2) = \\Theta(n)\\).

However, calculating the average time complexity for more complex algorithms can be quite difficult, as it's challenging to analyze the overall mathematical expectation under the data distribution. In such cases, we usually use the worst-case time complexity as the standard for judging the efficiency of the algorithm.

Why is the \\(\\Theta\\) symbol rarely seen?

Possibly because the \\(O\\) notation is more commonly spoken, it is often used to represent the average time complexity. However, strictly speaking, this practice is not accurate. In this book and other materials, if you encounter statements like \"average time complexity \\(O(n)\\)\", please understand it directly as \\(\\Theta(n)\\).

"},{"location":"chapter_data_structure/","title":"Chapter 3. \u00a0 Data structures","text":"

Abstract

Data structures serve as a robust and diverse framework.

They offer a blueprint for the orderly organization of data, upon which algorithms come to life.

"},{"location":"chapter_data_structure/#chapter-contents","title":"Chapter contents","text":"
  • 3.1 \u00a0 Classification of data structures
  • 3.2 \u00a0 Basic data types
  • 3.3 \u00a0 Number encoding *
  • 3.4 \u00a0 Character encoding *
  • 3.5 \u00a0 Summary
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 Basic data types","text":"

When discussing data in computers, various forms like text, images, videos, voice and 3D models comes to mind. Despite their different organizational forms, they are all composed of various basic data types.

Basic data types are those that the CPU can directly operate on and are directly used in algorithms, mainly including the following.

  • Integer types: byte, short, int, long.
  • Floating-point types: float, double, used to represent decimals.
  • Character type: char, used to represent letters, punctuation, and even emojis in various languages.
  • Boolean type: bool, used to represent \"yes\" or \"no\" decisions.

Basic data types are stored in computers in binary form. One binary digit is 1 bit. In most modern operating systems, 1 byte consists of 8 bits.

The range of values for basic data types depends on the size of the space they occupy. Below, we take Java as an example.

  • The integer type byte occupies 1 byte = 8 bits and can represent \\(2^8\\) numbers.
  • The integer type int occupies 4 bytes = 32 bits and can represent \\(2^{32}\\) numbers.

The following table lists the space occupied, value range, and default values of various basic data types in Java. While memorizing this table isn't necessary, having a general understanding of it and referencing it when required is recommended.

Table 3-1 \u00a0 Space occupied and value range of basic data types

Type Symbol Space Occupied Minimum Value Maximum Value Default Value Integer byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) 0 short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) 0 int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) 0 long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) 0 Float float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) 0.0 Char char 2 bytes 0 \\(2^{16} - 1\\) 0 Boolean bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

Please note that the above table is specific to Java's basic data types. Every programming language has its own data type definitions, which might differ in space occupied, value ranges, and default values.

  • In Python, the integer type int can be of any size, limited only by available memory; the floating-point float is double precision 64-bit; there is no char type, as a single character is actually a string str of length 1.
  • C and C++ do not specify the size of basic data types, it varies with implementation and platform. The above table follows the LP64 data model, used for Unix 64-bit operating systems including Linux and macOS.
  • The size of char in C and C++ is 1 byte, while in most programming languages, it depends on the specific character encoding method, as detailed in the \"Character Encoding\" chapter.
  • Even though representing a boolean only requires 1 bit (0 or 1), it is usually stored in memory as 1 byte. This is because modern computer CPUs typically use 1 byte as the smallest addressable memory unit.

So, what is the connection between basic data types and data structures? We know that data structures are ways to organize and store data in computers. The focus here is on \"structure\" rather than \"data\".

If we want to represent \"a row of numbers\", we naturally think of using an array. This is because the linear structure of an array can represent the adjacency and the ordering of the numbers, but whether the stored content is an integer int, a decimal float, or a character char, is irrelevant to the \"data structure\".

In other words, basic data types provide the \"content type\" of data, while data structures provide the \"way of organizing\" data. For example, in the following code, we use the same data structure (array) to store and represent different basic data types, including int, float, char, bool, etc.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Using various basic data types to initialize arrays\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python's characters are actually strings of length 1\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python's lists can freely store various basic data types and object references\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// Using various basic data types to initialize arrays\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// Using various basic data types to initialize arrays\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// Using various basic data types to initialize arrays\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript's arrays can freely store various basic data types and objects\nconst array = [0, 0.0, 'a', false];\n
// Using various basic data types to initialize arrays\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// Using various basic data types to initialize arrays\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// Using various basic data types to initialize arrays\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0, 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// Using various basic data types to initialize arrays\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
\n
// Using various basic data types to initialize arrays\nvar numbers: [5]i32 = undefined;\nvar decimals: [5]f32 = undefined;\nvar characters: [5]u8 = undefined;\nvar bools: [5]bool = undefined;\n
"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 Character encoding *","text":"

In the computer system, all data is stored in binary form, and characters (represented by char) are no exception. To represent characters, we need to develop a \"character set\" that defines a one-to-one mapping between each character and binary numbers. With the character set, computers can convert binary numbers to characters by looking up the table.

"},{"location":"chapter_data_structure/character_encoding/#341-ascii-character-set","title":"3.4.1 \u00a0 ASCII character set","text":"

The \"ASCII code\" is one of the earliest character sets, officially known as the American Standard Code for Information Interchange. It uses 7 binary digits (the lower 7 bits of a byte) to represent a character, allowing for a maximum of 128 different characters. As shown in the Figure 3-6 , ASCII includes uppercase and lowercase English letters, numbers 0 ~ 9, various punctuation marks, and certain control characters (such as newline and tab).

Figure 3-6 \u00a0 ASCII code

However, ASCII can only represent English characters. With the globalization of computers, a character set called \"EASCII\" was developed to represent more languages. It expands from the 7-bit structure of ASCII to 8 bits, enabling the representation of 256 characters.

Globally, various region-specific EASCII character sets have been introduced. The first 128 characters of these sets are consistent with the ASCII, while the remaining 128 characters are defined differently to accommodate the requirements of different languages.

"},{"location":"chapter_data_structure/character_encoding/#342-gbk-character-set","title":"3.4.2 \u00a0 GBK character set","text":"

Later, it was found that EASCII still could not meet the character requirements of many languages. For instance, there are nearly a hundred thousand Chinese characters, with several thousand used regularly. In 1980, the Standardization Administration of China released the \"GB2312\" character set, which included 6763 Chinese characters, essentially fulfilling the computer processing needs for the Chinese language.

However, GB2312 could not handle some rare and traditional characters. The \"GBK\" character set expands GB2312 and includes 21886 Chinese characters. In the GBK encoding scheme, ASCII characters are represented with one byte, while Chinese characters use two bytes.

"},{"location":"chapter_data_structure/character_encoding/#343-unicode-character-set","title":"3.4.3 \u00a0 Unicode character set","text":"

With the rapid evolution of computer technology and a plethora of character sets and encoding standards, numerous problems arose. On the one hand, these character sets generally only defined characters for specific languages and could not function properly in multilingual environments. On the other hand, the existence of multiple character set standards for the same language caused garbled text when information was exchanged between computers using different encoding standards.

Researchers of that era thought: What if a comprehensive character set encompassing all global languages and symbols was developed? Wouldn't this resolve the issues associated with cross-linguistic environments and garbled text? Inspired by this idea, the extensive character set, Unicode, was born.

\"Unicode\" is referred to as \"\u7edf\u4e00\u7801\" (Unified Code) in Chinese, theoretically capable of accommodating over a million characters. It aims to incorporate characters from all over the world into a single set, providing a universal character set for processing and displaying various languages and reducing the issues of garbled text due to different encoding standards.

Since its release in 1991, Unicode has continually expanded to include new languages and characters. As of September 2022, Unicode contains 149,186 characters, including characters, symbols, and even emojis from various languages. In the vast Unicode character set, commonly used characters occupy 2 bytes, while some rare characters may occupy 3 or even 4 bytes.

Unicode is a universal character set that assigns a number (called a \"code point\") to each character, but it does not specify how these character code points should be stored in a computer system. One might ask: How does a system interpret Unicode code points of varying lengths within a text? For example, given a 2-byte code, how does the system determine if it represents a single 2-byte character or two 1-byte characters?

A straightforward solution to this problem is to store all characters as equal-length encodings. As shown in the Figure 3-7 , each character in \"Hello\" occupies 1 byte, while each character in \"\u7b97\u6cd5\" (algorithm) occupies 2 bytes. We could encode all characters in \"Hello \u7b97\u6cd5\" as 2 bytes by padding the higher bits with zeros. This method would enable the system to interpret a character every 2 bytes, recovering the content of the phrase.

Figure 3-7 \u00a0 Unicode encoding example

However, as ASCII has shown us, encoding English only requires 1 byte. Using the above approach would double the space occupied by English text compared to ASCII encoding, which is a waste of memory space. Therefore, a more efficient Unicode encoding method is needed.

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8-encoding","title":"3.4.4 \u00a0 UTF-8 encoding","text":"

Currently, UTF-8 has become the most widely used Unicode encoding method internationally. It is a variable-length encoding, using 1 to 4 bytes to represent a character, depending on the complexity of the character. ASCII characters need only 1 byte, Latin and Greek letters require 2 bytes, commonly used Chinese characters need 3 bytes, and some other rare characters need 4 bytes.

The encoding rules for UTF-8 are not complex and can be divided into two cases:

  • For 1-byte characters, set the highest bit to \\(0\\), and the remaining 7 bits to the Unicode code point. Notably, ASCII characters occupy the first 128 code points in the Unicode set. This means that UTF-8 encoding is backward compatible with ASCII. This implies that UTF-8 can be used to parse ancient ASCII text.
  • For characters of length \\(n\\) bytes (where \\(n > 1\\)), set the highest \\(n\\) bits of the first byte to \\(1\\), and the \\((n + 1)^{\\text{th}}\\) bit to \\(0\\); starting from the second byte, set the highest 2 bits of each byte to \\(10\\); the rest of the bits are used to fill the Unicode code point.

The Figure 3-8 shows the UTF-8 encoding for \"Hello\u7b97\u6cd5\". It can be observed that since the highest \\(n\\) bits are set to \\(1\\), the system can determine the length of the character as \\(n\\) by counting the number of highest bits set to \\(1\\).

But why set the highest 2 bits of the remaining bytes to \\(10\\)? Actually, this \\(10\\) serves as a kind of checksum. If the system starts parsing text from an incorrect byte, the \\(10\\) at the beginning of the byte can help the system quickly detect anomalies.

The reason for using \\(10\\) as a checksum is that, under UTF-8 encoding rules, it's impossible for the highest two bits of a character to be \\(10\\). This can be proven by contradiction: If the highest two bits of a character are \\(10\\), it indicates that the character's length is \\(1\\), corresponding to ASCII. However, the highest bit of an ASCII character should be \\(0\\), which contradicts the assumption.

Figure 3-8 \u00a0 UTF-8 encoding example

Apart from UTF-8, other common encoding methods include:

  • UTF-16 encoding: Uses 2 or 4 bytes to represent a character. All ASCII characters and commonly used non-English characters are represented with 2 bytes; a few characters require 4 bytes. For 2-byte characters, the UTF-16 encoding equals the Unicode code point.
  • UTF-32 encoding: Every character uses 4 bytes. This means UTF-32 occupies more space than UTF-8 and UTF-16, especially for texts with a high proportion of ASCII characters.

From the perspective of storage space, using UTF-8 to represent English characters is very efficient because it only requires 1 byte; using UTF-16 to encode some non-English characters (such as Chinese) can be more efficient because it only requires 2 bytes, while UTF-8 might need 3 bytes.

From a compatibility perspective, UTF-8 is the most versatile, with many tools and libraries supporting UTF-8 as a priority.

"},{"location":"chapter_data_structure/character_encoding/#345-character-encoding-in-programming-languages","title":"3.4.5 \u00a0 Character encoding in programming languages","text":"

Historically, many programming languages utilized fixed-length encodings such as UTF-16 or UTF-32 for processing strings during program execution. This allows strings to be handled as arrays, offering several advantages:

  • Random access: Strings encoded in UTF-16 can be accessed randomly with ease. For UTF-8, which is a variable-length encoding, locating the \\(i^{th}\\) character requires traversing the string from the start to the \\(i^{th}\\) position, taking \\(O(n)\\) time.
  • Character counting: Similar to random access, counting the number of characters in a UTF-16 encoded string is an \\(O(1)\\) operation. However, counting characters in a UTF-8 encoded string requires traversing the entire string.
  • String operations: Many string operations like splitting, concatenating, inserting, and deleting are easier on UTF-16 encoded strings. These operations generally require additional computation on UTF-8 encoded strings to ensure the validity of the UTF-8 encoding.

The design of character encoding schemes in programming languages is an interesting topic involving various factors:

  • Java\u2019s String type uses UTF-16 encoding, with each character occupying 2 bytes. This was based on the initial belief that 16 bits were sufficient to represent all possible characters and proven incorrect later. As the Unicode standard expanded beyond 16 bits, characters in Java may now be represented by a pair of 16-bit values, known as \u201csurrogate pairs.\u201d
  • JavaScript and TypeScript use UTF-16 encoding for similar reasons as Java. When JavaScript was first introduced by Netscape in 1995, Unicode was still in its early stages, and 16-bit encoding was sufficient to represent all Unicode characters.
  • C# uses UTF-16 encoding, largely because the .NET platform, designed by Microsoft, and many Microsoft technologies, including the Windows operating system, extensively use UTF-16 encoding.

Due to the underestimation of character counts, these languages had to use \"surrogate pairs\" to represent Unicode characters exceeding 16 bits. This approach has its drawbacks: strings containing surrogate pairs may have characters occupying 2 or 4 bytes, losing the advantage of fixed-length encoding. Additionally, handling surrogate pairs adds complexity and debugging difficulty to programming.

Addressing these challenges, some languages have adopted alternative encoding strategies:

  • Python\u2019s str type uses Unicode encoding with a flexible representation where the storage length of characters depends on the largest Unicode code point in the string. If all characters are ASCII, each character occupies 1 byte, 2 bytes for characters within the Basic Multilingual Plane (BMP), and 4 bytes for characters beyond the BMP.
  • Go\u2019s string type internally uses UTF-8 encoding. Go also provides the rune type for representing individual Unicode code points.
  • Rust\u2019s str and String types use UTF-8 encoding internally. Rust also offers the char type for individual Unicode code points.

It\u2019s important to note that the above discussion pertains to how strings are stored in programming languages, which is different from how strings are stored in files or transmitted over networks. For file storage or network transmission, strings are usually encoded in UTF-8 format for optimal compatibility and space efficiency.

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 Classification of data structures","text":"

Common data structures include arrays, linked lists, stacks, queues, hash tables, trees, heaps, and graphs. They can be classified into \"logical structure\" and \"physical structure\".

"},{"location":"chapter_data_structure/classification_of_data_structure/#311-logical-structure-linear-and-non-linear","title":"3.1.1 \u00a0 Logical structure: linear and non-linear","text":"

The logical structures reveal the logical relationships between data elements. In arrays and linked lists, data are arranged in a specific sequence, demonstrating the linear relationship between data; while in trees, data are arranged hierarchically from the top down, showing the derived relationship between \"ancestors\" and \"descendants\"; and graphs are composed of nodes and edges, reflecting the intricate network relationship.

As shown in the Figure 3-1 , logical structures can be divided into two major categories: \"linear\" and \"non-linear\". Linear structures are more intuitive, indicating data is arranged linearly in logical relationships; non-linear structures, conversely, are arranged non-linearly.

  • Linear data structures: Arrays, Linked Lists, Stacks, Queues, Hash Tables.
  • Non-linear data structures: Trees, Heaps, Graphs, Hash Tables.

Figure 3-1 \u00a0 Linear and non-linear data structures

Non-linear data structures can be further divided into tree structures and network structures.

  • Linear structures: Arrays, linked lists, queues, stacks, and hash tables, where elements have a one-to-one sequential relationship.
  • Tree structures: Trees, Heaps, Hash Tables, where elements have a one-to-many relationship.
  • Network structures: Graphs, where elements have a many-to-many relationships.
"},{"location":"chapter_data_structure/classification_of_data_structure/#312-physical-structure-contiguous-and-dispersed","title":"3.1.2 \u00a0 Physical structure: contiguous and dispersed","text":"

During the execution of an algorithm, the data being processed is stored in memory. The Figure 3-2 shows a computer memory stick where each black square is a physical memory space. We can think of memory as a vast Excel spreadsheet, with each cell capable of storing a certain amount of data.

The system accesses the data at the target location by means of a memory address. As shown in the Figure 3-2 , the computer assigns a unique identifier to each cell in the table according to specific rules, ensuring that each memory space has a unique memory address. With these addresses, the program can access the data stored in memory.

Figure 3-2 \u00a0 Memory stick, memory spaces, memory addresses

Tip

It's worth noting that comparing memory to an Excel spreadsheet is a simplified analogy. The actual working mechanism of memory is more complex, involving concepts like address space, memory management, cache mechanisms, virtual memory, and physical memory.

Memory is a shared resource for all programs. When a block of memory is occupied by one program, it cannot be simultaneously used by other programs. Therefore, considering memory resources is crucial in designing data structures and algorithms. For instance, the algorithm's peak memory usage should not exceed the remaining free memory of the system; if there is a lack of contiguous memory blocks, then the data structure chosen must be able to be stored in non-contiguous memory blocks.

As illustrated in the Figure 3-3 , the physical structure reflects the way data is stored in computer memory and it can be divided into contiguous space storage (arrays) and non-contiguous space storage (linked lists). The two types of physical structures exhibit complementary characteristics in terms of time efficiency and space efficiency.

Figure 3-3 \u00a0 Contiguous space storage and dispersed space storage

It is worth noting that all data structures are implemented based on arrays, linked lists, or a combination of both. For example, stacks and queues can be implemented using either arrays or linked lists; while implementations of hash tables may involve both arrays and linked lists. - Array-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, Matrices, Tensors (arrays with dimensions \\(\\geq 3\\)). - Linked-list-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, etc.

Data structures implemented based on arrays are also called \u201cStatic Data Structures,\u201d meaning their length cannot be changed after initialization. Conversely, those based on linked lists are called \u201cDynamic Data Structures,\u201d which can still adjust their size during program execution.

Tip

If you find it challenging to comprehend the physical structure, it is recommended that you read the next chapter, \"Arrays and Linked Lists,\" and revisit this section later.

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 Number encoding *","text":"

Tip

In this book, chapters marked with an asterisk '*' are optional readings. If you are short on time or find them challenging, you may skip these initially and return to them after completing the essential chapters.

"},{"location":"chapter_data_structure/number_encoding/#331-integer-encoding","title":"3.3.1 \u00a0 Integer encoding","text":"

In the table from the previous section, we observed that all integer types can represent one more negative number than positive numbers, such as the byte range of \\([-128, 127]\\). This phenomenon seems counterintuitive, and its underlying reason involves knowledge of sign-magnitude, one's complement, and two's complement encoding.

Firstly, it's important to note that numbers are stored in computers using the two's complement form. Before analyzing why this is the case, let's define these three encoding methods:

  • Sign-magnitude: The highest bit of a binary representation of a number is considered the sign bit, where \\(0\\) represents a positive number and \\(1\\) represents a negative number. The remaining bits represent the value of the number.
  • One's complement: The one's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by inverting all bits except the sign bit.
  • Two's complement: The two's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by adding \\(1\\) to their one's complement.

The following diagram illustrates the conversions among sign-magnitude, one's complement, and two's complement:

Figure 3-4 \u00a0 Conversions between sign-magnitude, one's complement, and two's complement

Although sign-magnitude is the most intuitive, it has limitations. For one, negative numbers in sign-magnitude cannot be directly used in calculations. For example, in sign-magnitude, calculating \\(1 + (-2)\\) results in \\(-3\\), which is incorrect.

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

To address this, computers introduced the one's complement. If we convert to one's complement and calculate \\(1 + (-2)\\), then convert the result back to sign-magnitude, we get the correct result of \\(-1\\).

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(Sign-magnitude)} + 1000 \\; 0010 \\; \\text{(Sign-magnitude)} \\newline & = 0000 \\; 0001 \\; \\text{(One's complement)} + 1111 \\; 1101 \\; \\text{(One's complement)} \\newline & = 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & \\rightarrow -1 \\end{aligned} \\]

Additionally, there are two representations of zero in sign-magnitude: \\(+0\\) and \\(-0\\). This means two different binary encodings for zero, which could lead to ambiguity. For example, in conditional checks, not differentiating between positive and negative zero might result in incorrect outcomes. Addressing this ambiguity would require additional checks, potentially reducing computational efficiency.

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

Like sign-magnitude, one's complement also suffers from the positive and negative zero ambiguity. Therefore, computers further introduced the two's complement. Let's observe the conversion process for negative zero in sign-magnitude, one's complement, and two's complement:

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(Sign-magnitude)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(One's complement)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(Two's complement)} \\newline \\end{aligned} \\]

Adding \\(1\\) to the one's complement of negative zero produces a carry, but with byte length being only 8 bits, the carried-over \\(1\\) to the 9th bit is discarded. Therefore, the two's complement of negative zero is \\(0000 \\; 0000\\), the same as positive zero, thus resolving the ambiguity.

One last puzzle is the \\([-128, 127]\\) range for byte, with an additional negative number, \\(-128\\). We observe that for the interval \\([-127, +127]\\), all integers have corresponding sign-magnitude, one's complement, and two's complement, allowing for mutual conversion between them.

However, the two's complement \\(1000 \\; 0000\\) is an exception without a corresponding sign-magnitude. According to the conversion method, its sign-magnitude would be \\(0000 \\; 0000\\), indicating zero. This presents a contradiction because its two's complement should represent itself. Computers designate this special two's complement \\(1000 \\; 0000\\) as representing \\(-128\\). In fact, the calculation of \\((-1) + (-127)\\) in two's complement results in \\(-128\\).

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(Sign-magnitude)} + 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & = 1000 \\; 0000 \\; \\text{(One's complement)} + 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Two's complement)} + 1111 \\; 1111 \\; \\text{(Two's complement)} \\newline & = 1000 \\; 0000 \\; \\text{(Two's complement)} \\newline & \\rightarrow -128 \\end{aligned} \\]

As you might have noticed, all these calculations are additions, hinting at an important fact: computers' internal hardware circuits are primarily designed around addition operations. This is because addition is simpler to implement in hardware compared to other operations like multiplication, division, and subtraction, allowing for easier parallelization and faster computation.

It's important to note that this doesn't mean computers can only perform addition. By combining addition with basic logical operations, computers can execute a variety of other mathematical operations. For example, the subtraction \\(a - b\\) can be translated into \\(a + (-b)\\); multiplication and division can be translated into multiple additions or subtractions.

We can now summarize the reason for using two's complement in computers: with two's complement representation, computers can use the same circuits and operations to handle both positive and negative number addition, eliminating the need for special hardware circuits for subtraction and avoiding the ambiguity of positive and negative zero. This greatly simplifies hardware design and enhances computational efficiency.

The design of two's complement is quite ingenious, and due to space constraints, we'll stop here. Interested readers are encouraged to explore further.

"},{"location":"chapter_data_structure/number_encoding/#332-floating-point-number-encoding","title":"3.3.2 \u00a0 Floating-point number encoding","text":"

You might have noticed something intriguing: despite having the same length of 4 bytes, why does a float have a much larger range of values compared to an int? This seems counterintuitive, as one would expect the range to shrink for float since it needs to represent fractions.

In fact, this is due to the different representation method used by floating-point numbers (float). Let's consider a 32-bit binary number as:

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

According to the IEEE 754 standard, a 32-bit float consists of the following three parts:

  • Sign bit \\(\\mathrm{S}\\): Occupies 1 bit, corresponding to \\(b_{31}\\).
  • Exponent bit \\(\\mathrm{E}\\): Occupies 8 bits, corresponding to \\(b_{30} b_{29} \\ldots b_{23}\\).
  • Fraction bit \\(\\mathrm{N}\\): Occupies 23 bits, corresponding to \\(b_{22} b_{21} \\ldots b_0\\).

The value of a binary float number is calculated as:

\\[ \\text{val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2 - 127} \\times \\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

Converted to a decimal formula, this becomes:

\\[ \\text{val} = (-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} - 127} \\times (1 + \\mathrm{N}) \\]

The range of each component is:

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} \\times 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

Figure 3-5 \u00a0 Example calculation of a float in IEEE 754 standard

Observing the diagram, given an example data \\(\\mathrm{S} = 0\\), \\(\\mathrm{E} = 124\\), \\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\), we have:

\\[ \\text{val} = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

Now we can answer the initial question: The representation of float includes an exponent bit, leading to a much larger range than int. Based on the above calculation, the maximum positive number representable by float is approximately \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\), and the minimum negative number is obtained by switching the sign bit.

However, the trade-off for float's expanded range is a sacrifice in precision. The integer type int uses all 32 bits to represent the number, with values evenly distributed; but due to the exponent bit, the larger the value of a float, the greater the difference between adjacent numbers.

As shown in the Table 3-2 , exponent bits \\(\\mathrm{E} = 0\\) and \\(\\mathrm{E} = 255\\) have special meanings, used to represent zero, infinity, \\(\\mathrm{NaN}\\), etc.

Table 3-2 \u00a0 Meaning of exponent bits

Exponent Bit E Fraction Bit \\(\\mathrm{N} = 0\\) Fraction Bit \\(\\mathrm{N} \\ne 0\\) Calculation Formula \\(0\\) \\(\\pm 0\\) Subnormal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) Normal Numbers Normal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

It's worth noting that subnormal numbers significantly improve the precision of floating-point numbers. The smallest positive normal number is \\(2^{-126}\\), and the smallest positive subnormal number is \\(2^{-126} \\times 2^{-23}\\).

Double-precision double also uses a similar representation method to float, which is not elaborated here for brevity.

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 Summary","text":""},{"location":"chapter_data_structure/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Data structures can be categorized from two perspectives: logical structure and physical structure. Logical structure describes the logical relationships between data elements, while physical structure describes how data is stored in computer memory.
  • Common logical structures include linear, tree-like, and network structures. We generally classify data structures into linear (arrays, linked lists, stacks, queues) and non-linear (trees, graphs, heaps) based on their logical structure. The implementation of hash tables may involve both linear and non-linear data structures.
  • When a program runs, data is stored in computer memory. Each memory space has a corresponding memory address, and the program accesses data through these addresses.
  • Physical structures are primarily divided into contiguous space storage (arrays) and dispersed space storage (linked lists). All data structures are implemented using arrays, linked lists, or a combination of both.
  • Basic data types in computers include integers (byte, short, int, long), floating-point numbers (float, double), characters (char), and booleans (boolean). Their range depends on the size of the space occupied and the representation method.
  • Original code, complement code, and two's complement code are three methods of encoding numbers in computers, and they can be converted into each other. The highest bit of the original code of an integer is the sign bit, and the remaining bits represent the value of the number.
  • Integers are stored in computers in the form of two's complement. In this representation, the computer can treat the addition of positive and negative numbers uniformly, without the need for special hardware circuits for subtraction, and there is no ambiguity of positive and negative zero.
  • The encoding of floating-point numbers consists of 1 sign bit, 8 exponent bits, and 23 fraction bits. Due to the presence of the exponent bit, the range of floating-point numbers is much greater than that of integers, but at the cost of sacrificing precision.
  • ASCII is the earliest English character set, 1 byte in length, and includes 127 characters. The GBK character set is a commonly used Chinese character set, including more than 20,000 Chinese characters. Unicode strives to provide a complete character set standard, including characters from various languages worldwide, thus solving the problem of garbled characters caused by inconsistent character encoding methods.
  • UTF-8 is the most popular Unicode encoding method, with excellent universality. It is a variable-length encoding method with good scalability and effectively improves the efficiency of space usage. UTF-16 and UTF-32 are fixed-length encoding methods. When encoding Chinese characters, UTF-16 occupies less space than UTF-8. Programming languages like Java and C# use UTF-16 encoding by default.
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Why does a hash table contain both linear and non-linear data structures?

The underlying structure of a hash table is an array. To resolve hash collisions, we may use \"chaining\": each bucket in the array points to a linked list, which, when exceeding a certain threshold, might be transformed into a tree (usually a red-black tree). From a storage perspective, the foundation of a hash table is an array, where each bucket slot might contain a value, a linked list, or a tree. Therefore, hash tables may contain both linear data structures (arrays, linked lists) and non-linear data structures (trees).

Q: Is the length of the char type 1 byte?

The length of the char type is determined by the encoding method used by the programming language. For example, Java, JavaScript, TypeScript, and C# all use UTF-16 encoding (to save Unicode code points), so the length of the char type is 2 bytes.

Q: Is there ambiguity in calling data structures based on arrays \"static data structures\"? Because operations like push and pop on stacks are \"dynamic\".

While stacks indeed allow for dynamic data operations, the data structure itself remains \"static\" (with unchangeable length). Even though data structures based on arrays can dynamically add or remove elements, their capacity is fixed. If the data volume exceeds the pre-allocated size, a new, larger array needs to be created, and the contents of the old array copied into it.

Q: When building stacks (queues) without specifying their size, why are they considered \"static data structures\"?

In high-level programming languages, we don't need to manually specify the initial capacity of stacks (queues); this task is automatically handled internally by the class. For example, the initial capacity of Java's ArrayList is usually 10. Furthermore, the expansion operation is also implemented automatically. See the subsequent \"List\" chapter for details.

"},{"location":"chapter_graph/","title":"Chapter 9. \u00a0 Graph","text":"

Abstract

In the journey of life, we are like individual nodes, connected by countless invisible edges.

Each encounter and parting leaves a distinctive imprint on this vast network graph.

"},{"location":"chapter_graph/#chapter-contents","title":"Chapter contents","text":"
  • 9.1 \u00a0 Graph
  • 9.2 \u00a0 Basic graph operations
  • 9.3 \u00a0 Graph traversal
  • 9.4 \u00a0 Summary
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 Graph","text":"

A \"graph\" is a type of nonlinear data structure, consisting of \"vertices\" and \"edges\". A graph \\(G\\) can be abstractly represented as a collection of a set of vertices \\(V\\) and a set of edges \\(E\\). The following example shows a graph containing 5 vertices and 7 edges.

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

If vertices are viewed as nodes and edges as references (pointers) connecting the nodes, graphs can be seen as a data structure that extends from linked lists. As shown below, compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) are more complex due to their higher degree of freedom.

Figure 9-1 \u00a0 Relationship between linked lists, trees, and graphs

"},{"location":"chapter_graph/graph/#911-common-types-of-graphs","title":"9.1.1 \u00a0 Common types of graphs","text":"

Based on whether edges have direction, graphs can be divided into \"undirected graphs\" and \"directed graphs\", as shown below.

  • In undirected graphs, edges represent a \"bidirectional\" connection between two vertices, for example, the \"friendship\" in WeChat or QQ.
  • In directed graphs, edges have directionality, that is, the edges \\(A \\rightarrow B\\) and \\(A \\leftarrow B\\) are independent of each other, for example, the \"follow\" and \"be followed\" relationship on Weibo or TikTok.

Figure 9-2 \u00a0 Directed and undirected graphs

Based on whether all vertices are connected, graphs can be divided into \"connected graphs\" and \"disconnected graphs\", as shown below.

  • For connected graphs, it is possible to reach any other vertex starting from a certain vertex.
  • For disconnected graphs, there is at least one vertex that cannot be reached from a certain starting vertex.

Figure 9-3 \u00a0 Connected and disconnected graphs

We can also add a \"weight\" variable to edges, resulting in \"weighted graphs\" as shown below. For example, in mobile games like \"Honor of Kings\", the system calculates the \"closeness\" between players based on shared gaming time, and this closeness network can be represented with a weighted graph.

Figure 9-4 \u00a0 Weighted and unweighted graphs

Graph data structures include the following commonly used terms.

  • \"Adjacency\": When there is an edge connecting two vertices, these two vertices are said to be \"adjacent\". In the above figure, the adjacent vertices of vertex 1 are vertices 2, 3, and 5.
  • \"Path\": The sequence of edges passed from vertex A to vertex B is called a \"path\" from A to B. In the above figure, the edge sequence 1-5-2-4 is a path from vertex 1 to vertex 4.
  • \"Degree\": The number of edges a vertex has. For directed graphs, \"in-degree\" refers to how many edges point to the vertex, and \"out-degree\" refers to how many edges point out from the vertex.
"},{"location":"chapter_graph/graph/#912-representation-of-graphs","title":"9.1.2 \u00a0 Representation of graphs","text":"

Common representations of graphs include \"adjacency matrices\" and \"adjacency lists\". The following examples use undirected graphs.

"},{"location":"chapter_graph/graph/#1-adjacency-matrix","title":"1. \u00a0 Adjacency matrix","text":"

Let the number of vertices in the graph be \\(n\\), the \"adjacency matrix\" uses an \\(n \\times n\\) matrix to represent the graph, where each row (column) represents a vertex, and the matrix elements represent edges, with \\(1\\) or \\(0\\) indicating whether there is an edge between two vertices.

As shown below, let the adjacency matrix be \\(M\\), and the list of vertices be \\(V\\), then the matrix element \\(M[i, j] = 1\\) indicates there is an edge between vertex \\(V[i]\\) and vertex \\(V[j]\\), conversely \\(M[i, j] = 0\\) indicates there is no edge between the two vertices.

Figure 9-5 \u00a0 Representation of a graph with an adjacency matrix

Adjacency matrices have the following characteristics.

  • A vertex cannot be connected to itself, so the elements on the main diagonal of the adjacency matrix are meaningless.
  • For undirected graphs, edges in both directions are equivalent, thus the adjacency matrix is symmetric about the main diagonal.
  • By replacing the elements of the adjacency matrix from \\(1\\) and \\(0\\) to weights, it can represent weighted graphs.

When representing graphs with adjacency matrices, it is possible to directly access matrix elements to obtain edges, thus operations of addition, deletion, lookup, and modification are very efficient, all with a time complexity of \\(O(1)\\). However, the space complexity of the matrix is \\(O(n^2)\\), which consumes more memory.

"},{"location":"chapter_graph/graph/#2-adjacency-list","title":"2. \u00a0 Adjacency list","text":"

The \"adjacency list\" uses \\(n\\) linked lists to represent the graph, with each linked list node representing a vertex. The \\(i\\)-th linked list corresponds to vertex \\(i\\) and contains all adjacent vertices (vertices connected to that vertex). The Figure 9-6 shows an example of a graph stored using an adjacency list.

Figure 9-6 \u00a0 Representation of a graph with an adjacency list

The adjacency list only stores actual edges, and the total number of edges is often much less than \\(n^2\\), making it more space-efficient. However, finding edges in the adjacency list requires traversing the linked list, so its time efficiency is not as good as that of the adjacency matrix.

Observing the above figure, the structure of the adjacency list is very similar to the \"chaining\" in hash tables, hence we can use similar methods to optimize efficiency. For example, when the linked list is long, it can be transformed into an AVL tree or red-black tree, thus optimizing the time efficiency from \\(O(n)\\) to \\(O(\\log n)\\); the linked list can also be transformed into a hash table, thus reducing the time complexity to \\(O(1)\\).

"},{"location":"chapter_graph/graph/#913-common-applications-of-graphs","title":"9.1.3 \u00a0 Common applications of graphs","text":"

As shown in the Table 9-1 , many real-world systems can be modeled with graphs, and corresponding problems can be reduced to graph computing problems.

Table 9-1 \u00a0 Common graphs in real life

Vertices Edges Graph Computing Problem Social Networks Users Friendships Potential Friend Recommendations Subway Lines Stations Connectivity Between Stations Shortest Route Recommendations Solar System Celestial Bodies Gravitational Forces Between Celestial Bodies Planetary Orbit Calculations"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 Basic operations on graphs","text":"

The basic operations on graphs can be divided into operations on \"edges\" and operations on \"vertices\". Under the two representation methods of \"adjacency matrix\" and \"adjacency list\", the implementation methods are different.

"},{"location":"chapter_graph/graph_operations/#921-implementation-based-on-adjacency-matrix","title":"9.2.1 \u00a0 Implementation based on adjacency matrix","text":"

Given an undirected graph with \\(n\\) vertices, the various operations are implemented as shown in the Figure 9-7 .

  • Adding or removing an edge: Directly modify the specified edge in the adjacency matrix, using \\(O(1)\\) time. Since it is an undirected graph, it is necessary to update the edges in both directions simultaneously.
  • Adding a vertex: Add a row and a column at the end of the adjacency matrix and fill them all with \\(0\\)s, using \\(O(n)\\) time.
  • Removing a vertex: Delete a row and a column in the adjacency matrix. The worst case is when the first row and column are removed, requiring \\((n-1)^2\\) elements to be \"moved up and to the left\", thus using \\(O(n^2)\\) time.
  • Initialization: Pass in \\(n\\) vertices, initialize a vertex list vertices of length \\(n\\), using \\(O(n)\\) time; initialize an \\(n \\times n\\) size adjacency matrix adjMat, using \\(O(n^2)\\) time.
Initialize adjacency matrixAdd an edgeRemove an edgeAdd a vertexRemove a vertex

Figure 9-7 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency matrix

Below is the implementation code for graphs represented using an adjacency matrix:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_graph/graph_operations/#922-implementation-based-on-adjacency-list","title":"9.2.2 \u00a0 Implementation based on adjacency list","text":"

Given an undirected graph with a total of \\(n\\) vertices and \\(m\\) edges, the various operations can be implemented as shown in the Figure 9-8 .

  • Adding an edge: Simply add the edge at the end of the corresponding vertex's linked list, using \\(O(1)\\) time. Because it is an undirected graph, it is necessary to add edges in both directions simultaneously.
  • Removing an edge: Find and remove the specified edge in the corresponding vertex's linked list, using \\(O(m)\\) time. In an undirected graph, it is necessary to remove edges in both directions simultaneously.
  • Adding a vertex: Add a linked list in the adjacency list and make the new vertex the head node of the list, using \\(O(1)\\) time.
  • Removing a vertex: It is necessary to traverse the entire adjacency list, removing all edges that include the specified vertex, using \\(O(n + m)\\) time.
  • Initialization: Create \\(n\\) vertices and \\(2m\\) edges in the adjacency list, using \\(O(n + m)\\) time.
Initialize adjacency listAdd an edgeRemove an edgeAdd a vertexRemove a vertex

Figure 9-8 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency list

Below is the adjacency list code implementation. Compared to the above diagram, the actual code has the following differences.

  • For convenience in adding and removing vertices, and to simplify the code, we use lists (dynamic arrays) instead of linked lists.
  • Use a hash table to store the adjacency list, key being the vertex instance, value being the list (linked list) of adjacent vertices of that vertex.

Additionally, we use the Vertex class to represent vertices in the adjacency list. The reason for this is: if, like with the adjacency matrix, list indexes were used to distinguish different vertices, then suppose you want to delete the vertex at index \\(i\\), you would need to traverse the entire adjacency list and decrement all indexes greater than \\(i\\) by \\(1\\), which is very inefficient. However, if each vertex is a unique Vertex instance, then deleting a vertex does not require any changes to other vertices.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_graph/graph_operations/#923-efficiency-comparison","title":"9.2.3 \u00a0 Efficiency comparison","text":"

Assuming there are \\(n\\) vertices and \\(m\\) edges in the graph, the Table 9-2 compares the time efficiency and space efficiency of the adjacency matrix and adjacency list.

Table 9-2 \u00a0 Comparison of adjacency matrix and adjacency list

Adjacency matrix Adjacency list (Linked list) Adjacency list (Hash table) Determine adjacency \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add an edge \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Remove an edge \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add a vertex \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) Remove a vertex \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) Memory space usage \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

Observing the Table 9-2 , it seems that the adjacency list (hash table) has the best time efficiency and space efficiency. However, in practice, operating on edges in the adjacency matrix is more efficient, requiring only a single array access or assignment operation. Overall, the adjacency matrix exemplifies the principle of \"space for time\", while the adjacency list exemplifies \"time for space\".

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 Graph traversal","text":"

Trees represent a \"one-to-many\" relationship, while graphs have a higher degree of freedom and can represent any \"many-to-many\" relationship. Therefore, we can consider trees as a special case of graphs. Clearly, tree traversal operations are also a special case of graph traversal operations.

Both graphs and trees require the application of search algorithms to implement traversal operations. Graph traversal can be divided into two types: \"Breadth-First Search (BFS)\" and \"Depth-First Search (DFS)\".

"},{"location":"chapter_graph/graph_traversal/#931-breadth-first-search","title":"9.3.1 \u00a0 Breadth-first search","text":"

Breadth-first search is a near-to-far traversal method, starting from a certain node, always prioritizing the visit to the nearest vertices and expanding outwards layer by layer. As shown in the Figure 9-9 , starting from the top left vertex, first traverse all adjacent vertices of that vertex, then traverse all adjacent vertices of the next vertex, and so on, until all vertices have been visited.

Figure 9-9 \u00a0 Breadth-first traversal of a graph

"},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation","title":"1. \u00a0 Algorithm implementation","text":"

BFS is usually implemented with the help of a queue, as shown in the code below. The queue has a \"first in, first out\" property, which aligns with the BFS idea of traversing \"from near to far\".

  1. Add the starting vertex startVet to the queue and start the loop.
  2. In each iteration of the loop, pop the vertex at the front of the queue and record it as visited, then add all adjacent vertices of that vertex to the back of the queue.
  3. Repeat step 2. until all vertices have been visited.

To prevent revisiting vertices, we use a hash table visited to record which nodes have been visited.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
graph_bfs.kt
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
Code Visualization

Full Screen >

The code is relatively abstract, it is suggested to compare with the following figure to deepen the understanding.

<1><2><3><4><5><6><7><8><9><10><11>

Figure 9-10 \u00a0 Steps of breadth-first search of a graph

Is the sequence of breadth-first traversal unique?

Not unique. Breadth-first traversal only requires traversing in a \"from near to far\" order, and the traversal order of multiple vertices at the same distance can be arbitrarily shuffled. For example, in the above figure, the visitation order of vertices \\(1\\) and \\(3\\) can be switched, as can the order of vertices \\(2\\), \\(4\\), and \\(6\\).

"},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"

Time complexity: All vertices will be enqueued and dequeued once, using \\(O(|V|)\\) time; in the process of traversing adjacent vertices, since it is an undirected graph, all edges will be visited \\(2\\) times, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

Space complexity: The maximum number of vertices in list res, hash table visited, and queue que is \\(|V|\\), using \\(O(|V|)\\) space.

"},{"location":"chapter_graph/graph_traversal/#932-depth-first-search","title":"9.3.2 \u00a0 Depth-first search","text":"

Depth-first search is a traversal method that prioritizes going as far as possible and then backtracks when no further paths are available. As shown in the Figure 9-11 , starting from the top left vertex, visit some adjacent vertex of the current vertex until no further path is available, then return and continue until all vertices are traversed.

Figure 9-11 \u00a0 Depth-first traversal of a graph

"},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation_1","title":"1. \u00a0 Algorithm implementation","text":"

This \"go as far as possible and then return\" algorithm paradigm is usually implemented based on recursion. Similar to breadth-first search, in depth-first search, we also need the help of a hash table visited to record the visited vertices to avoid revisiting.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
Code Visualization

Full Screen >

The algorithm process of depth-first search is shown in the following figure.

  • Dashed lines represent downward recursion, indicating that a new recursive method has been initiated to visit a new vertex.
  • Curved dashed lines represent upward backtracking, indicating that this recursive method has returned to the position where this method was initiated.

To deepen the understanding, it is suggested to combine the following figure with the code to simulate (or draw) the entire DFS process in your mind, including when each recursive method is initiated and when it returns.

<1><2><3><4><5><6><7><8><9><10><11>

Figure 9-12 \u00a0 Steps of depth-first search of a graph

Is the sequence of depth-first traversal unique?

Similar to breadth-first traversal, the order of the depth-first traversal sequence is also not unique. Given a certain vertex, exploring in any direction first is possible, that is, the order of adjacent vertices can be arbitrarily shuffled, all being part of depth-first traversal.

Taking tree traversal as an example, \"root \\(\\rightarrow\\) left \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) right \\(\\rightarrow\\) root\" correspond to preorder, inorder, and postorder traversals, respectively. They showcase three types of traversal priorities, yet all three are considered depth-first traversal.

"},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"

Time complexity: All vertices will be visited once, using \\(O(|V|)\\) time; all edges will be visited twice, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

Space complexity: The maximum number of vertices in list res, hash table visited is \\(|V|\\), and the maximum recursion depth is \\(|V|\\), therefore using \\(O(|V|)\\) space.

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 Summary","text":""},{"location":"chapter_graph/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A graph consists of vertices and edges and can be represented as a set comprising a group of vertices and a group of edges.
  • Compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) have a higher degree of freedom and are therefore more complex.
  • The edges of a directed graph have directionality, any vertex in a connected graph is reachable, and each edge in a weighted graph contains a weight variable.
  • Adjacency matrices use matrices to represent graphs, with each row (column) representing a vertex and matrix elements representing edges, using \\(1\\) or \\(0\\) to indicate the presence or absence of an edge between two vertices. Adjacency matrices are highly efficient for add, delete, find, and modify operations, but they consume more space.
  • Adjacency lists use multiple linked lists to represent graphs, with the \\(i^{th}\\) list corresponding to vertex \\(i\\), containing all its adjacent vertices. Adjacency lists save more space compared to adjacency matrices, but since it is necessary to traverse the list to find edges, their time efficiency is lower.
  • When the linked lists in the adjacency list are too long, they can be converted into red-black trees or hash tables to improve query efficiency.
  • From the perspective of algorithmic thinking, adjacency matrices embody the principle of \"space for time,\" while adjacency lists embody \"time for space.\"
  • Graphs can be used to model various real systems, such as social networks, subway routes, etc.
  • A tree is a special case of a graph, and tree traversal is also a special case of graph traversal.
  • Breadth-first traversal of a graph is a search method that expands layer by layer from near to far, usually implemented with a queue.
  • Depth-first traversal of a graph is a search method that prefers to go as deep as possible and backtracks when no further paths are available, often based on recursion.
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is a path defined as a sequence of vertices or a sequence of edges?

Definitions vary between different language versions on Wikipedia: the English version defines a path as \"a sequence of edges,\" while the Chinese version defines it as \"a sequence of vertices.\" Here is the original text from the English version: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

In this document, a path is considered a sequence of edges, rather than a sequence of vertices. This is because there might be multiple edges connecting two vertices, in which case each edge corresponds to a path.

Q: In a disconnected graph, are there points that cannot be traversed to?

In a disconnected graph, starting from a certain vertex, there is at least one vertex that cannot be reached. Traversing a disconnected graph requires setting multiple starting points to traverse all connected components of the graph.

Q: In an adjacency list, does the order of \"all vertices connected to that vertex\" matter?

It can be in any order. However, in practical applications, it might be necessary to sort according to certain rules, such as the order in which vertices are added, or the order of vertex values, etc., to facilitate the quick search for vertices with certain extremal values.

"},{"location":"chapter_hashing/","title":"Chapter 6. \u00a0 Hash table","text":"

Abstract

In the world of computing, a hash table is akin to an intelligent librarian.

It understands how to compute index numbers, enabling swift retrieval of the desired book.

"},{"location":"chapter_hashing/#chapter-contents","title":"Chapter contents","text":"
  • 6.1 \u00a0 Hash table
  • 6.2 \u00a0 Hash collision
  • 6.3 \u00a0 Hash algorithm
  • 6.4 \u00a0 Summary
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 Hash algorithms","text":"

The previous two sections introduced the working principle of hash tables and the methods to handle hash collisions. However, both open addressing and chaining can only ensure that the hash table functions normally when collisions occur, but cannot reduce the frequency of hash collisions.

If hash collisions occur too frequently, the performance of the hash table will deteriorate drastically. As shown in the Figure 6-8 , for a chaining hash table, in the ideal case, the key-value pairs are evenly distributed across the buckets, achieving optimal query efficiency; in the worst case, all key-value pairs are stored in the same bucket, degrading the time complexity to \\(O(n)\\).

Figure 6-8 \u00a0 Ideal and worst cases of hash collisions

The distribution of key-value pairs is determined by the hash function. Recalling the steps of calculating a hash function, first compute the hash value, then modulo it by the array length:

index = hash(key) % capacity\n

Observing the above formula, when the hash table capacity capacity is fixed, the hash algorithm hash() determines the output value, thereby determining the distribution of key-value pairs in the hash table.

This means that, to reduce the probability of hash collisions, we should focus on the design of the hash algorithm hash().

"},{"location":"chapter_hashing/hash_algorithm/#631-goals-of-hash-algorithms","title":"6.3.1 \u00a0 Goals of hash algorithms","text":"

To achieve a \"fast and stable\" hash table data structure, hash algorithms should have the following characteristics:

  • Determinism: For the same input, the hash algorithm should always produce the same output. Only then can the hash table be reliable.
  • High efficiency: The process of computing the hash value should be fast enough. The smaller the computational overhead, the more practical the hash table.
  • Uniform distribution: The hash algorithm should ensure that key-value pairs are evenly distributed in the hash table. The more uniform the distribution, the lower the probability of hash collisions.

In fact, hash algorithms are not only used to implement hash tables but are also widely applied in other fields.

  • Password storage: To protect the security of user passwords, systems usually do not store the plaintext passwords but rather the hash values of the passwords. When a user enters a password, the system calculates the hash value of the input and compares it with the stored hash value. If they match, the password is considered correct.
  • Data integrity check: The data sender can calculate the hash value of the data and send it along; the receiver can recalculate the hash value of the received data and compare it with the received hash value. If they match, the data is considered intact.

For cryptographic applications, to prevent reverse engineering such as deducing the original password from the hash value, hash algorithms need higher-level security features.

  • Unidirectionality: It should be impossible to deduce any information about the input data from the hash value.
  • Collision resistance: It should be extremely difficult to find two different inputs that produce the same hash value.
  • Avalanche effect: Minor changes in the input should lead to significant and unpredictable changes in the output.

Note that \"Uniform Distribution\" and \"Collision Resistance\" are two separate concepts. Satisfying uniform distribution does not necessarily mean collision resistance. For example, under random input key, the hash function key % 100 can produce a uniformly distributed output. However, this hash algorithm is too simple, and all key with the same last two digits will have the same output, making it easy to deduce a usable key from the hash value, thereby cracking the password.

"},{"location":"chapter_hashing/hash_algorithm/#632-design-of-hash-algorithms","title":"6.3.2 \u00a0 Design of hash algorithms","text":"

The design of hash algorithms is a complex issue that requires consideration of many factors. However, for some less demanding scenarios, we can also design some simple hash algorithms.

  • Additive hash: Add up the ASCII codes of each character in the input and use the total sum as the hash value.
  • Multiplicative hash: Utilize the non-correlation of multiplication, multiplying each round by a constant, accumulating the ASCII codes of each character into the hash value.
  • XOR hash: Accumulate the hash value by XORing each element of the input data.
  • Rotating hash: Accumulate the ASCII code of each character into a hash value, performing a rotation operation on the hash value before each accumulation.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
Code Visualization

Full Screen >

It is observed that the last step of each hash algorithm is to take the modulus of the large prime number \\(1000000007\\) to ensure that the hash value is within an appropriate range. It is worth pondering why emphasis is placed on modulo a prime number, or what are the disadvantages of modulo a composite number? This is an interesting question.

To conclude: Using a large prime number as the modulus can maximize the uniform distribution of hash values. Since a prime number does not share common factors with other numbers, it can reduce the periodic patterns caused by the modulo operation, thus avoiding hash collisions.

For example, suppose we choose the composite number \\(9\\) as the modulus, which can be divided by \\(3\\), then all key divisible by \\(3\\) will be mapped to hash values \\(0\\), \\(3\\), \\(6\\).

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

If the input key happens to have this kind of arithmetic sequence distribution, then the hash values will cluster, thereby exacerbating hash collisions. Now, suppose we replace modulus with the prime number \\(13\\), since there are no common factors between key and modulus, the uniformity of the output hash values will be significantly improved.

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

It is worth noting that if the key is guaranteed to be randomly and uniformly distributed, then choosing a prime number or a composite number as the modulus can both produce uniformly distributed hash values. However, when the distribution of key has some periodicity, modulo a composite number is more likely to result in clustering.

In summary, we usually choose a prime number as the modulus, and this prime number should be large enough to eliminate periodic patterns as much as possible, enhancing the robustness of the hash algorithm.

"},{"location":"chapter_hashing/hash_algorithm/#633-common-hash-algorithms","title":"6.3.3 \u00a0 Common hash algorithms","text":"

It is not hard to see that the simple hash algorithms mentioned above are quite \"fragile\" and far from reaching the design goals of hash algorithms. For example, since addition and XOR obey the commutative law, additive hash and XOR hash cannot distinguish strings with the same content but in different order, which may exacerbate hash collisions and cause security issues.

In practice, we usually use some standard hash algorithms, such as MD5, SHA-1, SHA-2, and SHA-3. They can map input data of any length to a fixed-length hash value.

Over the past century, hash algorithms have been in a continuous process of upgrading and optimization. Some researchers strive to improve the performance of hash algorithms, while others, including hackers, are dedicated to finding security issues in hash algorithms. The Table 6-2 shows hash algorithms commonly used in practical applications.

  • MD5 and SHA-1 have been successfully attacked multiple times and are thus abandoned in various security applications.
  • SHA-2 series, especially SHA-256, is one of the most secure hash algorithms to date, with no successful attacks reported, hence commonly used in various security applications and protocols.
  • SHA-3 has lower implementation costs and higher computational efficiency compared to SHA-2, but its current usage coverage is not as extensive as the SHA-2 series.

Table 6-2 \u00a0 Common hash algorithms

MD5 SHA-1 SHA-2 SHA-3 Release Year 1992 1995 2002 2008 Output Length 128 bit 160 bit 256/512 bit 224/256/384/512 bit Hash Collisions Frequent Frequent Rare Rare Security Level Low, has been successfully attacked Low, has been successfully attacked High High Applications Abandoned, still used for data integrity checks Abandoned Cryptocurrency transaction verification, digital signatures, etc. Can be used to replace SHA-2"},{"location":"chapter_hashing/hash_algorithm/#hash-values-in-data-structures","title":"Hash values in data structures","text":"

We know that the keys in a hash table can be of various data types such as integers, decimals, or strings. Programming languages usually provide built-in hash algorithms for these data types to calculate the bucket indices in the hash table. Taking Python as an example, we can use the hash() function to compute the hash values for various data types.

  • The hash values of integers and booleans are their own values.
  • The calculation of hash values for floating-point numbers and strings is more complex, and interested readers are encouraged to study this on their own.
  • The hash value of a tuple is a combination of the hash values of each of its elements, resulting in a single hash value.
  • The hash value of an object is generated based on its memory address. By overriding the hash method of an object, hash values can be generated based on content.

Tip

Be aware that the definition and methods of the built-in hash value calculation functions in different programming languages vary.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# Hash value of integer 3 is 3\n\nbol = True\nhash_bol = hash(bol)\n# Hash value of boolean True is 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# Hash value of decimal 3.14159 is 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# Hash value of string \"Hello \u7b97\u6cd5\" is 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# Hash value of tuple (12836, '\u5c0f\u54c8') is 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# Hash value of ListNode object at 0x1058fd810 is 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// Hash value of integer 3 is 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// Hash value of boolean 1 is 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// Hash value of decimal 3.14159 is 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// Hash value of string \"Hello \u7b97\u6cd5\" is 15466937326284535026\n\n// In C++, built-in std::hash() only provides hash values for basic data types\n// Hash values for arrays and objects need to be implemented separately\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// Hash value of integer 3 is 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// Hash value of decimal 3.14159 is -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// Hash value of array [12836, \u5c0f\u54c8] is 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// Hash value of ListNode object utils.ListNode@7dc5e7b4 is 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// Hash value of integer 3 is 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// Hash value of boolean true is 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// Hash value of decimal 3.14159 is -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// Hash value of array [12836, \u5c0f\u54c8] is 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// Hash value of ListNode object 0 is 39053774;\n
built_in_hash.go
// Go does not provide built-in hash code functions\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// Hash value of integer 3 is 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// Hash value of boolean true is -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// Hash value of decimal 3.14159 is -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// Hash value of string \"Hello \u7b97\u6cd5\" is -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// Hash value of array [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] is -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// Hash value of ListNode object utils.ListNode is -2434780518035996159\n
built_in_hash.js
// JavaScript does not provide built-in hash code functions\n
built_in_hash.ts
// TypeScript does not provide built-in hash code functions\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// Hash value of integer 3 is 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// Hash value of decimal 3.14159 is 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// Hash value of string \"Hello \u7b97\u6cd5\" is 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// Hash value of array [12836, \u5c0f\u54c8] is 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// Hash value of ListNode object Instance of 'ListNode' is 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// Hash value of integer 3 is 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// Hash value of boolean true is 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// Hash value of decimal 3.14159 is 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// Hash value of string \"Hello \u7b97\u6cd5\" is 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// Hash value of tuple (12836, \"\u5c0f\u54c8\") is 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// Hash value of ListNode object RefCell { value: ListNode { val: 42, next: None } } is 15387811073369036852\n
built_in_hash.c
// C does not provide built-in hash code functions\n
built_in_hash.kt
\n
built_in_hash.zig
\n
Code Visualization

Full Screen >

In many programming languages, only immutable objects can serve as the key in a hash table. If we use a list (dynamic array) as a key, when the contents of the list change, its hash value also changes, and we would no longer be able to find the original value in the hash table.

Although the member variables of a custom object (such as a linked list node) are mutable, it is hashable. This is because the hash value of an object is usually generated based on its memory address, and even if the contents of the object change, the memory address remains the same, so the hash value remains unchanged.

You might have noticed that the hash values output in different consoles are different. This is because the Python interpreter adds a random salt to the string hash function each time it starts up. This approach effectively prevents HashDoS attacks and enhances the security of the hash algorithm.

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 Hash collision","text":"

As mentioned in the previous section, usually the input space of a hash function is much larger than its output space, making hash collisions theoretically inevitable. For example, if the input space consists of all integers and the output space is the size of the array capacity, multiple integers will inevitably map to the same bucket index.

Hash collisions can lead to incorrect query results, severely affecting the usability of hash tables. To solve this problem, we expand the hash table whenever a hash collision occurs, until the collision is resolved. This method is simple and effective but inefficient due to the extensive data transfer and hash value computation involved in resizing the hash table. To improve efficiency, we can adopt the following strategies:

  1. Improve the data structure of the hash table, allowing it to function normally in the event of a hash collision.
  2. Only perform resizing when necessary, i.e., when hash collisions are severe.

There are mainly two methods for improving the structure of hash tables: \"Separate Chaining\" and \"Open Addressing\".

"},{"location":"chapter_hashing/hash_collision/#621-separate-chaining","title":"6.2.1 \u00a0 Separate chaining","text":"

In the original hash table, each bucket can store only one key-value pair. \"Separate chaining\" transforms individual elements into a linked list, with key-value pairs as list nodes, storing all colliding key-value pairs in the same list. The Figure 6-5 shows an example of a hash table with separate chaining.

Figure 6-5 \u00a0 Separate chaining hash table

The operations of a hash table implemented with separate chaining have changed as follows:

  • Querying elements: Input key, pass through the hash function to obtain the bucket index, access the head node of the list, then traverse the list and compare key to find the target key-value pair.
  • Adding elements: First access the list head node via the hash function, then add the node (key-value pair) to the list.
  • Deleting elements: Access the list head based on the hash function's result, then traverse the list to find and remove the target node.

Separate chaining has the following limitations:

  • Increased space usage: The linked list contains node pointers, which consume more memory space than arrays.
  • Reduced query efficiency: Due to the need for linear traversal of the list to find the corresponding element.

The code below provides a simple implementation of a separate chaining hash table, with two things to note:

  • Lists (dynamic arrays) are used instead of linked lists for simplicity. In this setup, the hash table (array) contains multiple buckets, each of which is a list.
  • This implementation includes a method for resizing the hash table. When the load factor exceeds \\(\\frac{2}{3}\\), we resize the hash table to twice its original size.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
Code Visualization

Full Screen >

It's worth noting that when the list is very long, the query efficiency \\(O(n)\\) is poor. At this point, the list can be converted to an \"AVL tree\" or \"Red-Black tree\" to optimize the time complexity of the query operation to \\(O(\\log n)\\).

"},{"location":"chapter_hashing/hash_collision/#622-open-addressing","title":"6.2.2 \u00a0 Open addressing","text":"

\"Open addressing\" does not introduce additional data structures but uses \"multiple probes\" to handle hash collisions. The probing methods mainly include linear probing, quadratic probing, and double hashing.

Let's use linear probing as an example to introduce the mechanism of open addressing hash tables.

"},{"location":"chapter_hashing/hash_collision/#1-linear-probing","title":"1. \u00a0 Linear probing","text":"

Linear probing uses a fixed-step linear search for probing, differing from ordinary hash tables.

  • Inserting elements: Calculate the bucket index using the hash function. If the bucket already contains an element, linearly traverse forward from the conflict position (usually with a step size of \\(1\\)) until an empty bucket is found, then insert the element.
  • Searching for elements: If a hash collision is found, use the same step size to linearly traverse forward until the corresponding element is found and return value; if an empty bucket is encountered, it means the target element is not in the hash table, so return None.

The Figure 6-6 shows the distribution of key-value pairs in an open addressing (linear probing) hash table. According to this hash function, keys with the same last two digits will be mapped to the same bucket. Through linear probing, they are stored consecutively in that bucket and the buckets below it.

Figure 6-6 \u00a0 Distribution of key-value pairs in open addressing (linear probing) hash table

However, linear probing tends to create \"clustering\". Specifically, the longer a continuous position in the array is occupied, the more likely these positions are to encounter hash collisions, further promoting the growth of these clusters and eventually leading to deterioration in the efficiency of operations.

It's important to note that we cannot directly delete elements in an open addressing hash table. Deleting an element creates an empty bucket None in the array. When searching for elements, if linear probing encounters this empty bucket, it will return, making the elements below this bucket inaccessible. The program may incorrectly assume these elements do not exist, as shown in the Figure 6-7 .

Figure 6-7 \u00a0 Query issues caused by deletion in open addressing

To solve this problem, we can use a \"lazy deletion\" mechanism: instead of directly removing elements from the hash table, use a constant TOMBSTONE to mark the bucket. In this mechanism, both None and TOMBSTONE represent empty buckets and can hold key-value pairs. However, when linear probing encounters TOMBSTONE, it should continue traversing since there may still be key-value pairs below it.

However, lazy deletion may accelerate the degradation of hash table performance. Every deletion operation produces a delete mark, and as TOMBSTONE increases, so does the search time, as linear probing may have to skip multiple TOMBSTONE to find the target element.

Therefore, consider recording the index of the first TOMBSTONE encountered during linear probing and swapping the target element found with this TOMBSTONE. The advantage of this is that each time a query or addition is performed, the element is moved to a bucket closer to the ideal position (starting point of probing), thereby optimizing the query efficiency.

The code below implements an open addressing (linear probing) hash table with lazy deletion. To make fuller use of the hash table space, we treat the hash table as a \"circular array,\" continuing to traverse from the beginning when the end of the array is passed.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2-quadratic-probing","title":"2. \u00a0 Quadratic probing","text":"

Quadratic probing is similar to linear probing and is one of the common strategies of open addressing. When a collision occurs, quadratic probing does not simply skip a fixed number of steps but skips \"the square of the number of probes,\" i.e., \\(1, 4, 9, \\dots\\) steps.

Quadratic probing has the following advantages:

  • Quadratic probing attempts to alleviate the clustering effect of linear probing by skipping the distance of the square of the number of probes.
  • Quadratic probing skips larger distances to find empty positions, helping to distribute data more evenly.

However, quadratic probing is not perfect:

  • Clustering still exists, i.e., some positions are more likely to be occupied than others.
  • Due to the growth of squares, quadratic probing may not probe the entire hash table, meaning it might not access empty buckets even if they exist in the hash table.
"},{"location":"chapter_hashing/hash_collision/#3-double-hashing","title":"3. \u00a0 Double hashing","text":"

As the name suggests, the double hashing method uses multiple hash functions \\(f_1(x)\\), \\(f_2(x)\\), \\(f_3(x)\\), \\(\\dots\\) for probing.

  • Inserting elements: If hash function \\(f_1(x)\\) encounters a conflict, try \\(f_2(x)\\), and so on, until an empty position is found and the element is inserted.
  • Searching for elements: Search in the same order of hash functions until the target element is found and returned; if an empty position is encountered or all hash functions have been tried, it indicates the element is not in the hash table, then return None.

Compared to linear probing, double hashing is less prone to clustering but involves additional computation for multiple hash functions.

Tip

Please note that open addressing (linear probing, quadratic probing, and double hashing) hash tables all have the issue of \"not being able to directly delete elements.\"

"},{"location":"chapter_hashing/hash_collision/#623-choice-of-programming-languages","title":"6.2.3 \u00a0 Choice of programming languages","text":"

Various programming languages have adopted different hash table implementation strategies, here are a few examples:

  • Python uses open addressing. The dict dictionary uses pseudo-random numbers for probing.
  • Java uses separate chaining. Since JDK 1.8, when the array length in HashMap reaches 64 and the length of a linked list reaches 8, the linked list is converted to a red-black tree to improve search performance.
  • Go uses separate chaining. Go stipulates that each bucket can store up to 8 key-value pairs, and if the capacity is exceeded, an overflow bucket is connected; when there are too many overflow buckets, a special equal-size expansion operation is performed to ensure performance.
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 Hash table","text":"

A \"hash table\", also known as a \"hash map\", achieves efficient element querying by establishing a mapping between keys and values. Specifically, when we input a key into the hash table, we can retrieve the corresponding value in \\(O(1)\\) time.

As shown in the Figure 6-1 , given \\(n\\) students, each with two pieces of data: \"name\" and \"student number\". If we want to implement a query feature that returns the corresponding name when given a student number, we can use the hash table shown in the Figure 6-1 .

Figure 6-1 \u00a0 Abstract representation of a hash table

Apart from hash tables, arrays and linked lists can also be used to implement querying functions. Their efficiency is compared in the Table 6-1 .

  • Adding elements: Simply add the element to the end of the array (or linked list), using \\(O(1)\\) time.
  • Querying elements: Since the array (or linked list) is unordered, it requires traversing all the elements, using \\(O(n)\\) time.
  • Deleting elements: First, locate the element, then delete it from the array (or linked list), using \\(O(n)\\) time.

Table 6-1 \u00a0 Comparison of element query efficiency

Array Linked List Hash Table Find Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) Add Element \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Delete Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

Observations reveal that the time complexity for adding, deleting, and querying in a hash table is \\(O(1)\\), which is highly efficient.

"},{"location":"chapter_hashing/hash_map/#611-common-operations-of-hash-table","title":"6.1.1 \u00a0 Common operations of hash table","text":"

Common operations of a hash table include initialization, querying, adding key-value pairs, and deleting key-value pairs, etc. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
# Initialize hash table\nhmap: dict = {}\n\n# Add operation\n# Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n# Query operation\n# Input key into hash table, get value\nname: str = hmap[15937]\n\n# Delete operation\n# Delete key-value pair (key, value) from hash table\nhmap.pop(10583)\n
hash_map.cpp
/* Initialize hash table */\nunordered_map<int, string> map;\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.erase(10583);\n
hash_map.java
/* Initialize hash table */\nMap<Integer, String> map = new HashMap<>();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.put(12836, \"Xiao Ha\");   \nmap.put(15937, \"Xiao Luo\");   \nmap.put(16750, \"Xiao Suan\");   \nmap.put(13276, \"Xiao Fa\");\nmap.put(10583, \"Xiao Ya\");\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
hash_map.cs
/* Initialize hash table */\nDictionary<int, string> map = new() {\n    /* Add operation */\n    // Add key-value pair (key, value) to the hash table\n    { 12836, \"Xiao Ha\" },\n    { 15937, \"Xiao Luo\" },\n    { 16750, \"Xiao Suan\" },\n    { 13276, \"Xiao Fa\" },\n    { 10583, \"Xiao Ya\" }\n};\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.Remove(10583);\n
hash_map_test.go
/* Initialize hash table */\nhmap := make(map[int]string)\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nname := hmap[15937]\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\ndelete(hmap, 10583)\n
hash_map.swift
/* Initialize hash table */\nvar map: [Int: String] = [:]\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\"\nmap[15937] = \"Xiao Luo\"\nmap[16750] = \"Xiao Suan\"\nmap[13276] = \"Xiao Fa\"\nmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map[15937]!\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* Initialize hash table */\nconst map = new Map();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\n
hash_map.ts
/* Initialize hash table */\nconst map = new Map<number, string>();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\nconsole.info('\\nAfter adding, the hash table is\\nKey -> Value');\nconsole.info(map);\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\nconsole.info('\\nInput student number 15937, query name ' + name);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\nconsole.info('\\nAfter deleting 10583, the hash table is\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* Initialize hash table */\nMap<int, String> map = {};\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* Initialize hash table */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.insert(12836, \"Xiao Ha\".to_string());\nmap.insert(15937, \"Xiao Luo\".to_string());\nmap.insert(16750, \"Xiao Suan\".to_string());\nmap.insert(13279, \"Xiao Fa\".to_string());\nmap.insert(10583, \"Xiao Ya\".to_string());\n\n/* Query operation */\n// Input key into hash table, get value\nlet _name: Option<&String> = map.get(&15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C does not provide a built-in hash table\n
hash_map.kt
\n
hash_map.zig
\n
Code Visualization

Full Screen >

There are three common ways to traverse a hash table: traversing key-value pairs, keys, and values. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
# Traverse hash table\n# Traverse key-value pairs key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# Traverse keys only\nfor key in hmap.keys():\n    print(key)\n# Traverse values only\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// Traverse using iterator key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (Map.Entry<Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// Traverse keys only\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// Traverse values only\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// Traverse keys only\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// Traverse values only\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// Traverse keys only\nfor key := range hmap {\n    fmt.Println(key)\n}\n// Traverse values only\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// Traverse keys only\nfor key in map.keys {\n    print(key)\n}\n// Traverse values only\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nmap.forEach((key, value) {\nprint('$key -> $value');\n});\n\n// Traverse keys only Key\nmap.keys.forEach((key) {\nprint(key);\n});\n\n// Traverse values only Value\nmap.values.forEach((value) {\nprint(value);\n});\n
hash_map.rs
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// Traverse keys only Key\nfor key in map.keys() {\n    println!(\"{key}\"); \n}\n\n// Traverse values only Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C does not provide a built-in hash table\n
hash_map.kt
\n
hash_map.zig
// Zig example is not provided\n
Code Visualization

Full Screen >

"},{"location":"chapter_hashing/hash_map/#612-simple-implementation-of-hash-table","title":"6.1.2 \u00a0 Simple implementation of hash table","text":"

First, let's consider the simplest case: implementing a hash table using just an array. In the hash table, each empty slot in the array is called a \"bucket\", and each bucket can store one key-value pair. Therefore, the query operation involves finding the bucket corresponding to the key and retrieving the value from it.

So, how do we locate the appropriate bucket based on the key? This is achieved through a \"hash function\". The role of the hash function is to map a larger input space to a smaller output space. In a hash table, the input space is all possible keys, and the output space is all buckets (array indices). In other words, input a key, and we can use the hash function to determine the storage location of the corresponding key-value pair in the array.

The calculation process of the hash function for a given key is divided into the following two steps:

  1. Calculate the hash value using a certain hash algorithm hash().
  2. Take the modulus of the hash value with the number of buckets (array length) capacity to obtain the array index index.
index = hash(key) % capacity\n

Afterward, we can use index to access the corresponding bucket in the hash table and thereby retrieve the value.

Assuming array length capacity = 100 and hash algorithm hash(key) = key, the hash function is key % 100. The Figure 6-2 uses key as the student number and value as the name to demonstrate the working principle of the hash function.

Figure 6-2 \u00a0 Working principle of hash function

The following code implements a simple hash table. Here, we encapsulate key and value into a class Pair to represent the key-value pair.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_hashing/hash_map/#613-hash-collision-and-resizing","title":"6.1.3 \u00a0 Hash collision and resizing","text":"

Fundamentally, the role of the hash function is to map the entire input space of all keys to the output space of all array indices. However, the input space is often much larger than the output space. Therefore, theoretically, there must be situations where \"multiple inputs correspond to the same output\".

For the hash function in the above example, if the last two digits of the input key are the same, the output of the hash function will also be the same. For example, when querying for students with student numbers 12836 and 20336, we find:

12836 % 100 = 36\n20336 % 100 = 36\n

As shown in the Figure 6-3 , both student numbers point to the same name, which is obviously incorrect. This situation where multiple inputs correspond to the same output is known as \"hash collision\".

Figure 6-3 \u00a0 Example of hash collision

It is easy to understand that the larger the capacity \\(n\\) of the hash table, the lower the probability of multiple keys being allocated to the same bucket, and the fewer the collisions. Therefore, expanding the capacity of the hash table can reduce hash collisions.

As shown in the Figure 6-4 , before expansion, key-value pairs (136, A) and (236, D) collided; after expansion, the collision is resolved.

Figure 6-4 \u00a0 Hash table expansion

Similar to array expansion, resizing a hash table requires migrating all key-value pairs from the original hash table to the new one, which is time-consuming. Furthermore, since the capacity capacity of the hash table changes, we need to recalculate the storage positions of all key-value pairs using the hash function, which adds to the computational overhead of the resizing process. Therefore, programming languages often reserve a sufficiently large capacity for the hash table to prevent frequent resizing.

The \"load factor\" is an important concept for hash tables. It is defined as the ratio of the number of elements in the hash table to the number of buckets. It is used to measure the severity of hash collisions and is often used as a trigger for resizing the hash table. For example, in Java, when the load factor exceeds \\(0.75\\), the system will resize the hash table to twice its original size.

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 Summary","text":""},{"location":"chapter_hashing/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Given an input key, a hash table can retrieve the corresponding value in \\(O(1)\\) time, which is highly efficient.
  • Common hash table operations include querying, adding key-value pairs, deleting key-value pairs, and traversing the hash table.
  • The hash function maps a key to an array index, allowing access to the corresponding bucket and retrieval of the value.
  • Two different keys may end up with the same array index after hashing, leading to erroneous query results. This phenomenon is known as hash collision.
  • The larger the capacity of the hash table, the lower the probability of hash collisions. Therefore, hash table resizing can mitigate hash collisions. Similar to array resizing, hash table resizing is costly.
  • The load factor, defined as the number of elements divided by the number of buckets, reflects the severity of hash collisions and is often used as a condition to trigger hash table resizing.
  • Chaining addresses hash collisions by converting each element into a linked list, storing all colliding elements in the same list. However, excessively long lists can reduce query efficiency, which can be improved by converting the lists into red-black trees.
  • Open addressing handles hash collisions through multiple probes. Linear probing uses a fixed step size but it cannot delete elements and is prone to clustering. Multiple hashing uses several hash functions for probing which reduces clustering compared to linear probing but increases computational overhead.
  • Different programming languages adopt various hash table implementations. For example, Java's HashMap uses chaining, while Python's dict employs open addressing.
  • In hash tables, we desire hash algorithms with determinism, high efficiency, and uniform distribution. In cryptography, hash algorithms should also possess collision resistance and the avalanche effect.
  • Hash algorithms typically use large prime numbers as moduli to ensure uniform distribution of hash values and reduce hash collisions.
  • Common hash algorithms include MD5, SHA-1, SHA-2, and SHA-3. MD5 is often used for file integrity checks, while SHA-2 is commonly used in secure applications and protocols.
  • Programming languages usually provide built-in hash algorithms for data types to calculate bucket indices in hash tables. Generally, only immutable objects are hashable.
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: When does the time complexity of a hash table degrade to \\(O(n)\\)?

The time complexity of a hash table can degrade to \\(O(n)\\) when hash collisions are severe. When the hash function is well-designed, the capacity is set appropriately, and collisions are evenly distributed, the time complexity is \\(O(1)\\). We usually consider the time complexity to be \\(O(1)\\) when using built-in hash tables in programming languages.

Q: Why not use the hash function \\(f(x) = x\\)? This would eliminate collisions.

Under the hash function \\(f(x) = x\\), each element corresponds to a unique bucket index, which is equivalent to an array. However, the input space is usually much larger than the output space (array length), so the last step of a hash function is often to take the modulo of the array length. In other words, the goal of a hash table is to map a larger state space to a smaller one while providing \\(O(1)\\) query efficiency.

Q: Why can hash tables be more efficient than arrays, linked lists, or binary trees, even though hash tables are implemented using these structures?

Firstly, hash tables have higher time efficiency but lower space efficiency. A significant portion of memory in hash tables remains unused.

Secondly, hash tables are only more time-efficient in specific use cases. If a feature can be implemented with the same time complexity using an array or a linked list, it's usually faster than using a hash table. This is because the computation of the hash function incurs overhead, making the constant factor in the time complexity larger.

Lastly, the time complexity of hash tables can degrade. For example, in chaining, we perform search operations in a linked list or red-black tree, which still risks degrading to \\(O(n)\\) time.

Q: Does multiple hashing also have the flaw of not being able to delete elements directly? Can space marked as deleted be reused?

Multiple hashing is a form of open addressing, and all open addressing methods have the drawback of not being able to delete elements directly; they require marking elements as deleted. Marked spaces can be reused. When inserting new elements into the hash table, and the hash function points to a position marked as deleted, that position can be used by the new element. This maintains the probing sequence of the hash table while ensuring efficient use of space.

Q: Why do hash collisions occur during the search process in linear probing?

During the search process, the hash function points to the corresponding bucket and key-value pair. If the key doesn't match, it indicates a hash collision. Therefore, linear probing will search downwards at a predetermined step size until the correct key-value pair is found or the search fails.

Q: Why can resizing a hash table alleviate hash collisions?

The last step of a hash function often involves taking the modulo of the array length \\(n\\), to keep the output within the array index range. When resizing, the array length \\(n\\) changes, and the indices corresponding to the keys may also change. Keys that were previously mapped to the same bucket might be distributed across multiple buckets after resizing, thereby mitigating hash collisions.

"},{"location":"chapter_heap/","title":"Chapter 8. \u00a0 Heap","text":"

Abstract

The heap is like mountain peaks, stacked and undulating, each with its unique shape.

Among these peaks, the highest one always catches the eye first.

"},{"location":"chapter_heap/#chapter-contents","title":"Chapter contents","text":"
  • 8.1 \u00a0 Heap
  • 8.2 \u00a0 Building a heap
  • 8.3 \u00a0 Top-k problem
  • 8.4 \u00a0 Summary
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 Heap construction operation","text":"

In some cases, we want to build a heap using all elements of a list, and this process is known as \"heap construction operation.\"

"},{"location":"chapter_heap/build_heap/#821-implementing-with-heap-insertion-operation","title":"8.2.1 \u00a0 Implementing with heap insertion operation","text":"

First, we create an empty heap and then iterate through the list, performing the \"heap insertion operation\" on each element in turn. This means adding the element to the end of the heap and then \"heapifying\" it from bottom to top.

Each time an element is added to the heap, the length of the heap increases by one. Since nodes are added to the binary tree from top to bottom, the heap is constructed \"from top to bottom.\"

Let the number of elements be \\(n\\), and each element's insertion operation takes \\(O(\\log{n})\\) time, thus the time complexity of this heap construction method is \\(O(n \\log n)\\).

"},{"location":"chapter_heap/build_heap/#822-implementing-by-heapifying-through-traversal","title":"8.2.2 \u00a0 Implementing by heapifying through traversal","text":"

In fact, we can implement a more efficient method of heap construction in two steps.

  1. Add all elements of the list as they are into the heap, at this point the properties of the heap are not yet satisfied.
  2. Traverse the heap in reverse order (reverse of level-order traversal), and perform \"top to bottom heapify\" on each non-leaf node.

After heapifying a node, the subtree with that node as the root becomes a valid sub-heap. Since the traversal is in reverse order, the heap is built \"from bottom to top.\"

The reason for choosing reverse traversal is that it ensures the subtree below the current node is already a valid sub-heap, making the heapification of the current node effective.

It's worth mentioning that since leaf nodes have no children, they naturally form valid sub-heaps and do not need to be heapified. As shown in the following code, the last non-leaf node is the parent of the last node; we start from it and traverse in reverse order to perform heapification:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/build_heap/#823-complexity-analysis","title":"8.2.3 \u00a0 Complexity analysis","text":"

Next, let's attempt to calculate the time complexity of this second method of heap construction.

  • Assuming the number of nodes in the complete binary tree is \\(n\\), then the number of leaf nodes is \\((n + 1) / 2\\), where \\(/\\) is integer division. Therefore, the number of nodes that need to be heapified is \\((n - 1) / 2\\).
  • In the process of \"top to bottom heapification,\" each node is heapified to the leaf nodes at most, so the maximum number of iterations is the height of the binary tree \\(\\log n\\).

Multiplying the two, we get the time complexity of the heap construction process as \\(O(n \\log n)\\). But this estimate is not accurate, because it does not take into account the nature of the binary tree having far more nodes at the lower levels than at the top.

Let's perform a more accurate calculation. To simplify the calculation, assume a \"perfect binary tree\" with \\(n\\) nodes and height \\(h\\); this assumption does not affect the correctness of the result.

Figure 8-5 \u00a0 Node counts at each level of a perfect binary tree

As shown in the Figure 8-5 , the maximum number of iterations for a node \"to be heapified from top to bottom\" is equal to the distance from that node to the leaf nodes, which is precisely \"node height.\" Therefore, we can sum the \"number of nodes \\(\\times\\) node height\" at each level, to get the total number of heapification iterations for all nodes.

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

To simplify the above equation, we need to use knowledge of sequences from high school, first multiply \\(T(h)\\) by \\(2\\), to get:

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^h\\times1 \\newline \\end{aligned} \\]

By subtracting \\(T(h)\\) from \\(2T(h)\\) using the method of displacement, we get:

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

Observing the equation, \\(T(h)\\) is an geometric series, which can be directly calculated using the sum formula, resulting in a time complexity of:

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

Further, a perfect binary tree with height \\(h\\) has \\(n = 2^{h+1} - 1\\) nodes, thus the complexity is \\(O(2^h) = O(n)\\). This calculation shows that the time complexity of inputting a list and constructing a heap is \\(O(n)\\), which is very efficient.

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 Heap","text":"

A \"heap\" is a complete binary tree that satisfies specific conditions and can be mainly divided into two types, as shown in the Figure 8-1 .

  • \"Min heap\": The value of any node \\(\\leq\\) the values of its child nodes.
  • \"Max heap\": The value of any node \\(\\geq\\) the values of its child nodes.

Figure 8-1 \u00a0 Min heap and max heap

As a special case of a complete binary tree, heaps have the following characteristics:

  • The bottom layer nodes are filled from left to right, and nodes in other layers are fully filled.
  • The root node of the binary tree is called the \"heap top,\" and the bottom-rightmost node is called the \"heap bottom.\"
  • For max heaps (min heaps), the value of the heap top element (root node) is the largest (smallest).
"},{"location":"chapter_heap/heap/#811-common-operations-on-heaps","title":"8.1.1 \u00a0 Common operations on heaps","text":"

It should be noted that many programming languages provide a \"priority queue,\" which is an abstract data structure defined as a queue with priority sorting.

In fact, heaps are often used to implement priority queues, with max heaps equivalent to priority queues where elements are dequeued in descending order. From a usage perspective, we can consider \"priority queue\" and \"heap\" as equivalent data structures. Therefore, this book does not make a special distinction between the two, uniformly referring to them as \"heap.\"

Common operations on heaps are shown in the Table 8-1 , and the method names depend on the programming language.

Table 8-1 \u00a0 Efficiency of Heap Operations

Method name Description Time complexity push() Add an element to the heap \\(O(\\log n)\\) pop() Remove the top element from the heap \\(O(\\log n)\\) peek() Access the top element (for max/min heap, the max/min value) \\(O(1)\\) size() Get the number of elements in the heap \\(O(1)\\) isEmpty() Check if the heap is empty \\(O(1)\\)

In practice, we can directly use the heap class (or priority queue class) provided by programming languages.

Similar to sorting algorithms where we have \"ascending order\" and \"descending order,\" we can switch between \"min heap\" and \"max heap\" by setting a flag or modifying the Comparator. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.kt
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20min_heap,%20flag%20%3D%20%5B%5D,%201%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20max_heap,%20flag%20%3D%20%5B%5D,%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20Python%20%E7%9A%84%20heapq%20%E6%A8%A1%E5%9D%97%E9%BB%98%E8%AE%A4%E5%AE%9E%E7%8E%B0%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E8%80%83%E8%99%91%E5%B0%86%E2%80%9C%E5%85%83%E7%B4%A0%E5%8F%96%E8%B4%9F%E2%80%9D%E5%90%8E%E5%86%8D%E5%85%A5%E5%A0%86%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%A4%A7%E5%B0%8F%E5%85%B3%E7%B3%BB%E9%A2%A0%E5%80%92%EF%BC%8C%E4%BB%8E%E8%80%8C%E5%AE%9E%E7%8E%B0%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E5%9C%A8%E6%9C%AC%E7%A4%BA%E4%BE%8B%E4%B8%AD%EF%BC%8Cflag%20%3D%201%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%B0%8F%E9%A1%B6%E5%A0%86%EF%BC%8Cflag%20%3D%20-1%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E5%A0%86%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%201%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%203%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%202%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%205%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%0A%20%20%20%20peek%20%3D%20flag%20*%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%E5%87%BA%E5%A0%86%0A%20%20%20%20%23%20%E5%87%BA%E5%A0%86%E5%85%83%E7%B4%A0%E4%BC%9A%E5%BD%A2%E6%88%90%E4%B8%80%E4%B8%AA%E4%BB%8E%E5%A4%A7%E5%88%B0%E5%B0%8F%E7%9A%84%E5%BA%8F%E5%88%97%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E5%A4%A7%E5%B0%8F%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%A0%86%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%BE%93%E5%85%A5%E5%88%97%E8%A1%A8%E5%B9%B6%E5%BB%BA%E5%A0%86%0A%20%20%20%20min_heap%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_heap/heap/#812-implementation-of-heaps","title":"8.1.2 \u00a0 Implementation of heaps","text":"

The following implementation is of a max heap. To convert it into a min heap, simply invert all size logic comparisons (for example, replace \\(\\geq\\) with \\(\\leq\\)). Interested readers are encouraged to implement it on their own.

"},{"location":"chapter_heap/heap/#1-storage-and-representation-of-heaps","title":"1. \u00a0 Storage and representation of heaps","text":"

As mentioned in the \"Binary Trees\" section, complete binary trees are well-suited for array representation. Since heaps are a type of complete binary tree, we will use arrays to store heaps.

When using an array to represent a binary tree, elements represent node values, and indexes represent node positions in the binary tree. Node pointers are implemented through an index mapping formula.

As shown in the Figure 8-2 , given an index \\(i\\), the index of its left child is \\(2i + 1\\), the index of its right child is \\(2i + 2\\), and the index of its parent is \\((i - 1) / 2\\) (floor division). When the index is out of bounds, it signifies a null node or the node does not exist.

Figure 8-2 \u00a0 Representation and storage of heaps

We can encapsulate the index mapping formula into functions for convenient later use:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2-accessing-the-top-element-of-the-heap","title":"2. \u00a0 Accessing the top element of the heap","text":"

The top element of the heap is the root node of the binary tree, which is also the first element of the list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#3-inserting-an-element-into-the-heap","title":"3. \u00a0 Inserting an element into the heap","text":"

Given an element val, we first add it to the bottom of the heap. After addition, since val may be larger than other elements in the heap, the heap's integrity might be compromised, thus it's necessary to repair the path from the inserted node to the root node. This operation is called \"heapifying\".

Considering starting from the node inserted, perform heapify from bottom to top. As shown in the Figure 8-3 , we compare the value of the inserted node with its parent node, and if the inserted node is larger, we swap them. Then continue this operation, repairing each node in the heap from bottom to top until passing the root node or encountering a node that does not need to be swapped.

<1><2><3><4><5><6><7><8><9>

Figure 8-3 \u00a0 Steps of element insertion into the heap

Given a total of \\(n\\) nodes, the height of the tree is \\(O(\\log n)\\). Hence, the loop iterations for the heapify operation are at most \\(O(\\log n)\\), making the time complexity of the element insertion operation \\(O(\\log n)\\). The code is as shown:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#4-removing-the-top-element-from-the-heap","title":"4. \u00a0 Removing the top element from the heap","text":"

The top element of the heap is the root node of the binary tree, that is, the first element of the list. If we directly remove the first element from the list, all node indexes in the binary tree would change, making it difficult to use heapify for repairs subsequently. To minimize changes in element indexes, we use the following steps.

  1. Swap the top element with the bottom element of the heap (swap the root node with the rightmost leaf node).
  2. After swapping, remove the bottom of the heap from the list (note, since it has been swapped, what is actually being removed is the original top element).
  3. Starting from the root node, perform heapify from top to bottom.

As shown in the Figure 8-4 , the direction of \"heapify from top to bottom\" is opposite to \"heapify from bottom to top\". We compare the value of the root node with its two children and swap it with the largest child. Then repeat this operation until passing the leaf node or encountering a node that does not need to be swapped.

<1><2><3><4><5><6><7><8><9><10>

Figure 8-4 \u00a0 Steps of removing the top element from the heap

Similar to the element insertion operation, the time complexity of the top element removal operation is also \\(O(\\log n)\\). The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#813-common-applications-of-heaps","title":"8.1.3 \u00a0 Common applications of heaps","text":"
  • Priority Queue: Heaps are often the preferred data structure for implementing priority queues, with both enqueue and dequeue operations having a time complexity of \\(O(\\log n)\\), and building a queue having a time complexity of \\(O(n)\\), all of which are very efficient.
  • Heap Sort: Given a set of data, we can create a heap from them and then continually perform element removal operations to obtain ordered data. However, we usually use a more elegant method to implement heap sort, as detailed in the \"Heap Sort\" section.
  • Finding the Largest \\(k\\) Elements: This is a classic algorithm problem and also a typical application, such as selecting the top 10 hot news for Weibo hot search, picking the top 10 selling products, etc.
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 Summary","text":""},{"location":"chapter_heap/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A heap is a complete binary tree, which can be divided into a max heap and a min heap based on its property. The top element of a max (min) heap is the largest (smallest).
  • A priority queue is defined as a queue with dequeue priority, usually implemented using a heap.
  • Common operations of a heap and their corresponding time complexities include: element insertion into the heap \\(O(\\log n)\\), removing the top element from the heap \\(O(\\log n)\\), and accessing the top element of the heap \\(O(1)\\).
  • A complete binary tree is well-suited to be represented by an array, thus heaps are commonly stored using arrays.
  • Heapify operations are used to maintain the properties of the heap and are used in both heap insertion and removal operations.
  • The time complexity of inserting \\(n\\) elements into a heap and building the heap can be optimized to \\(O(n)\\), which is highly efficient.
  • Top-k is a classic algorithm problem that can be efficiently solved using the heap data structure, with a time complexity of \\(O(n \\log k)\\).
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the \"heap\" in data structures the same concept as the \"heap\" in memory management?

The two are not the same concept, even though they are both referred to as \"heap\". The heap in computer system memory is part of dynamic memory allocation, where the program can use it to store data during execution. The program can request a certain amount of heap memory to store complex structures like objects and arrays. When these data are no longer needed, the program needs to release this memory to prevent memory leaks. Compared to stack memory, the management and usage of heap memory need to be more cautious, as improper use may lead to memory leaks and dangling pointers.

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k problem","text":"

Question

Given an unordered array nums of length \\(n\\), return the largest \\(k\\) elements in the array.

For this problem, we will first introduce two straightforward solutions, then explain a more efficient heap-based method.

"},{"location":"chapter_heap/top_k/#831-method-1-iterative-selection","title":"8.3.1 \u00a0 Method 1: Iterative selection","text":"

We can perform \\(k\\) rounds of iterations as shown in the Figure 8-6 , extracting the \\(1^{st}\\), \\(2^{nd}\\), \\(\\dots\\), \\(k^{th}\\) largest elements in each round, with a time complexity of \\(O(nk)\\).

This method is only suitable when \\(k \\ll n\\), as the time complexity approaches \\(O(n^2)\\) when \\(k\\) is close to \\(n\\), which is very time-consuming.

Figure 8-6 \u00a0 Iteratively finding the largest k elements

Tip

When \\(k = n\\), we can obtain a complete ordered sequence, which is equivalent to the \"selection sort\" algorithm.

"},{"location":"chapter_heap/top_k/#832-method-2-sorting","title":"8.3.2 \u00a0 Method 2: Sorting","text":"

As shown in the Figure 8-7 , we can first sort the array nums and then return the last \\(k\\) elements, with a time complexity of \\(O(n \\log n)\\).

Clearly, this method \"overachieves\" the task, as we only need to find the largest \\(k\\) elements, without the need to sort the other elements.

Figure 8-7 \u00a0 Sorting to find the largest k elements

"},{"location":"chapter_heap/top_k/#833-method-3-heap","title":"8.3.3 \u00a0 Method 3: Heap","text":"

We can solve the Top-k problem more efficiently based on heaps, as shown in the following process.

  1. Initialize a min heap, where the top element is the smallest.
  2. First, insert the first \\(k\\) elements of the array into the heap.
  3. Starting from the \\(k + 1^{th}\\) element, if the current element is greater than the top element of the heap, remove the top element of the heap and insert the current element into the heap.
  4. After completing the traversal, the heap contains the largest \\(k\\) elements.
<1><2><3><4><5><6><7><8><9>

Figure 8-8 \u00a0 Find the largest k elements based on heap

Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
Code Visualization

Full Screen >

A total of \\(n\\) rounds of heap insertions and deletions are performed, with the maximum heap size being \\(k\\), hence the time complexity is \\(O(n \\log k)\\). This method is very efficient; when \\(k\\) is small, the time complexity tends towards \\(O(n)\\); when \\(k\\) is large, the time complexity will not exceed \\(O(n \\log n)\\).

Additionally, this method is suitable for scenarios with dynamic data streams. By continuously adding data, we can maintain the elements within the heap, thereby achieving dynamic updates of the largest \\(k\\) elements.

"},{"location":"chapter_hello_algo/","title":"Before starting","text":"

A few years ago, I shared the \"Sword for Offer\" problem solutions on LeetCode, receiving encouragement and support from many readers. During interactions with readers, the most common question I encountered was \"how to get started with algorithms.\" Gradually, I developed a keen interest in this question.

Directly solving problems seems to be the most popular method \u2014 it's simple, direct, and effective. However, problem-solving is like playing a game of Minesweeper: those with strong self-study abilities can defuse the mines one by one, but those with insufficient basics might end up metaphorically bruised from explosions, retreating step by step in frustration. Going through textbooks is also common, but for those aiming for job applications, the energy spent on thesis writing, resume submissions, and preparation for written tests and interviews leaves little for tackling thick books, turning it into a daunting challenge.

If you're facing similar troubles, then this book are lucky to have found you. This book is my answer to the question. While it may not be the best solution, it is at least a positive attempt. This book may not directly land you an offer, but it will guide you through the \"knowledge map\" in data structures and algorithms, help you understand the shapes, sizes, and locations of different \"mines,\" and enable you to master various \"demining methods.\" With these skills, I believe you can solve problems and read literature more comfortably, gradually building a knowledge system.

I deeply agree with Professor Feynman's statement: \"Knowledge isn't free. You have to pay attention.\" In this sense, this book is not entirely \"free.\" To not disappoint the precious \"attention\" you pay for this book, I will do my best, dedicating my utmost \"attention\" to this book.

Knowing my limitations, although the content of this book has been refined over time, there are surely many errors remaining. I sincerely request critiques and corrections from all teachers and students.

Hello, Algo!

The advent of computers has brought significant changes to the world. With their high-speed computing power and excellent programmability, they have become the ideal medium for executing algorithms and processing data. Whether it's the realistic graphics of video games, the intelligent decisions in autonomous driving, the brilliant Go games of AlphaGo, or the natural interactions of ChatGPT, these applications are all exquisite demonstrations of algorithms at work on computers.

In fact, before the advent of computers, algorithms and data structures already existed in every corner of the world. Early algorithms were relatively simple, such as ancient counting methods and tool-making procedures. As civilization progressed, algorithms became more refined and complex. From the exquisite craftsmanship of artisans, to industrial products that liberate productive forces, to the scientific laws governing the universe, almost every ordinary or astonishing thing has behind it the ingenious thought of algorithms.

Similarly, data structures are everywhere: from social networks to subway lines, many systems can be modeled as \"graphs\"; from a country to a family, the main forms of social organization exhibit characteristics of \"trees\"; winter clothes are like a \"stack\", where the first item worn is the last to be taken off; a badminton shuttle tube resembles a \"queue\", with one end for insertion and the other for retrieval; a dictionary is like a \"hash table\", enabling quick search for target entries.

This book aims to help readers understand the core concepts of algorithms and data structures through clear, easy-to-understand animated illustrations and runnable code examples, and to be able to implement them through programming. On this basis, this book strives to reveal the vivid manifestations of algorithms in the complex world, showcasing the beauty of algorithms. I hope this book can help you!

"},{"location":"chapter_introduction/","title":"Chapter 1. \u00a0 Encounter with algorithms","text":"

Abstract

A graceful maiden dances, intertwined with the data, her skirt swaying to the melody of algorithms.

She invites you to a dance, follow her steps, and enter the world of algorithms full of logic and beauty.

"},{"location":"chapter_introduction/#chapter-contents","title":"Chapter contents","text":"
  • 1.1 \u00a0 Algorithms are everywhere
  • 1.2 \u00a0 What is an algorithm
  • 1.3 \u00a0 Summary
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 Algorithms are everywhere","text":"

When we hear the word \"algorithm,\" we naturally think of mathematics. However, many algorithms do not involve complex mathematics but rely more on basic logic, which can be seen everywhere in our daily lives.

Before formally discussing algorithms, there's an interesting fact worth sharing: you have already unconsciously learned many algorithms and have become accustomed to applying them in your daily life. Here, I will give a few specific examples to prove this point.

Example 1: Looking Up a Dictionary. In an English dictionary, words are listed alphabetically. Suppose we're searching for a word that starts with the letter \\(r\\). This is typically done in the following way:

  1. Open the dictionary to about halfway and check the first letter on the page, let's say the letter is \\(m\\).
  2. Since \\(r\\) comes after \\(m\\) in the alphabet, we can ignore the first half of the dictionary and focus on the latter half.
  3. Repeat steps 1. and 2. until you find the page where the word starts with \\(r\\).
<1><2><3><4><5>

Figure 1-1 \u00a0 Process of Looking Up a Dictionary

This essential skill for elementary students, looking up a dictionary, is actually the famous \"Binary Search\" algorithm. From a data structure perspective, we can consider the dictionary as a sorted \"array\"; from an algorithmic perspective, the series of actions taken to look up a word in the dictionary can be viewed as \"Binary Search.\"

Example 2: Organizing Playing Cards. When playing cards, we need to arrange the cards in our hand in ascending order, as shown in the following process.

  1. Divide the playing cards into \"ordered\" and \"unordered\" sections, assuming initially the leftmost card is already in order.
  2. Take out a card from the unordered section and insert it into the correct position in the ordered section; after this, the leftmost two cards are in order.
  3. Continue to repeat step 2. until all cards are in order.

Figure 1-2 \u00a0 Playing cards sorting process

The above method of organizing playing cards is essentially the \"Insertion Sort\" algorithm, which is very efficient for small datasets. Many programming languages' sorting functions include the insertion sort.

Example 3: Making Change. Suppose we buy goods worth \\(69\\) yuan at a supermarket and give the cashier \\(100\\) yuan, then the cashier needs to give us \\(31\\) yuan in change. They would naturally complete the thought process as shown below.

  1. The options are currencies smaller than \\(31\\), including \\(1\\), \\(5\\), \\(10\\), and \\(20\\).
  2. Take out the largest \\(20\\) from the options, leaving \\(31 - 20 = 11\\).
  3. Take out the largest \\(10\\) from the remaining options, leaving \\(11 - 10 = 1\\).
  4. Take out the largest \\(1\\) from the remaining options, leaving \\(1 - 1 = 0\\).
  5. Complete the change-making, with the solution being \\(20 + 10 + 1 = 31\\).

Figure 1-3 \u00a0 Change making process

In the above steps, we make the best choice at each step (using the largest denomination possible), ultimately resulting in a feasible change-making plan. From the perspective of data structures and algorithms, this method is essentially a \"Greedy\" algorithm.

From cooking a meal to interstellar travel, almost all problem-solving involves algorithms. The advent of computers allows us to store data structures in memory and write code to call the CPU and GPU to execute algorithms. In this way, we can transfer real-life problems to computers, solving various complex issues more efficiently.

Tip

If concepts such as data structures, algorithms, arrays, and binary search still seem somewhat obsecure, I encourage you to continue reading. This book will gently guide you into the realm of understanding data structures and algorithms.

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 Summary","text":"
  • Algorithms are ubiquitous in daily life and are not as inaccessible and complex as they might seem. In fact, we have already unconsciously learned many algorithms to solve various problems in life.
  • The principle of looking up a word in a dictionary is consistent with the binary search algorithm. The binary search algorithm embodies the important algorithmic concept of divide and conquer.
  • The process of organizing playing cards is very similar to the insertion sort algorithm. The insertion sort algorithm is suitable for sorting small datasets.
  • The steps of making change in currency essentially follow the greedy algorithm, where each step involves making the best possible choice at the moment.
  • An algorithm is a set of instructions or steps used to solve a specific problem within a finite amount of time, while a data structure is the way data is organized and stored in a computer.
  • Data structures and algorithms are closely linked. Data structures are the foundation of algorithms, and algorithms are the stage to utilize the functions of data structures.
  • We can liken data structures and algorithms to building blocks. The blocks represent data, the shape and connection method of the blocks represent data structures, and the steps of assembling the blocks correspond to algorithms.
"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 What is an algorithm","text":""},{"location":"chapter_introduction/what_is_dsa/#121-definition-of-an-algorithm","title":"1.2.1 \u00a0 Definition of an algorithm","text":"

An \"algorithm\" is a set of instructions or steps to solve a specific problem within a finite amount of time. It has the following characteristics:

  • The problem is clearly defined, including unambiguous definitions of input and output.
  • The algorithm is feasible, meaning it can be completed within a finite number of steps, time, and memory space.
  • Each step has a definitive meaning. The output is consistently the same under the same inputs and conditions.
"},{"location":"chapter_introduction/what_is_dsa/#122-definition-of-a-data-structure","title":"1.2.2 \u00a0 Definition of a data structure","text":"

A \"data structure\" is a way of organizing and storing data in a computer, with the following design goals:

  • Minimize space occupancy to save computer memory.
  • Make data operations as fast as possible, covering data access, addition, deletion, updating, etc.
  • Provide concise data representation and logical information to enable efficient algorithm execution.

Designing data structures is a balancing act, often requiring trade-offs. If you want to improve in one aspect, you often need to compromise in another. Here are two examples:

  • Compared to arrays, linked lists offer more convenience in data addition and deletion but sacrifice data access speed.
  • Graphs, compared to linked lists, provide richer logical information but require more memory space.
"},{"location":"chapter_introduction/what_is_dsa/#123-relationship-between-data-structures-and-algorithms","title":"1.2.3 \u00a0 Relationship between data structures and algorithms","text":"

As shown in the Figure 1-4 , data structures and algorithms are highly related and closely integrated, specifically in the following three aspects:

  • Data structures are the foundation of algorithms. They provide structured data storage and methods for manipulating data for algorithms.
  • Algorithms are the stage where data structures come into play. The data structure alone only stores data information; it is through the application of algorithms that specific problems can be solved.
  • Algorithms can often be implemented based on different data structures, but their execution efficiency can vary greatly. Choosing the right data structure is key.

Figure 1-4 \u00a0 Relationship between data structures and algorithms

Data structures and algorithms can be likened to a set of building blocks, as illustrated in the Figure 1-5 . A building block set includes numerous pieces, accompanied by detailed assembly instructions. Following these instructions step by step allows us to construct an intricate block model.

Figure 1-5 \u00a0 Assembling blocks

The detailed correspondence between the two is shown in the Table 1-1 .

Table 1-1 \u00a0 Comparing data structures and algorithms to building blocks

Data Structures and Algorithms Building Blocks Input data Unassembled blocks Data structure Organization of blocks, including shape, size, connections, etc Algorithm A series of steps to assemble the blocks into the desired shape Output data Completed Block model

It's worth noting that data structures and algorithms are independent of programming languages. For this reason, this book is able to provide implementations in multiple programming languages.

Conventional Abbreviation

In real-life discussions, we often refer to \"Data Structures and Algorithms\" simply as \"Algorithms\". For example, the well-known LeetCode algorithm problems actually test both data structure and algorithm knowledge.

"},{"location":"chapter_preface/","title":"Chapter 0. \u00a0 Preface","text":"

Abstract

Algorithms are like a beautiful symphony, with each line of code flowing like a rhythm.

May this book ring softly in your mind, leaving a unique and profound melody.

"},{"location":"chapter_preface/#chapter-contents","title":"Chapter contents","text":"
  • 0.1 \u00a0 About this book
  • 0.2 \u00a0 How to read
  • 0.3 \u00a0 Summary
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 About this book","text":"

This open-source project aims to create a free, and beginner-friendly crash course on data structures and algorithms.

  • Using animated illustrations, it delivers structured insights into data structures and algorithmic concepts, ensuring comprehensibility and a smooth learning curve.
  • Run code with just one click, supporting Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig and other languages.
  • Readers are encouraged to engage with each other in the discussion area for each section, questions and comments are usually answered within two days.
"},{"location":"chapter_preface/about_the_book/#011-target-audience","title":"0.1.1 \u00a0 Target audience","text":"

If you are new to algorithms with limited exposure, or you have accumulated some experience in algorithms, but you only have a vague understanding of data structures and algorithms, and you are constantly jumping between \"yep\" and \"hmm\", then this book is for you!

If you have already accumulated a certain amount of problem-solving experience, and are familiar with most types of problems, then this book can help you review and organize your algorithm knowledge system. The repository's source code can be used as a \"problem-solving toolkit\" or an \"algorithm cheat sheet\".

If you are an algorithm expert, we look forward to receiving your valuable suggestions, or join us and collaborate.

Prerequisites

You should know how to write and read simple code in at least one programming language.

"},{"location":"chapter_preface/about_the_book/#012-content-structure","title":"0.1.2 \u00a0 Content structure","text":"

The main content of the book is shown in the following figure.

  • Complexity analysis: explores aspects and methods for evaluating data structures and algorithms. Covers methods of deriving time complexity and space complexity, along with common types and examples.
  • Data structures: focuses on fundamental data types, classification methods, definitions, pros and cons, common operations, types, applications, and implementation methods of data structures such as array, linked list, stack, queue, hash table, tree, heap, graph, etc.
  • Algorithms: defines algorithms, discusses their pros and cons, efficiency, application scenarios, problem-solving steps, and includes sample questions for various algorithms such as search, sorting, divide and conquer, backtracking, dynamic programming, greedy algorithms, and more.

Figure 0-1 \u00a0 Main content of the book

"},{"location":"chapter_preface/about_the_book/#013-acknowledgements","title":"0.1.3 \u00a0 Acknowledgements","text":"

This book is continuously improved with the joint efforts of many contributors from the open-source community. Thanks to each writer who invested their time and energy, listed in the order generated by GitHub: krahets, codingonion, nuomi1, Gonglja, Reanon, justin-tse, danielsss, hpstory, S-N-O-R-L-A-X, night-cruise, msk397, gvenusleo, RiverTwilight, gyt95, zhuoqinyue, Zuoxun, Xia-Sang, mingXta, FangYuan33, GN-Yu, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, mgisr, JoseHung, qualifier1024, pengchzn, Guanngxu, longsizhuo, L-Super, what-is-me, yuan0221, lhxsm, Slone123c, WSL0809, longranger2, theNefelibatas, xiongsp, JeffersonHuang, hongyun-robot, K3v123, yuelinxin, a16su, gaofer, malone6, Wonderdch, xjr7670, DullSword, Horbin-Magician, NI-SW, reeswell, XC-Zero, XiaChuerwu, yd-j, iron-irax, huawuque404, MolDuM, Nigh, KorsChen, foursevenlove, 52coder, bubble9um, youshaoXG, curly210102, gltianwen, fanchenggang, Transmigration-zhou, FloranceYeh, FreddieLi, ShiMaRing, lipusheng, Javesun99, JackYang-hellobobo, shanghai-Jerry, 0130w, Keynman, psychelzh, logan-qiu, ZnYang2018, MwumLi, 1ch0, Phoenix0415, qingpeng9802, Richard-Zhang1019, QiLOL, Suremotoo, Turing-1024-Lee, Evilrabbit520, GaochaoZhu, ZJKung, linzeyan, hezhizhen, ZongYangL, beintentional, czruby, coderlef, dshlstarr, szu17dmy, fbigm, gledfish, hts0000, boloboloda, iStig, jiaxianhua, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, liuxjerry, lucaswangdev, lyl625760, chadyi, noobcodemaker, selear, siqyka, syd168, 4yDX3906, tao363, wangwang105, weibk, yabo083, yi427, yishangzhang, zhouLion, baagod, ElaBosak233, xb534, luluxia, yanedie, thomasq0, YangXuanyi and th1nk3r-ing.

The code review work for this book was completed by codingonion, Gonglja, gvenusleo, hpstory, justin\u2010tse, krahets, night-cruise, nuomi1, and Reanon (listed in alphabetical order). Thanks to them for their time and effort, ensuring the standardization and uniformity of the code in various languages.

Throughout the creation of this book, numerous individuals provided invaluable assistance, including but not limited to:

  • Thanks to my mentor at the company, Dr. Xi Li, who encouraged me in a conversation to \"get moving fast,\" which solidified my determination to write this book;
  • Thanks to my girlfriend Bubble, as the first reader of this book, for offering many valuable suggestions from the perspective of a beginner in algorithms, making this book more suitable for newbies;
  • Thanks to Tengbao, Qibao, and Feibao for coming up with a creative name for this book, evoking everyone's fond memories of writing their first line of code \"Hello World!\";
  • Thanks to Xiaoquan for providing professional help in intellectual property, which has played a significant role in the development of this open-source book;
  • Thanks to Sutong for designing a beautiful cover and logo for this book, and for patiently making multiple revisions under my insistence;
  • Thanks to @squidfunk for providing writing and typesetting suggestions, as well as his developed open-source documentation theme Material-for-MkDocs.

Throughout the writing journey, I delved into numerous textbooks and articles on data structures and algorithms. These works served as exemplary models, ensuring the accuracy and quality of this book's content. I extend my gratitude to all who preceded me for their invaluable contributions!

This book advocates a combination of hands-on and minds-on learning, inspired in this regard by \"Dive into Deep Learning\". I highly recommend this excellent book to all readers.

Heartfelt thanks to my parents, whose ongoing support and encouragement have allowed me to do this interesting work.

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 How to read","text":"

Tip

For the best reading experience, it is recommended that you read through this section.

"},{"location":"chapter_preface/suggestions/#021-writing-conventions","title":"0.2.1 \u00a0 Writing conventions","text":"
  • Chapters marked with '*' after the title are optional and contain relatively challenging content. If you are short on time, it is advisable to skip them.
  • Technical terms will be in boldface (in the print and PDF versions) or underlined (in the web version), for instance, array. It's advisable to familiarize yourself with these for better comprehension of technical texts.
  • Bolded text indicates key content or summary statements, which deserve special attention.
  • Words and phrases with specific meanings are indicated with \u201cquotation marks\u201d to avoid ambiguity.
  • When it comes to terms that are inconsistent between programming languages, this book follows Python, for example using None to mean null.
  • This book partially ignores the comment conventions for programming languages in exchange for a more compact layout of the content. The comments primarily consist of three types: title comments, content comments, and multi-line comments.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
\"\"\"Header comments for labeling functions, classes, test samples, etc\"\"\"\n\n# Comments for explaining details\n\n\"\"\"\nMultiline\ncomments\n\"\"\"\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
// Header comments for labeling functions, classes, test samples, etc\n\n// Comments for explaining details.\n\n// Multiline\n// comments\n
"},{"location":"chapter_preface/suggestions/#022-efficient-learning-via-animated-illustrations","title":"0.2.2 \u00a0 Efficient learning via animated illustrations","text":"

Compared with text, videos and pictures have a higher density of information and are more structured, making them easier to understand. In this book, key and difficult concepts are mainly presented through animations and illustrations, with text serving as explanations and supplements.

When encountering content with animations or illustrations as shown in the Figure 0-2 , prioritize understanding the figure, with text as supplementary, integrating both for a comprehensive understanding.

Figure 0-2 \u00a0 Animated illustration example

"},{"location":"chapter_preface/suggestions/#023-deepen-understanding-through-coding-practice","title":"0.2.3 \u00a0 Deepen understanding through coding practice","text":"

The source code of this book is hosted on the GitHub Repository. As shown in the Figure 0-3 , the source code comes with test examples and can be executed with just a single click.

If time permits, it's recommended to type out the code yourself. If pressed for time, at least read and run all the codes.

Compared to just reading code, writing code often yields more learning. Learning by doing is the real way to learn.

Figure 0-3 \u00a0 Running code example

Setting up to run the code involves three main steps.

Step 1: Install a local programming environment. Follow the tutorial in the appendix for installation, or skip this step if already installed.

Step 2: Clone or download the code repository. Visit the GitHub Repository.

If Git is installed, use the following command to clone the repository:

git clone https://github.com/krahets/hello-algo.git\n

Alternatively, you can also click the \"Download ZIP\" button at the location shown in the Figure 0-4 to directly download the code as a compressed ZIP file. Then, you can simply extract it locally.

Figure 0-4 \u00a0 Cloning repository and downloading code

Step 3: Run the source code. As shown in the Figure 0-5 , for the code block labeled with the file name at the top, we can find the corresponding source code file in the codes folder of the repository. These files can be executed with a single click, which will help you save unnecessary debugging time and allow you to focus on learning.

Figure 0-5 \u00a0 Code block and corresponding source code file

"},{"location":"chapter_preface/suggestions/#024-learning-together-in-discussion","title":"0.2.4 \u00a0 Learning together in discussion","text":"

While reading this book, please don't skip over the points that you didn't learn. Feel free to post your questions in the comment section. We will be happy to answer them and can usually respond within two days.

As illustrated in the Figure 0-6 , each chapter features a comment section at the bottom. I encourage you to pay attention to these comments. They not only expose you to others' encountered problems, aiding in identifying knowledge gaps and sparking deeper contemplation, but also invite you to generously contribute by answering fellow readers' inquiries, sharing insights, and fostering mutual improvement.

Figure 0-6 \u00a0 Comment section example

"},{"location":"chapter_preface/suggestions/#025-algorithm-learning-path","title":"0.2.5 \u00a0 Algorithm learning path","text":"

Overall, the journey of mastering data structures and algorithms can be divided into three stages:

  1. Stage 1: Introduction to algorithms. We need to familiarize ourselves with the characteristics and usage of various data structures and learn about the principles, processes, uses, and efficiency of different algorithms.
  2. Stage 2: Practicing algorithm problems. It is recommended to start from popular problems, such as Sword for Offer and LeetCode Hot 100, and accumulate at least 100 questions to familiarize yourself with mainstream algorithmic problems. Forgetfulness can be a challenge when you start practicing, but rest assured that this is normal. We can follow the \"Ebbinghaus Forgetting Curve\" to review the questions, and usually after 3~5 rounds of repetitions, we will be able to memorize them.
  3. Stage 3: Building the knowledge system. In terms of learning, we can read algorithm column articles, solution frameworks, and algorithm textbooks to continuously enrich the knowledge system. In terms of practicing, we can try advanced strategies, such as categorizing by topic, multiple solutions for a single problem, and one solution for multiple problems, etc. Insights on these strategies can be found in various communities.

As shown in the Figure 0-7 , this book mainly covers \u201cStage 1,\u201d aiming to help you more efficiently embark on Stages 2 and 3.

Figure 0-7 \u00a0 Algorithm learning path

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 Summary","text":"
  • The main audience of this book is beginners in algorithm. If you already have some basic knowledge, this book can help you systematically review your algorithm knowledge, and the source code in this book can also be used as a \"Coding Toolkit\".
  • The book consists of three main sections, Complexity Analysis, Data Structures, and Algorithms, covering most of the topics in the field.
  • For newcomers to algorithms, it is crucial to read an introductory book in the beginning stages to avoid many detours or common pitfalls.
  • Animations and figures within the book are usually used to introduce key points and difficult knowledge. These should be given more attention when reading the book.
  • Practice is the best way to learn programming. It is highly recommended that you run the source code and type in the code yourself.
  • Each chapter in the web version of this book features a discussion section, and you are welcome to share your questions and insights at any time.
"},{"location":"chapter_stack_and_queue/","title":"Chapter 5. \u00a0 Stack and queue","text":"

Abstract

A stack is like cats placed on top of each other, while a queue is like cats lined up one by one.

They represent the logical relationships of Last-In-First-Out (LIFO) and First-In-First-Out (FIFO), respectively.

"},{"location":"chapter_stack_and_queue/#chapter-contents","title":"Chapter contents","text":"
  • 5.1 \u00a0 Stack
  • 5.2 \u00a0 Queue
  • 5.3 \u00a0 Double-ended queue
  • 5.4 \u00a0 Summary
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 Double-ended queue","text":"

In a queue, we can only delete elements from the head or add elements to the tail. As shown in the following diagram, a \"double-ended queue (deque)\" offers more flexibility, allowing the addition or removal of elements at both the head and the tail.

Figure 5-7 \u00a0 Operations in double-ended queue

"},{"location":"chapter_stack_and_queue/deque/#531-common-operations-in-double-ended-queue","title":"5.3.1 \u00a0 Common operations in double-ended queue","text":"

The common operations in a double-ended queue are listed below, and the names of specific methods depend on the programming language used.

Table 5-3 \u00a0 Efficiency of double-ended queue operations

Method Name Description Time Complexity pushFirst() Add an element to the head \\(O(1)\\) pushLast() Add an element to the tail \\(O(1)\\) popFirst() Remove the first element \\(O(1)\\) popLast() Remove the last element \\(O(1)\\) peekFirst() Access the first element \\(O(1)\\) peekLast() Access the last element \\(O(1)\\)

Similarly, we can directly use the double-ended queue classes implemented in programming languages:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig deque.py
from collections import deque\n\n# Initialize the deque\ndeque: deque[int] = deque()\n\n# Enqueue elements\ndeque.append(2)      # Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # Add to the head\ndeque.appendleft(1)\n\n# Access elements\nfront: int = deque[0]  # The first element\nrear: int = deque[-1]  # The last element\n\n# Dequeue elements\npop_front: int = deque.popleft()  # The first element dequeued\npop_rear: int = deque.pop()       # The last element dequeued\n\n# Get the length of the deque\nsize: int = len(deque)\n\n# Check if the deque is empty\nis_empty: bool = len(deque) == 0\n
deque.cpp
/* Initialize the deque */\ndeque<int> deque;\n\n/* Enqueue elements */\ndeque.push_back(2);   // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nint front = deque.front(); // The first element\nint back = deque.back();   // The last element\n\n/* Dequeue elements */\ndeque.pop_front();  // The first element dequeued\ndeque.pop_back();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nbool empty = deque.empty();\n
deque.java
/* Initialize the deque */\nDeque<Integer> deque = new LinkedList<>();\n\n/* Enqueue elements */\ndeque.offerLast(2);   // Add to the tail\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // Add to the head\ndeque.offerFirst(1);\n\n/* Access elements */\nint peekFirst = deque.peekFirst();  // The first element\nint peekLast = deque.peekLast();    // The last element\n\n/* Dequeue elements */\nint popFirst = deque.pollFirst();  // The first element dequeued\nint popLast = deque.pollLast();    // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* Initialize the deque */\n// In C#, LinkedList is used as a deque\nLinkedList<int> deque = new();\n\n/* Enqueue elements */\ndeque.AddLast(2);   // Add to the tail\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // Add to the head\ndeque.AddFirst(1);\n\n/* Access elements */\nint peekFirst = deque.First.Value;  // The first element\nint peekLast = deque.Last.Value;    // The last element\n\n/* Dequeue elements */\ndeque.RemoveFirst();  // The first element dequeued\ndeque.RemoveLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.Count;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* Initialize the deque */\n// In Go, use list as a deque\ndeque := list.New()\n\n/* Enqueue elements */\ndeque.PushBack(2)      // Add to the tail\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // Add to the head\ndeque.PushFront(1)\n\n/* Access elements */\nfront := deque.Front() // The first element\nrear := deque.Back()   // The last element\n\n/* Dequeue elements */\ndeque.Remove(front)    // The first element dequeued\ndeque.Remove(rear)     // The last element dequeued\n\n/* Get the length of the deque */\nsize := deque.Len()\n\n/* Check if the deque is empty */\nisEmpty := deque.Len() == 0\n
deque.swift
/* Initialize the deque */\n// Swift does not have a built-in deque class, so Array can be used as a deque\nvar deque: [Int] = []\n\n/* Enqueue elements */\ndeque.append(2) // Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // Add to the head\ndeque.insert(1, at: 0)\n\n/* Access elements */\nlet peekFirst = deque.first! // The first element\nlet peekLast = deque.last!   // The last element\n\n/* Dequeue elements */\n// Using Array, popFirst has a complexity of O(n)\nlet popFirst = deque.removeFirst() // The first element dequeued\nlet popLast = deque.removeLast()   // The last element dequeued\n\n/* Get the length of the deque */\nlet size = deque.count\n\n/* Check if the deque is empty */\nlet isEmpty = deque.isEmpty\n
deque.js
/* Initialize the deque */\n// JavaScript does not have a built-in deque, so Array is used as a deque\nconst deque = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst = deque[0]; // The first element\nconst peekLast = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront = deque.shift(); // The first element dequeued\nconst popBack = deque.pop();    // The last element dequeued\n\n/* Get the length of the deque */\nconst size = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty = size === 0;\n
deque.ts
/* Initialize the deque */\n// TypeScript does not have a built-in deque, so Array is used as a deque\nconst deque: number[] = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst: number = deque[0]; // The first element\nconst peekLast: number = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront: number = deque.shift() as number; // The first element dequeued\nconst popBack: number = deque.pop() as number;    // The last element dequeued\n\n/* Get the length of the deque */\nconst size: number = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* Initialize the deque */\n// In Dart, Queue is defined as a deque\nQueue<int> deque = Queue<int>();\n\n/* Enqueue elements */\ndeque.addLast(2);  // Add to the tail\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // Add to the head\ndeque.addFirst(1);\n\n/* Access elements */\nint peekFirst = deque.first; // The first element\nint peekLast = deque.last;   // The last element\n\n/* Dequeue elements */\nint popFirst = deque.removeFirst(); // The first element dequeued\nint popLast = deque.removeLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.length;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* Initialize the deque */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(2);  // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nif let Some(front) = deque.front() { // The first element\n}\nif let Some(rear) = deque.back() {   // The last element\n}\n\n/* Dequeue elements */\nif let Some(pop_front) = deque.pop_front() { // The first element dequeued\n}\nif let Some(pop_rear) = deque.pop_back() {   // The last element dequeued\n}\n\n/* Get the length of the deque */\nlet size = deque.len();\n\n/* Check if the deque is empty */\nlet is_empty = deque.is_empty();\n
deque.c
// C does not provide a built-in deque\n
deque.kt
\n
deque.zig
\n
Visualizing Code

https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E9%98%9F%0A%20%20%20%20deq.append%282%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E5%B0%BE%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E9%A6%96%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%AE%BF%E9%97%AE%E5%85%83%E7%B4%A0%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%20front%20%3D%22,%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%20rear%20%3D%22,%20rear%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_front%20%3D%22,%20pop_front%29%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_rear%20%3D%22,%20pop_rear%29%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E7%9A%84%E9%95%BF%E5%BA%A6%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E9%95%BF%E5%BA%A6%20size%20%3D%22,%20size%29%0A%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%20%3D%22,%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_stack_and_queue/deque/#532-implementing-a-double-ended-queue","title":"5.3.2 \u00a0 Implementing a double-ended queue *","text":"

The implementation of a double-ended queue is similar to that of a regular queue, it can be based on either a linked list or an array as the underlying data structure.

"},{"location":"chapter_stack_and_queue/deque/#1-implementation-based-on-doubly-linked-list","title":"1. \u00a0 Implementation based on doubly linked list","text":"

Recall from the previous section that we used a regular singly linked list to implement a queue, as it conveniently allows for deleting from the head (corresponding to the dequeue operation) and adding new elements after the tail (corresponding to the enqueue operation).

For a double-ended queue, both the head and the tail can perform enqueue and dequeue operations. In other words, a double-ended queue needs to implement operations in the opposite direction as well. For this, we use a \"doubly linked list\" as the underlying data structure of the double-ended queue.

As shown in the Figure 5-8 , we treat the head and tail nodes of the doubly linked list as the front and rear of the double-ended queue, respectively, and implement the functionality to add and remove nodes at both ends.

LinkedListDequepushLast()pushFirst()popLast()popFirst()

Figure 5-8 \u00a0 Implementing Double-Ended Queue with Doubly Linked List for Enqueue and Dequeue Operations

The implementation code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2-implementation-based-on-array","title":"2. \u00a0 Implementation based on array","text":"

As shown in the Figure 5-9 , similar to implementing a queue with an array, we can also use a circular array to implement a double-ended queue.

ArrayDequepushLast()pushFirst()popLast()popFirst()

Figure 5-9 \u00a0 Implementing Double-Ended Queue with Array for Enqueue and Dequeue Operations

The implementation only needs to add methods for \"front enqueue\" and \"rear dequeue\":

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533-applications-of-double-ended-queue","title":"5.3.3 \u00a0 Applications of double-ended queue","text":"

The double-ended queue combines the logic of both stacks and queues, thus, it can implement all their respective use cases while offering greater flexibility.

We know that software's \"undo\" feature is typically implemented using a stack: the system pushes each change operation onto the stack and then pops to implement undoing. However, considering the limitations of system resources, software often restricts the number of undo steps (for example, only allowing the last 50 steps). When the stack length exceeds 50, the software needs to perform a deletion operation at the bottom of the stack (the front of the queue). But a regular stack cannot perform this function, where a double-ended queue becomes necessary. Note that the core logic of \"undo\" still follows the Last-In-First-Out principle of a stack, but a double-ended queue can more flexibly implement some additional logic.

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 Queue","text":"

\"Queue\" is a linear data structure that follows the First-In-First-Out (FIFO) rule. As the name suggests, a queue simulates the phenomenon of lining up, where newcomers join the queue at the rear, and the person at the front leaves the queue first.

As shown in the Figure 5-4 , we call the front of the queue the \"head\" and the back the \"tail.\" The operation of adding elements to the rear of the queue is termed \"enqueue,\" and the operation of removing elements from the front is termed \"dequeue.\"

Figure 5-4 \u00a0 Queue's first-in-first-out rule

"},{"location":"chapter_stack_and_queue/queue/#521-common-operations-on-queue","title":"5.2.1 \u00a0 Common operations on queue","text":"

The common operations on a queue are shown in the Table 5-2 . Note that method names may vary across different programming languages. Here, we use the same naming convention as that used for stacks.

Table 5-2 \u00a0 Efficiency of queue operations

Method Name Description Time Complexity push() Enqueue an element, add it to the tail \\(O(1)\\) pop() Dequeue the head element \\(O(1)\\) peek() Access the head element \\(O(1)\\)

We can directly use the ready-made queue classes in programming languages:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig queue.py
from collections import deque\n\n# Initialize the queue\n# In Python, we generally use the deque class as a queue\n# Although queue.Queue() is a pure queue class, it's not very user-friendly, so it's not recommended\nque: deque[int] = deque()\n\n# Enqueue elements\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# Access the first element\nfront: int = que[0]\n\n# Dequeue an element\npop: int = que.popleft()\n\n# Get the length of the queue\nsize: int = len(que)\n\n# Check if the queue is empty\nis_empty: bool = len(que) == 0\n
queue.cpp
/* Initialize the queue */\nqueue<int> queue;\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element*/\nint front = queue.front();\n\n/* Dequeue an element */\nqueue.pop();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nbool empty = queue.empty();\n
queue.java
/* Initialize the queue */\nQueue<Integer> queue = new LinkedList<>();\n\n/* Enqueue elements */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* Access the first element */\nint peek = queue.peek();\n\n/* Dequeue an element */\nint pop = queue.poll();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* Initialize the queue */\nQueue<int> queue = new();\n\n/* Enqueue elements */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* Access the first element */\nint peek = queue.Peek();\n\n/* Dequeue an element */\nint pop = queue.Dequeue();\n\n/* Get the length of the queue */\nint size = queue.Count;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* Initialize the queue */\n// In Go, use list as a queue\nqueue := list.New()\n\n/* Enqueue elements */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* Access the first element */\npeek := queue.Front()\n\n/* Dequeue an element */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* Get the length of the queue */\nsize := queue.Len()\n\n/* Check if the queue is empty */\nisEmpty := queue.Len() == 0\n
queue.swift
/* Initialize the queue */\n// Swift does not have a built-in queue class, so Array can be used as a queue\nvar queue: [Int] = []\n\n/* Enqueue elements */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* Access the first element */\nlet peek = queue.first!\n\n/* Dequeue an element */\n// Since it's an array, removeFirst has a complexity of O(n)\nlet pool = queue.removeFirst()\n\n/* Get the length of the queue */\nlet size = queue.count\n\n/* Check if the queue is empty */\nlet isEmpty = queue.isEmpty\n
queue.js
/* Initialize the queue */\n// JavaScript does not have a built-in queue, so Array can be used as a queue\nconst queue = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
queue.ts
/* Initialize the queue */\n// TypeScript does not have a built-in queue, so Array can be used as a queue \nconst queue: number[] = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
queue.dart
/* Initialize the queue */\n// In Dart, the Queue class is a double-ended queue but can be used as a queue\nQueue<int> queue = Queue();\n\n/* Enqueue elements */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* Access the first element */\nint peek = queue.first;\n\n/* Dequeue an element */\nint pop = queue.removeFirst();\n\n/* Get the length of the queue */\nint size = queue.length;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* Initialize the double-ended queue */\n// In Rust, use a double-ended queue as a regular queue\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* Access the first element */\nif let Some(front) = deque.front() {\n}\n\n/* Dequeue an element */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* Get the length of the queue */\nlet size = deque.len();\n\n/* Check if the queue is empty */\nlet is_empty = deque.is_empty();\n
queue.c
// C does not provide a built-in queue\n
queue.kt
\n
queue.zig
\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/queue/#522-implementing-a-queue","title":"5.2.2 \u00a0 Implementing a queue","text":"

To implement a queue, we need a data structure that allows adding elements at one end and removing them at the other. Both linked lists and arrays meet this requirement.

"},{"location":"chapter_stack_and_queue/queue/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

As shown in the Figure 5-5 , we can consider the \"head node\" and \"tail node\" of a linked list as the \"front\" and \"rear\" of the queue, respectively. It is stipulated that nodes can only be added at the rear and removed at the front.

LinkedListQueuepush()pop()

Figure 5-5 \u00a0 Implementing Queue with Linked List for Enqueue and Dequeue Operations

Below is the code for implementing a queue using a linked list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/queue/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

Deleting the first element in an array has a time complexity of \\(O(n)\\), which would make the dequeue operation inefficient. However, this problem can be cleverly avoided as follows.

We use a variable front to indicate the index of the front element and maintain a variable size to record the queue's length. Define rear = front + size, which points to the position immediately following the tail element.

With this design, the effective interval of elements in the array is [front, rear - 1]. The implementation methods for various operations are shown in the Figure 5-6 .

  • Enqueue operation: Assign the input element to the rear index and increase size by 1.
  • Dequeue operation: Simply increase front by 1 and decrease size by 1.

Both enqueue and dequeue operations only require a single operation, each with a time complexity of \\(O(1)\\).

ArrayQueuepush()pop()

Figure 5-6 \u00a0 Implementing Queue with Array for Enqueue and Dequeue Operations

You might notice a problem: as enqueue and dequeue operations are continuously performed, both front and rear move to the right and will eventually reach the end of the array and can't move further. To resolve this, we can treat the array as a \"circular array\" where connecting the end of the array back to its beginning.

In a circular array, front or rear needs to loop back to the start of the array upon reaching the end. This cyclical pattern can be achieved with a \"modulo operation\" as shown in the code below:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

The above implementation of the queue still has its limitations: its length is fixed. However, this issue is not difficult to resolve. We can replace the array with a dynamic array that can expand itself if needed. Interested readers can try to implement this themselves.

The comparison of the two implementations is consistent with that of the stack and is not repeated here.

"},{"location":"chapter_stack_and_queue/queue/#523-typical-applications-of-queue","title":"5.2.3 \u00a0 Typical applications of queue","text":"
  • Amazon orders: After shoppers place orders, these orders join a queue, and the system processes them in order. During events like Singles' Day, a massive number of orders are generated in a short time, making high concurrency a key challenge for engineers.
  • Various to-do lists: Any scenario requiring a \"first-come, first-served\" functionality, such as a printer's task queue or a restaurant's food delivery queue, can effectively maintain the order of processing with a queue.
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 Stack","text":"

A \"Stack\" is a linear data structure that follows the principle of Last-In-First-Out (LIFO).

We can compare a stack to a pile of plates on a table. To access the bottom plate, one must first remove the plates on top. By replacing the plates with various types of elements (such as integers, characters, objects, etc.), we obtain the data structure known as a stack.

As shown in the Figure 5-1 , we refer to the top of the pile of elements as the \"top of the stack\" and the bottom as the \"bottom of the stack.\" The operation of adding elements to the top of the stack is called \"push,\" and the operation of removing the top element is called \"pop.\"

Figure 5-1 \u00a0 Stack's last-in-first-out rule

"},{"location":"chapter_stack_and_queue/stack/#511-common-operations-on-stack","title":"5.1.1 \u00a0 Common operations on stack","text":"

The common operations on a stack are shown in the Table 5-1 . The specific method names depend on the programming language used. Here, we use push(), pop(), and peek() as examples.

Table 5-1 \u00a0 Efficiency of stack operations

Method Description Time Complexity push() Push an element onto the stack (add to the top) \\(O(1)\\) pop() Pop the top element from the stack \\(O(1)\\) peek() Access the top element of the stack \\(O(1)\\)

Typically, we can directly use the stack class built into the programming language. However, some languages may not specifically provide a stack class. In these cases, we can use the language's \"array\" or \"linked list\" as a stack and ignore operations that are not related to stack logic in the program.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig stack.py
# Initialize the stack\n# Python does not have a built-in stack class, so a list can be used as a stack\nstack: list[int] = []\n\n# Push elements onto the stack\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# Access the top element of the stack\npeek: int = stack[-1]\n\n# Pop an element from the stack\npop: int = stack.pop()\n\n# Get the length of the stack\nsize: int = len(stack)\n\n# Check if the stack is empty\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* Initialize the stack */\nstack<int> stack;\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint top = stack.top();\n\n/* Pop an element from the stack */\nstack.pop(); // No return value\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nbool empty = stack.empty();\n
stack.java
/* Initialize the stack */\nStack<Integer> stack = new Stack<>();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint peek = stack.peek();\n\n/* Pop an element from the stack */\nint pop = stack.pop();\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* Initialize the stack */\nStack<int> stack = new();\n\n/* Push elements onto the stack */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* Access the top element of the stack */\nint peek = stack.Peek();\n\n/* Pop an element from the stack */\nint pop = stack.Pop();\n\n/* Get the length of the stack */\nint size = stack.Count;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* Initialize the stack */\n// In Go, it is recommended to use a Slice as a stack\nvar stack []int\n\n/* Push elements onto the stack */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* Access the top element of the stack */\npeek := stack[len(stack)-1]\n\n/* Pop an element from the stack */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* Get the length of the stack */\nsize := len(stack)\n\n/* Check if the stack is empty */\nisEmpty := len(stack) == 0\n
stack.swift
/* Initialize the stack */\n// Swift does not have a built-in stack class, so Array can be used as a stack\nvar stack: [Int] = []\n\n/* Push elements onto the stack */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* Access the top element of the stack */\nlet peek = stack.last!\n\n/* Pop an element from the stack */\nlet pop = stack.removeLast()\n\n/* Get the length of the stack */\nlet size = stack.count\n\n/* Check if the stack is empty */\nlet isEmpty = stack.isEmpty\n
stack.js
/* Initialize the stack */\n// JavaScript does not have a built-in stack class, so Array can be used as a stack\nconst stack = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length-1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
stack.ts
/* Initialize the stack */\n// TypeScript does not have a built-in stack class, so Array can be used as a stack\nconst stack: number[] = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length - 1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
stack.dart
/* Initialize the stack */\n// Dart does not have a built-in stack class, so List can be used as a stack\nList<int> stack = [];\n\n/* Push elements onto the stack */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* Access the top element of the stack */\nint peek = stack.last;\n\n/* Pop an element from the stack */\nint pop = stack.removeLast();\n\n/* Get the length of the stack */\nint size = stack.length;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* Initialize the stack */\n// Use Vec as a stack\nlet mut stack: Vec<i32> = Vec::new();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nlet top = stack.last().unwrap();\n\n/* Pop an element from the stack */\nlet pop = stack.pop().unwrap();\n\n/* Get the length of the stack */\nlet size = stack.len();\n\n/* Check if the stack is empty */\nlet is_empty = stack.is_empty();\n
stack.c
// C does not provide a built-in stack\n
stack.kt
\n
stack.zig
\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#512-implementing-a-stack","title":"5.1.2 \u00a0 Implementing a stack","text":"

To gain a deeper understanding of how a stack operates, let's try implementing a stack class ourselves.

A stack follows the principle of Last-In-First-Out, which means we can only add or remove elements at the top of the stack. However, both arrays and linked lists allow adding and removing elements at any position, therefore a stack can be seen as a restricted array or linked list. In other words, we can \"shield\" certain irrelevant operations of an array or linked list, aligning their external behavior with the characteristics of a stack.

"},{"location":"chapter_stack_and_queue/stack/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

When implementing a stack using a linked list, we can consider the head node of the list as the top of the stack and the tail node as the bottom of the stack.

As shown in the Figure 5-2 , for the push operation, we simply insert elements at the head of the linked list. This method of node insertion is known as \"head insertion.\" For the pop operation, we just need to remove the head node from the list.

LinkedListStackpush()pop()

Figure 5-2 \u00a0 Implementing Stack with Linked List for Push and Pop Operations

Below is an example code for implementing a stack based on a linked list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

When implementing a stack using an array, we can consider the end of the array as the top of the stack. As shown in the Figure 5-3 , push and pop operations correspond to adding and removing elements at the end of the array, respectively, both with a time complexity of \\(O(1)\\).

ArrayStackpush()pop()

Figure 5-3 \u00a0 Implementing Stack with Array for Push and Pop Operations

Since the elements to be pushed onto the stack may continuously increase, we can use a dynamic array, thus avoiding the need to handle array expansion ourselves. Here is an example code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#513-comparison-of-the-two-implementations","title":"5.1.3 \u00a0 Comparison of the two implementations","text":"

Supported Operations

Both implementations support all the operations defined in a stack. The array implementation additionally supports random access, but this is beyond the scope of a stack definition and is generally not used.

Time Efficiency

In the array-based implementation, both push and pop operations occur in pre-allocated contiguous memory, which has good cache locality and therefore higher efficiency. However, if the push operation exceeds the array capacity, it triggers a resizing mechanism, making the time complexity of that push operation \\(O(n)\\).

In the linked list implementation, list expansion is very flexible, and there is no efficiency decrease issue as in array expansion. However, the push operation requires initializing a node object and modifying pointers, so its efficiency is relatively lower. If the elements being pushed are already node objects, then the initialization step can be skipped, improving efficiency.

Thus, when the elements for push and pop operations are basic data types like int or double, we can draw the following conclusions:

  • The array-based stack implementation's efficiency decreases during expansion, but since expansion is a low-frequency operation, its average efficiency is higher.
  • The linked list-based stack implementation provides more stable efficiency performance.

Space Efficiency

When initializing a list, the system allocates an \"initial capacity,\" which might exceed the actual need; moreover, the expansion mechanism usually increases capacity by a specific factor (like doubling), which may also exceed the actual need. Therefore, the array-based stack might waste some space.

However, since linked list nodes require extra space for storing pointers, the space occupied by linked list nodes is relatively larger.

In summary, we cannot simply determine which implementation is more memory-efficient. It requires analysis based on specific circumstances.

"},{"location":"chapter_stack_and_queue/stack/#514-typical-applications-of-stack","title":"5.1.4 \u00a0 Typical applications of stack","text":"
  • Back and forward in browsers, undo and redo in software. Every time we open a new webpage, the browser pushes the previous page onto the stack, allowing us to go back to the previous page through the back operation, which is essentially a pop operation. To support both back and forward, two stacks are needed to work together.
  • Memory management in programs. Each time a function is called, the system adds a stack frame at the top of the stack to record the function's context information. In recursive functions, the downward recursion phase keeps pushing onto the stack, while the upward backtracking phase keeps popping from the stack.
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 Summary","text":""},{"location":"chapter_stack_and_queue/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Stack is a data structure that follows the Last-In-First-Out (LIFO) principle and can be implemented using arrays or linked lists.
  • In terms of time efficiency, the array implementation of the stack has a higher average efficiency. However, during expansion, the time complexity for a single push operation can degrade to \\(O(n)\\). In contrast, the linked list implementation of a stack offers more stable efficiency.
  • Regarding space efficiency, the array implementation of the stack may lead to a certain degree of space wastage. However, it's important to note that the memory space occupied by nodes in a linked list is generally larger than that for elements in an array.
  • A queue is a data structure that follows the First-In-First-Out (FIFO) principle, and it can also be implemented using arrays or linked lists. The conclusions regarding time and space efficiency for queues are similar to those for stacks.
  • A double-ended queue (deque) is a more flexible type of queue that allows adding and removing elements at both ends.
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the browser's forward and backward functionality implemented with a doubly linked list?

A browser's forward and backward navigation is essentially a manifestation of the \"stack\" concept. When a user visits a new page, the page is added to the top of the stack; when they click the back button, the page is popped from the top of the stack. A double-ended queue (deque) can conveniently implement some additional operations, as mentioned in the \"Double-Ended Queue\" section.

Q: After popping from a stack, is it necessary to free the memory of the popped node?

If the popped node will still be used later, it's not necessary to free its memory. In languages like Java and Python that have automatic garbage collection, manual memory release is not necessary; in C and C++, manual memory release is required.

Q: A double-ended queue seems like two stacks joined together. What are its uses?

A double-ended queue, which is a combination of a stack and a queue or two stacks joined together, exhibits both stack and queue logic. Thus, it can implement all applications of stacks and queues while offering more flexibility.

Q: How exactly are undo and redo implemented?

Undo and redo operations are implemented using two stacks: Stack A for undo and Stack B for redo.

  1. Each time a user performs an operation, it is pushed onto Stack A, and Stack B is cleared.
  2. When the user executes an \"undo\", the most recent operation is popped from Stack A and pushed onto Stack B.
  3. When the user executes a \"redo\", the most recent operation is popped from Stack B and pushed back onto Stack A.
"},{"location":"chapter_tree/","title":"Chapter 7. \u00a0 Tree","text":"

Abstract

The towering tree, vibrant with it's deep roots and lush leaves, branches spreading wide.

It vividly illustrates the concept of divide-and-conquer in data.

"},{"location":"chapter_tree/#chapter-contents","title":"Chapter contents","text":"
  • 7.1 \u00a0 Binary tree
  • 7.2 \u00a0 Binary tree Traversal
  • 7.3 \u00a0 Array Representation of tree
  • 7.4 \u00a0 Binary Search tree
  • 7.5 \u00a0 AVL tree *
  • 7.6 \u00a0 Summary
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 Array representation of binary trees","text":"

Under the linked list representation, the storage unit of a binary tree is a node TreeNode, with nodes connected by pointers. The basic operations of binary trees under the linked list representation were introduced in the previous section.

So, can we use an array to represent a binary tree? The answer is yes.

"},{"location":"chapter_tree/array_representation_of_tree/#731-representing-perfect-binary-trees","title":"7.3.1 \u00a0 Representing perfect binary trees","text":"

Let's analyze a simple case first. Given a perfect binary tree, we store all nodes in an array according to the order of level-order traversal, where each node corresponds to a unique array index.

Based on the characteristics of level-order traversal, we can deduce a \"mapping formula\" between the index of a parent node and its children: If a node's index is \\(i\\), then the index of its left child is \\(2i + 1\\) and the right child is \\(2i + 2\\). The Figure 7-12 shows the mapping relationship between the indices of various nodes.

Figure 7-12 \u00a0 Array representation of a perfect binary tree

The mapping formula plays a role similar to the node references (pointers) in linked lists. Given any node in the array, we can access its left (right) child node using the mapping formula.

"},{"location":"chapter_tree/array_representation_of_tree/#732-representing-any-binary-tree","title":"7.3.2 \u00a0 Representing any binary tree","text":"

Perfect binary trees are a special case; there are often many None values in the middle levels of a binary tree. Since the sequence of level-order traversal does not include these None values, we cannot solely rely on this sequence to deduce the number and distribution of None values. This means that multiple binary tree structures can match the same level-order traversal sequence.

As shown in the Figure 7-13 , given a non-perfect binary tree, the above method of array representation fails.

Figure 7-13 \u00a0 Level-order traversal sequence corresponds to multiple binary tree possibilities

To solve this problem, we can consider explicitly writing out all None values in the level-order traversal sequence. As shown in the following figure, after this treatment, the level-order traversal sequence can uniquely represent a binary tree. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# Array representation of a binary tree\n# Using None to represent empty slots\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* Array representation of a binary tree */\n// Using the maximum integer value INT_MAX to mark empty slots\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* Array representation of a binary tree */\n// Using the Integer wrapper class allows for using null to mark empty slots\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using an any type slice, allowing for nil to mark empty slots\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* Array representation of a binary tree */\n// Using optional Int (Int?) allows for using nil to mark empty slots\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using None to mark empty slots\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* Array representation of a binary tree */\n// Using the maximum int value to mark empty slots, therefore, node values must not be INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nval tree = mutableListOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
\n
\n

Figure 7-14 \u00a0 Array representation of any type of binary tree

It's worth noting that complete binary trees are very suitable for array representation. Recalling the definition of a complete binary tree, None appears only at the bottom level and towards the right, meaning all None values definitely appear at the end of the level-order traversal sequence.

This means that when using an array to represent a complete binary tree, it's possible to omit storing all None values, which is very convenient. The Figure 7-15 gives an example.

Figure 7-15 \u00a0 Array representation of a complete binary tree

The following code implements a binary tree based on array representation, including the following operations:

  • Given a node, obtain its value, left (right) child node, and parent node.
  • Obtain the preorder, inorder, postorder, and level-order traversal sequences.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/array_representation_of_tree/#733-advantages-and-limitations","title":"7.3.3 \u00a0 Advantages and limitations","text":"

The array representation of binary trees has the following advantages:

  • Arrays are stored in contiguous memory spaces, which is cache-friendly and allows for faster access and traversal.
  • It does not require storing pointers, which saves space.
  • It allows random access to nodes.

However, the array representation also has some limitations:

  • Array storage requires contiguous memory space, so it is not suitable for storing trees with a large amount of data.
  • Adding or deleting nodes requires array insertion and deletion operations, which are less efficient.
  • When there are many None values in the binary tree, the proportion of node data contained in the array is low, leading to lower space utilization.
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL tree *","text":"

In the \"Binary Search Tree\" section, we mentioned that after multiple insertions and removals, a binary search tree might degrade to a linked list. In such cases, the time complexity of all operations degrades from \\(O(\\log n)\\) to \\(O(n)\\).

As shown in the Figure 7-24 , after two node removal operations, this binary search tree will degrade into a linked list.

Figure 7-24 \u00a0 Degradation of an AVL tree after removing nodes

For example, in the perfect binary tree shown in the Figure 7-25 , after inserting two nodes, the tree will lean heavily to the left, and the time complexity of search operations will also degrade.

Figure 7-25 \u00a0 Degradation of an AVL tree after inserting nodes

In 1962, G. M. Adelson-Velsky and E. M. Landis proposed the \"AVL Tree\" in their paper \"An algorithm for the organization of information\". The paper detailed a series of operations to ensure that after continuously adding and removing nodes, the AVL tree would not degrade, thus maintaining the time complexity of various operations at \\(O(\\log n)\\) level. In other words, in scenarios where frequent additions, removals, searches, and modifications are needed, the AVL tree can always maintain efficient data operation performance, which has great application value.

"},{"location":"chapter_tree/avl_tree/#751-common-terminology-in-avl-trees","title":"7.5.1 \u00a0 Common terminology in AVL trees","text":"

An AVL tree is both a binary search tree and a balanced binary tree, satisfying all properties of these two types of binary trees, hence it is a \"balanced binary search tree\".

"},{"location":"chapter_tree/avl_tree/#1-node-height","title":"1. \u00a0 Node height","text":"

Since the operations related to AVL trees require obtaining node heights, we need to add a height variable to the node class:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # Node value\n        self.height: int = 0                # Node height\n        self.left: TreeNode | None = None   # Left child reference\n        self.right: TreeNode | None = None  # Right child reference\n
/* AVL tree node */\nstruct TreeNode {\n    int val{};          // Node value\n    int height = 0;     // Node height\n    TreeNode *left{};   // Left child\n    TreeNode *right{};  // Right child\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL tree node */\nclass TreeNode {\n    public int val;        // Node value\n    public int height;     // Node height\n    public TreeNode left;  // Left child\n    public TreeNode right; // Right child\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public int height;      // Node height\n    public TreeNode? left;  // Left child reference\n    public TreeNode? right; // Right child reference\n}\n
/* AVL tree node */\ntype TreeNode struct {\n    Val    int       // Node value\n    Height int       // Node height\n    Left   *TreeNode // Left child reference\n    Right  *TreeNode // Right child reference\n}\n
/* AVL tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var height: Int // Node height\n    var left: TreeNode? // Left child\n    var right: TreeNode? // Right child\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n    val; // Node value\n    height; // Node height\n    left; // Left child pointer\n    right; // Right child pointer\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n    val: number;            // Node value\n    height: number;         // Node height\n    left: TreeNode | null;  // Left child pointer\n    right: TreeNode | null; // Right child pointer\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height; \n        this.left = left === undefined ? null : left; \n        this.right = right === undefined ? null : right; \n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n  int val;         // Node value\n  int height;      // Node height\n  TreeNode? left;  // Left child\n  TreeNode? right; // Right child\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    height: i32,                            // Node height\n    left: Option<Rc<RefCell<TreeNode>>>,    // Left child\n    right: Option<Rc<RefCell<TreeNode>>>,   // Right child\n}\n\nimpl TreeNode {\n    /* Constructor */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL tree node */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* Constructor */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val height: Int = 0          // Node height\n    val left: TreeNode? = null   // Left child\n    val right: TreeNode? = null  // Right child\n}\n
\n
\n

The \"node height\" refers to the distance from that node to its farthest leaf node, i.e., the number of \"edges\" passed. It is important to note that the height of a leaf node is \\(0\\), and the height of a null node is \\(-1\\). We will create two utility functions for getting and updating the height of a node:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-node-balance-factor","title":"2. \u00a0 Node balance factor","text":"

The \"balance factor\" of a node is defined as the height of the node's left subtree minus the height of its right subtree, with the balance factor of a null node defined as \\(0\\). We will also encapsulate the functionality of obtaining the node balance factor into a function for easy use later on:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

Let the balance factor be \\(f\\), then the balance factor of any node in an AVL tree satisfies \\(-1 \\le f \\le 1\\).

"},{"location":"chapter_tree/avl_tree/#752-rotations-in-avl-trees","title":"7.5.2 \u00a0 Rotations in AVL trees","text":"

The characteristic feature of an AVL tree is the \"rotation\" operation, which can restore balance to an unbalanced node without affecting the in-order traversal sequence of the binary tree. In other words, the rotation operation can maintain the property of a \"binary search tree\" while also turning the tree back into a \"balanced binary tree\".

We call nodes with an absolute balance factor \\(> 1\\) \"unbalanced nodes\". Depending on the type of imbalance, there are four kinds of rotations: right rotation, left rotation, right-left rotation, and left-right rotation. Below, we detail these rotation operations.

"},{"location":"chapter_tree/avl_tree/#1-right-rotation","title":"1. \u00a0 Right rotation","text":"

As shown in the Figure 7-26 , the first unbalanced node from the bottom up in the binary tree is \"node 3\". Focusing on the subtree with this unbalanced node as the root, denoted as node, and its left child as child, perform a \"right rotation\". After the right rotation, the subtree is balanced again while still maintaining the properties of a binary search tree.

<1><2><3><4>

Figure 7-26 \u00a0 Steps of right rotation

As shown in the Figure 7-27 , when the child node has a right child (denoted as grand_child), a step needs to be added in the right rotation: set grand_child as the left child of node.

Figure 7-27 \u00a0 Right rotation with grand_child

\"Right rotation\" is a figurative term; in practice, it is achieved by modifying node pointers, as shown in the following code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-left-rotation","title":"2. \u00a0 Left rotation","text":"

Correspondingly, if considering the \"mirror\" of the above unbalanced binary tree, the \"left rotation\" operation shown in the Figure 7-28 needs to be performed.

Figure 7-28 \u00a0 Left rotation operation

Similarly, as shown in the Figure 7-29 , when the child node has a left child (denoted as grand_child), a step needs to be added in the left rotation: set grand_child as the right child of node.

Figure 7-29 \u00a0 Left rotation with grand_child

It can be observed that the right and left rotation operations are logically symmetrical, and they solve two symmetrical types of imbalance. Based on symmetry, by replacing all left with right, and all right with left in the implementation code of right rotation, we can get the implementation code for left rotation:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3-right-left-rotation","title":"3. \u00a0 Right-left rotation","text":"

For the unbalanced node 3 shown in the Figure 7-30 , using either left or right rotation alone cannot restore balance to the subtree. In this case, a \"left rotation\" needs to be performed on child first, followed by a \"right rotation\" on node.

Figure 7-30 \u00a0 Right-left rotation

"},{"location":"chapter_tree/avl_tree/#4-left-right-rotation","title":"4. \u00a0 Left-right rotation","text":"

As shown in the Figure 7-31 , for the mirror case of the above unbalanced binary tree, a \"right rotation\" needs to be performed on child first, followed by a \"left rotation\" on node.

Figure 7-31 \u00a0 Left-right rotation

"},{"location":"chapter_tree/avl_tree/#5-choice-of-rotation","title":"5. \u00a0 Choice of rotation","text":"

The four kinds of imbalances shown in the Figure 7-32 correspond to the cases described above, respectively requiring right rotation, left-right rotation, right-left rotation, and left rotation.

Figure 7-32 \u00a0 The four rotation cases of AVL tree

As shown in the Table 7-3 , we determine which of the above cases an unbalanced node belongs to by judging the sign of the balance factor of the unbalanced node and its higher-side child's balance factor.

Table 7-3 \u00a0 Conditions for Choosing Among the Four Rotation Cases

Balance factor of unbalanced node Balance factor of child node Rotation method to use \\(> 1\\) (Left-leaning tree) \\(\\geq 0\\) Right rotation \\(> 1\\) (Left-leaning tree) \\(<0\\) Left rotation then right rotation \\(< -1\\) (Right-leaning tree) \\(\\leq 0\\) Left rotation \\(< -1\\) (Right-leaning tree) \\(>0\\) Right rotation then left rotation

For convenience, we encapsulate the rotation operations into a function. With this function, we can perform rotations on various kinds of imbalances, restoring balance to unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-common-operations-in-avl-trees","title":"7.5.3 \u00a0 Common operations in AVL trees","text":""},{"location":"chapter_tree/avl_tree/#1-node-insertion","title":"1. \u00a0 Node insertion","text":"

The node insertion operation in AVL trees is similar to that in binary search trees. The only difference is that after inserting a node in an AVL tree, a series of unbalanced nodes may appear along the path from that node to the root node. Therefore, we need to start from this node and perform rotation operations upwards to restore balance to all unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-node-removal","title":"2. \u00a0 Node removal","text":"

Similarly, based on the method of removing nodes in binary search trees, rotation operations need to be performed from the bottom up to restore balance to all unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3-node-search","title":"3. \u00a0 Node search","text":"

The node search operation in AVL trees is consistent with that in binary search trees and will not be detailed here.

"},{"location":"chapter_tree/avl_tree/#754-typical-applications-of-avl-trees","title":"7.5.4 \u00a0 Typical applications of AVL trees","text":"
  • Organizing and storing large amounts of data, suitable for scenarios with high-frequency searches and low-frequency intertions and removals.
  • Used to build index systems in databases.
  • Red-black trees are also a common type of balanced binary search tree. Compared to AVL trees, red-black trees have more relaxed balancing conditions, require fewer rotations for node insertion and removal, and have a higher average efficiency for node addition and removal operations.
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 Binary search tree","text":"

As shown in the Figure 7-16 , a \"binary search tree\" satisfies the following conditions.

  1. For the root node, the value of all nodes in the left subtree < the value of the root node < the value of all nodes in the right subtree.
  2. The left and right subtrees of any node are also binary search trees, i.e., they satisfy condition 1. as well.

Figure 7-16 \u00a0 Binary search tree

"},{"location":"chapter_tree/binary_search_tree/#741-operations-on-a-binary-search-tree","title":"7.4.1 \u00a0 Operations on a binary search tree","text":"

We encapsulate the binary search tree as a class BinarySearchTree and declare a member variable root, pointing to the tree's root node.

"},{"location":"chapter_tree/binary_search_tree/#1-searching-for-a-node","title":"1. \u00a0 Searching for a node","text":"

Given a target node value num, one can search according to the properties of the binary search tree. As shown in the Figure 7-17 , we declare a node cur and start from the binary tree's root node root, looping to compare the size relationship between the node value cur.val and num.

  • If cur.val < num, it means the target node is in cur's right subtree, thus execute cur = cur.right.
  • If cur.val > num, it means the target node is in cur's left subtree, thus execute cur = cur.left.
  • If cur.val = num, it means the target node is found, exit the loop and return the node.
<1><2><3><4>

Figure 7-17 \u00a0 Example of searching for a node in a binary search tree

The search operation in a binary search tree works on the same principle as the binary search algorithm, eliminating half of the possibilities in each round. The number of loops is at most the height of the binary tree. When the binary tree is balanced, it uses \\(O(\\log n)\\) time. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_search_tree/#2-inserting-a-node","title":"2. \u00a0 Inserting a node","text":"

Given an element num to be inserted, to maintain the property of the binary search tree \"left subtree < root node < right subtree,\" the insertion operation proceeds as shown in the Figure 7-18 .

  1. Finding the insertion position: Similar to the search operation, start from the root node and loop downwards according to the size relationship between the current node value and num until passing through the leaf node (traversing to None) then exit the loop.
  2. Insert the node at that position: Initialize the node num and place it where None was.

Figure 7-18 \u00a0 Inserting a node into a binary search tree

In the code implementation, note the following two points.

  • The binary search tree does not allow duplicate nodes; otherwise, it will violate its definition. Therefore, if the node to be inserted already exists in the tree, the insertion is not performed, and it directly returns.
  • To perform the insertion operation, we need to use the node pre to save the node from the last loop. This way, when traversing to None, we can get its parent node, thus completing the node insertion operation.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
Code Visualization

Full Screen >

Similar to searching for a node, inserting a node uses \\(O(\\log n)\\) time.

"},{"location":"chapter_tree/binary_search_tree/#3-removing-a-node","title":"3. \u00a0 Removing a node","text":"

First, find the target node in the binary tree, then remove it. Similar to inserting a node, we need to ensure that after the removal operation is completed, the property of the binary search tree \"left subtree < root node < right subtree\" is still satisfied. Therefore, based on the number of child nodes of the target node, we divide it into 0, 1, and 2 cases, performing the corresponding node removal operations.

As shown in the Figure 7-19 , when the degree of the node to be removed is \\(0\\), it means the node is a leaf node, and it can be directly removed.

Figure 7-19 \u00a0 Removing a node in a binary search tree (degree 0)

As shown in the Figure 7-20 , when the degree of the node to be removed is \\(1\\), replacing the node to be removed with its child node is sufficient.

Figure 7-20 \u00a0 Removing a node in a binary search tree (degree 1)

When the degree of the node to be removed is \\(2\\), we cannot remove it directly, but need to use a node to replace it. To maintain the property of the binary search tree \"left subtree < root node < right subtree,\" this node can be either the smallest node of the right subtree or the largest node of the left subtree.

Assuming we choose the smallest node of the right subtree (the next node in in-order traversal), then the removal operation proceeds as shown in the Figure 7-21 .

  1. Find the next node in the \"in-order traversal sequence\" of the node to be removed, denoted as tmp.
  2. Replace the value of the node to be removed with tmp's value, and recursively remove the node tmp in the tree.
<1><2><3><4>

Figure 7-21 \u00a0 Removing a node in a binary search tree (degree 2)

The operation of removing a node also uses \\(O(\\log n)\\) time, where finding the node to be removed requires \\(O(\\log n)\\) time, and obtaining the in-order traversal successor node requires \\(O(\\log n)\\) time. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_search_tree/#4-in-order-traversal-is-ordered","title":"4. \u00a0 In-order traversal is ordered","text":"

As shown in the Figure 7-22 , the in-order traversal of a binary tree follows the \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\" traversal order, and a binary search tree satisfies the size relationship \"left child node < root node < right child node\".

This means that in-order traversal in a binary search tree always traverses the next smallest node first, thus deriving an important property: The in-order traversal sequence of a binary search tree is ascending.

Using the ascending property of in-order traversal, obtaining ordered data in a binary search tree requires only \\(O(n)\\) time, without the need for additional sorting operations, which is very efficient.

Figure 7-22 \u00a0 In-order traversal sequence of a binary search tree

"},{"location":"chapter_tree/binary_search_tree/#742-efficiency-of-binary-search-trees","title":"7.4.2 \u00a0 Efficiency of binary search trees","text":"

Given a set of data, we consider using an array or a binary search tree for storage. Observing the Table 7-2 , the operations on a binary search tree all have logarithmic time complexity, which is stable and efficient. Only in scenarios of high-frequency addition and low-frequency search and removal, arrays are more efficient than binary search trees.

Table 7-2 \u00a0 Efficiency comparison between arrays and search trees

Unsorted array Binary search tree Search element \\(O(n)\\) \\(O(\\log n)\\) Insert element \\(O(1)\\) \\(O(\\log n)\\) Remove element \\(O(n)\\) \\(O(\\log n)\\)

In ideal conditions, the binary search tree is \"balanced,\" thus any node can be found within \\(\\log n\\) loops.

However, continuously inserting and removing nodes in a binary search tree may lead to the binary tree degenerating into a chain list as shown in the Figure 7-23 , at which point the time complexity of various operations also degrades to \\(O(n)\\).

Figure 7-23 \u00a0 Degradation of a binary search tree

"},{"location":"chapter_tree/binary_search_tree/#743-common-applications-of-binary-search-trees","title":"7.4.3 \u00a0 Common applications of binary search trees","text":"
  • Used as multi-level indexes in systems to implement efficient search, insertion, and removal operations.
  • Serves as the underlying data structure for certain search algorithms.
  • Used to store data streams to maintain their ordered state.
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 Binary tree","text":"

A \"binary tree\" is a non-linear data structure that represents the ancestral and descendent relationships, embodying the \"divide and conquer\" logic. Similar to a linked list, the basic unit of a binary tree is a node, each containing a value, a reference to the left child node, and a reference to the right child node.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"Binary tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.left: TreeNode | None = None  # Reference to left child node\n        self.right: TreeNode | None = None # Reference to right child node\n
/* Binary tree node */\nstruct TreeNode {\n    int val;          // Node value\n    TreeNode *left;   // Pointer to left child node\n    TreeNode *right;  // Pointer to right child node\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* Binary tree node */\nclass TreeNode {\n    int val;         // Node value\n    TreeNode left;   // Reference to left child node\n    TreeNode right;  // Reference to right child node\n    TreeNode(int x) { val = x; }\n}\n
/* Binary tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public TreeNode? left;  // Reference to left child node\n    public TreeNode? right; // Reference to right child node\n}\n
/* Binary tree node */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // Pointer to left child node\n        Right: nil, // Pointer to right child node\n        Val:   v,   // Node value\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var left: TreeNode? // Reference to left child node\n    var right: TreeNode? // Reference to right child node\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    val; // Node value\n    left; // Pointer to left child node\n    right; // Pointer to right child node\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // Node value\n        this.left = left === undefined ? null : left; // Reference to left child node\n        this.right = right === undefined ? null : right; // Reference to right child node\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n  int val;         // Node value\n  TreeNode? left;  // Reference to left child node\n  TreeNode? right; // Reference to right child node\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Binary tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    left: Option<Rc<RefCell<TreeNode>>>,    // Reference to left child node\n    right: Option<Rc<RefCell<TreeNode>>>,   // Reference to right child node\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* Binary tree node */\ntypedef struct TreeNode {\n    int val;                // Node value\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // Pointer to left child node\n    struct TreeNode *right; // Pointer to right child node\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* Binary tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val left: TreeNode? = null   // Reference to left child node\n    val right: TreeNode? = null  // Reference to right child node\n}\n
\n
\n

Each node has two references (pointers), pointing to the \"left-child node\" and \"right-child node,\" respectively. This node is called the \"parent node\" of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes under it the \"left subtree\" of this node. Similarly, the \"right subtree\" can be defined.

In a binary tree, except for leaf nodes, all other nodes contain child nodes and non-empty subtrees. As shown in the Figure 7-1 , if \"Node 2\" is considered as the parent node, then its left and right child nodes are \"Node 4\" and \"Node 5,\" respectively. The left subtree is \"the tree formed by Node 4 and all nodes under it,\" and the right subtree is \"the tree formed by Node 5 and all nodes under it.\"

Figure 7-1 \u00a0 Parent Node, child Node, subtree

"},{"location":"chapter_tree/binary_tree/#711-common-terminology-of-binary-trees","title":"7.1.1 \u00a0 Common terminology of binary trees","text":"

The commonly used terminology of binary trees is shown in the following figure.

  • \"Root node\": The node at the top level of the binary tree, which has no parent node.
  • \"Leaf node\": A node with no children, both of its pointers point to None.
  • \"Edge\": The line segment connecting two nodes, i.e., node reference (pointer).
  • The \"level\" of a node: Incrementing from top to bottom, with the root node's level being 1.
  • The \"degree\" of a node: The number of a node's children. In a binary tree, the degree can be 0, 1, or 2.
  • The \"height\" of a binary tree: The number of edges passed from the root node to the farthest leaf node.
  • The \"depth\" of a node: The number of edges passed from the root node to the node.
  • The \"height\" of a node: The number of edges from the farthest leaf node to the node.

Figure 7-2 \u00a0 Common Terminology of Binary Trees

Tip

Please note that we usually define \"height\" and \"depth\" as \"the number of edges passed,\" but some problems or textbooks may define them as \"the number of nodes passed.\" In this case, both height and depth need to be incremented by 1.

"},{"location":"chapter_tree/binary_tree/#712-basic-operations-of-binary-trees","title":"7.1.2 \u00a0 Basic operations of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-initializing-a-binary-tree","title":"1. \u00a0 Initializing a binary tree","text":"

Similar to a linked list, initialize nodes first, then construct references (pointers).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# Initializing a binary tree\n# Initializing nodes\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// Initializing nodes\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* Initializing a binary tree */\n// Initializing nodes\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// Linking references (pointers) between nodes\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// Initializing nodes\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* Initializing a binary tree */\n// Initializing nodes\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* Initializing a binary tree */\n// Initializing nodes\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// Initializing nodes\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// Linking references (pointers) between nodes\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// Initializing nodes\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
\n
binary_tree.zig
\n
Code visualization

https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_tree/binary_tree/#2-inserting-and-removing-nodes","title":"2. \u00a0 Inserting and removing nodes","text":"

Similar to a linked list, inserting and removing nodes in a binary tree can be achieved by modifying pointers. The Figure 7-3 provides an example.

Figure 7-3 \u00a0 Inserting and removing nodes in a binary tree

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# Inserting and removing nodes\np = TreeNode(0)\n# Inserting node P between n1 -> n2\nn1.left = p\np.left = n2\n# Removing node P\nn1.left = n2\n
binary_tree.cpp
/* Inserting and removing nodes */\nTreeNode* P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.cs
/* Inserting and removing nodes */\nTreeNode P = new(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.go
/* Inserting and removing nodes */\n// Inserting node P between n1 and n2\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// Removing node P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
binary_tree.js
/* Inserting and removing nodes */\nlet P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.ts
/* Inserting and removing nodes */\nconst P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.dart
/* Inserting and removing nodes */\nTreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// Inserting node P between n1 and n2\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// Removing node P\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* Inserting and removing nodes */\nTreeNode *P = newTreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
binary_tree.rb
\n
binary_tree.zig
\n
Code visualization

https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%E6%8F%92%E5%85%A5%E4%B8%8E%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%E5%9C%A8%20n1%20-%3E%20n2%20%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

Tip

It's important to note that inserting nodes may change the original logical structure of the binary tree, while removing nodes usually means removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a set of operations to achieve meaningful actions.

"},{"location":"chapter_tree/binary_tree/#713-common-types-of-binary-trees","title":"7.1.3 \u00a0 Common types of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-perfect-binary-tree","title":"1. \u00a0 Perfect binary tree","text":"

As shown in the Figure 7-4 , in a \"perfect binary tree,\" all levels of nodes are fully filled. In a perfect binary tree, the degree of leaf nodes is \\(0\\), and the degree of all other nodes is \\(2\\); if the tree's height is \\(h\\), then the total number of nodes is \\(2^{h+1} - 1\\), showing a standard exponential relationship, reflecting the common phenomenon of cell division in nature.

Tip

Please note that in the Chinese community, a perfect binary tree is often referred to as a \"full binary tree.\"

Figure 7-4 \u00a0 Perfect binary tree

"},{"location":"chapter_tree/binary_tree/#2-complete-binary-tree","title":"2. \u00a0 Complete binary tree","text":"

As shown in the Figure 7-5 , a \"complete binary tree\" has only the bottom level nodes not fully filled, and the bottom level nodes are filled as far left as possible.

Figure 7-5 \u00a0 Complete binary tree

"},{"location":"chapter_tree/binary_tree/#3-full-binary-tree","title":"3. \u00a0 Full binary tree","text":"

As shown in the Figure 7-6 , a \"full binary tree\" has all nodes except leaf nodes having two children.

Figure 7-6 \u00a0 Full binary tree

"},{"location":"chapter_tree/binary_tree/#4-balanced-binary-tree","title":"4. \u00a0 Balanced binary tree","text":"

As shown in the Figure 7-7 , in a \"balanced binary tree,\" the absolute difference in height between the left and right subtrees of any node does not exceed 1.

Figure 7-7 \u00a0 Balanced binary tree

"},{"location":"chapter_tree/binary_tree/#714-degeneration-of-binary-trees","title":"7.1.4 \u00a0 Degeneration of binary trees","text":"

The Figure 7-8 shows the ideal and degenerate structures of binary trees. When every level of a binary tree is filled, it reaches the \"perfect binary tree\"; when all nodes are biased towards one side, the binary tree degenerates into a \"linked list\".

  • The perfect binary tree is the ideal situation, fully leveraging the \"divide and conquer\" advantage of binary trees.
  • A linked list is another extreme, where operations become linear, degrading the time complexity to \\(O(n)\\).

Figure 7-8 \u00a0 The Best and Worst Structures of Binary Trees

As shown in the Table 7-1 , in the best and worst structures, the number of leaf nodes, total number of nodes, and height of the binary tree reach their maximum or minimum values.

Table 7-1 \u00a0 The Best and Worst Structures of Binary Trees

Perfect binary tree Linked list Number of nodes at level \\(i\\) \\(2^{i-1}\\) \\(1\\) Number of leaf nodes in a tree with height \\(h\\) \\(2^h\\) \\(1\\) Total number of nodes in a tree with height \\(h\\) \\(2^{h+1} - 1\\) \\(h + 1\\) Height of a tree with \\(n\\) total nodes \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 Binary tree traversal","text":"

From the perspective of physical structure, a tree is a data structure based on linked lists, hence its traversal method involves accessing nodes one by one through pointers. However, a tree is a non-linear data structure, which makes traversing a tree more complex than traversing a linked list, requiring the assistance of search algorithms to achieve.

Common traversal methods for binary trees include level-order traversal, preorder traversal, inorder traversal, and postorder traversal, among others.

"},{"location":"chapter_tree/binary_tree_traversal/#721-level-order-traversal","title":"7.2.1 \u00a0 Level-order traversal","text":"

As shown in the Figure 7-9 , \"level-order traversal\" traverses the binary tree from top to bottom, layer by layer, and accesses nodes in each layer in a left-to-right order.

Level-order traversal essentially belongs to \"breadth-first traversal\", also known as \"breadth-first search (BFS)\", which embodies a \"circumferentially outward expanding\" layer-by-layer traversal method.

Figure 7-9 \u00a0 Level-order traversal of a binary tree

"},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation","title":"1. \u00a0 Code implementation","text":"

Breadth-first traversal is usually implemented with the help of a \"queue\". The queue follows the \"first in, first out\" rule, while breadth-first traversal follows the \"layer-by-layer progression\" rule, the underlying ideas of the two are consistent. The implementation code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
binary_tree_bfs.cpp
/* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"
  • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time, where \\(n\\) is the number of nodes.
  • Space complexity is \\(O(n)\\): In the worst case, i.e., a full binary tree, before traversing to the lowest level, the queue can contain at most \\((n + 1) / 2\\) nodes at the same time, occupying \\(O(n)\\) space.
"},{"location":"chapter_tree/binary_tree_traversal/#722-preorder-inorder-and-postorder-traversal","title":"7.2.2 \u00a0 Preorder, inorder, and postorder traversal","text":"

Correspondingly, preorder, inorder, and postorder traversal all belong to \"depth-first traversal\", also known as \"depth-first search (DFS)\", which embodies a \"proceed to the end first, then backtrack and continue\" traversal method.

The Figure 7-10 shows the working principle of performing a depth-first traversal on a binary tree. Depth-first traversal is like walking around the perimeter of the entire binary tree, encountering three positions at each node, corresponding to preorder traversal, inorder traversal, and postorder traversal.

Figure 7-10 \u00a0 Preorder, inorder, and postorder traversal of a binary search tree

"},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation_1","title":"1. \u00a0 Code implementation","text":"

Depth-first search is usually implemented based on recursion:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
Code Visualization

Full Screen >

Tip

Depth-first search can also be implemented based on iteration, interested readers can study this on their own.

The Figure 7-11 shows the recursive process of preorder traversal of a binary tree, which can be divided into two opposite parts: \"recursion\" and \"return\".

  1. \"Recursion\" means starting a new method, the program accesses the next node in this process.
  2. \"Return\" means the function returns, indicating the current node has been fully accessed.
<1><2><3><4><5><6><7><8><9><10><11>

Figure 7-11 \u00a0 The recursive process of preorder traversal

"},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"
  • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time.
  • Space complexity is \\(O(n)\\): In the worst case, i.e., the tree degrades into a linked list, the recursion depth reaches \\(n\\), the system occupies \\(O(n)\\) stack frame space.
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 Summary","text":""},{"location":"chapter_tree/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A binary tree is a non-linear data structure that reflects the \"divide and conquer\" logic of splitting one into two. Each binary tree node contains a value and two pointers, which point to its left and right child nodes, respectively.
  • For a node in a binary tree, the tree formed by its left (right) child node and all nodes under it is called the node's left (right) subtree.
  • Related terminology of binary trees includes root node, leaf node, level, degree, edge, height, and depth, among others.
  • The operations of initializing a binary tree, inserting nodes, and removing nodes are similar to those of linked list operations.
  • Common types of binary trees include perfect binary trees, complete binary trees, full binary trees, and balanced binary trees. The perfect binary tree represents the ideal state, while the linked list is the worst state after degradation.
  • A binary tree can be represented using an array by arranging the node values and empty slots in a level-order traversal sequence and implementing pointers based on the index mapping relationship between parent nodes and child nodes.
  • The level-order traversal of a binary tree is a breadth-first search method, which reflects a layer-by-layer traversal manner of \"expanding circle by circle.\" It is usually implemented using a queue.
  • Pre-order, in-order, and post-order traversals are all depth-first search methods, reflecting the traversal manner of \"going to the end first, then backtracking to continue.\" They are usually implemented using recursion.
  • A binary search tree is an efficient data structure for element searching, with the time complexity of search, insert, and remove operations all being \\(O(\\log n)\\). When a binary search tree degrades into a linked list, these time complexities deteriorate to \\(O(n)\\).
  • An AVL tree, also known as a balanced binary search tree, ensures that the tree remains balanced after continuous node insertions and removals through rotation operations.
  • Rotation operations in an AVL tree include right rotation, left rotation, right-then-left rotation, and left-then-right rotation. After inserting or removing nodes, an AVL tree performs rotation operations from bottom to top to rebalance the tree.
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: For a binary tree with only one node, are both the height of the tree and the depth of the root node \\(0\\)?

Yes, because height and depth are typically defined as \"the number of edges passed.\"

Q: The insertion and removal in a binary tree are generally completed by a set of operations. What does \"a set of operations\" refer to here? Can it be understood as the release of resources of the child nodes?

Taking the binary search tree as an example, the operation of removing a node needs to be handled in three different scenarios, each requiring multiple steps of node operations.

Q: Why are there three sequences: pre-order, in-order, and post-order for DFS traversal of a binary tree, and what are their uses?

Similar to sequential and reverse traversal of arrays, pre-order, in-order, and post-order traversals are three methods of traversing a binary tree, allowing us to obtain a traversal result in a specific order. For example, in a binary search tree, since the node sizes satisfy left child node value < root node value < right child node value, we can obtain an ordered node sequence by traversing the tree in the \"left \u2192 root \u2192 right\" priority.

Q: In a right rotation operation that deals with the relationship between the imbalance nodes node, child, grand_child, isn't the connection between node and its parent node and the original link of node lost after the right rotation?

We need to view this problem from a recursive perspective. The right_rotate(root) operation passes the root node of the subtree and eventually returns the root node of the rotated subtree with return child. The connection between the subtree's root node and its parent node is established after this function returns, which is outside the scope of the right rotation operation's maintenance.

Q: In C++, functions are divided into private and public sections. What considerations are there for this? Why are the height() function and the updateHeight() function placed in public and private, respectively?

It depends on the scope of the method's use. If a method is only used within the class, then it is designed to be private. For example, it makes no sense for users to call updateHeight() on their own, as it is just a step in the insertion or removal operations. However, height() is for accessing node height, similar to vector.size(), thus it is set to public for use.

Q: How do you build a binary search tree from a set of input data? Is the choice of root node very important?

Yes, the method for building the tree is provided in the build_tree() method in the binary search tree code. As for the choice of the root node, we usually sort the input data and then select the middle element as the root node, recursively building the left and right subtrees. This approach maximizes the balance of the tree.

Q: In Java, do you always have to use the equals() method for string comparison?

In Java, for primitive data types, == is used to compare whether the values of two variables are equal. For reference types, the working principles of the two symbols are different.

  • ==: Used to compare whether two variables point to the same object, i.e., whether their positions in memory are the same.
  • equals(): Used to compare whether the values of two objects are equal.

Therefore, to compare values, we should use equals(). However, strings initialized with String a = \"hi\"; String b = \"hi\"; are stored in the string constant pool and point to the same object, so a == b can also be used to compare the contents of two strings.

Q: Before reaching the bottom level, is the number of nodes in the queue \\(2^h\\) in breadth-first traversal?

Yes, for example, a full binary tree with height \\(h = 2\\) has a total of \\(n = 7\\) nodes, then the bottom level has \\(4 = 2^h = (n + 1) / 2\\) nodes.

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"chapter_array_and_linkedlist/","title":"Chapter 4. \u00a0 Arrays and linked lists","text":"

Abstract

The world of data structures resembles a sturdy brick wall.

In arrays, envision bricks snugly aligned, each resting seamlessly beside the next, creating a unified formation. Meanwhile, in linked lists, these bricks disperse freely, embraced by vines gracefully knitting connections between them.

"},{"location":"chapter_array_and_linkedlist/#chapter-contents","title":"Chapter contents","text":"
  • 4.1 \u00a0 Array
  • 4.2 \u00a0 Linked list
  • 4.3 \u00a0 List
  • 4.4 \u00a0 Memory and cache
  • 4.5 \u00a0 Summary
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 Array","text":"

An \"array\" is a linear data structure that operates as a lineup of similar items, stored together in a computer's memory in contiguous spaces. It's like a sequence that maintains organized storage. Each item in this lineup has its unique 'spot' known as an \"index\". Please refer to the Figure 4-1 to observe how arrays work and grasp these key terms.

Figure 4-1 \u00a0 Array definition and storage method

"},{"location":"chapter_array_and_linkedlist/array/#411-common-operations-on-arrays","title":"4.1.1 \u00a0 Common operations on arrays","text":""},{"location":"chapter_array_and_linkedlist/array/#1-initializing-arrays","title":"1. \u00a0 Initializing arrays","text":"

Arrays can be initialized in two ways depending on the needs: either without initial values or with specified initial values. When initial values are not specified, most programming languages will set the array elements to \\(0\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig array.py
# Initialize array\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]\n
array.cpp
/* Initialize array */\n// Stored on stack\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// Stored on heap (manual memory release needed)\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* Initialize array */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* Initialize array */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* Initialize array */\nvar arr [5]int\n// In Go, specifying the length ([5]int) denotes an array, while not specifying it ([]int) denotes a slice.\n// Since Go's arrays are designed to have compile-time fixed length, only constants can be used to specify the length.\n// For convenience in implementing the extend() method, the Slice will be considered as an Array here.\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* Initialize array */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* Initialize array */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* Initialize array */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* Initialize array */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* Initialize array */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* Initialize array */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
\n
array.zig
// Initialize array\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
"},{"location":"chapter_array_and_linkedlist/array/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

Elements in an array are stored in contiguous memory spaces, making it simpler to compute each element's memory address. The formula shown in the Figure below aids in determining an element's memory address, utilizing the array's memory address (specifically, the first element's address) and the element's index. This computation streamlines direct access to the desired element.

Figure 4-2 \u00a0 Memory address calculation for array elements

As observed in the above illustration, array indexing conventionally begins at \\(0\\). While this might appear counterintuitive, considering counting usually starts at \\(1\\), within the address calculation formula, an index is essentially an offset from the memory address. For the first element's address, this offset is \\(0\\), validating its index as \\(0\\).

Accessing elements in an array is highly efficient, allowing us to randomly access any element in \\(O(1)\\) time.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#3-inserting-elements","title":"3. \u00a0 Inserting elements","text":"

Array elements are tightly packed in memory, with no space available to accommodate additional data between them. Illustrated in Figure below, inserting an element in the middle of an array requires shifting all subsequent elements back by one position to create room for the new element.

Figure 4-3 \u00a0 Array element insertion example

It's important to note that due to the fixed length of an array, inserting an element will unavoidably result in the loss of the last element in the array. Solutions to address this issue will be explored in the \"List\" chapter.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#4-deleting-elements","title":"4. \u00a0 Deleting elements","text":"

Similarly, as depicted in the Figure 4-4 , to delete an element at index \\(i\\), all elements following index \\(i\\) must be moved forward by one position.

Figure 4-4 \u00a0 Array element deletion example

Please note that after deletion, the former last element becomes \"meaningless,\" hence requiring no specific modification.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
Code Visualization

Full Screen >

In summary, the insertion and deletion operations in arrays present the following disadvantages:

  • High time complexity: Both insertion and deletion in an array have an average time complexity of \\(O(n)\\), where \\(n\\) is the length of the array.
  • Loss of elements: Due to the fixed length of arrays, elements that exceed the array's capacity are lost during insertion.
  • Waste of memory: Initializing a longer array and utilizing only the front part results in \"meaningless\" end elements during insertion, leading to some wasted memory space.
"},{"location":"chapter_array_and_linkedlist/array/#5-traversing-arrays","title":"5. \u00a0 Traversing arrays","text":"

In most programming languages, we can traverse an array either by using indices or by directly iterating over each element:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#6-finding-elements","title":"6. \u00a0 Finding elements","text":"

Locating a specific element within an array involves iterating through the array, checking each element to determine if it matches the desired value.

Because arrays are linear data structures, this operation is commonly referred to as \"linear search.\"

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#7-expanding-arrays","title":"7. \u00a0 Expanding arrays","text":"

In complex system environments, ensuring the availability of memory space after an array for safe capacity extension becomes challenging. Consequently, in most programming languages, the length of an array is immutable.

To expand an array, it's necessary to create a larger array and then copy the elements from the original array. This operation has a time complexity of \\(O(n)\\) and can be time-consuming for large arrays. The code are as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
array.cpp
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.java
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.go
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.swift
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.js
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.ts
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.dart
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
array.rs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
array.c
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.kt
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.rb
### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
array.zig
// \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/array/#412-advantages-and-limitations-of-arrays","title":"4.1.2 \u00a0 Advantages and limitations of arrays","text":"

Arrays are stored in contiguous memory spaces and consist of elements of the same type. This approach provides substantial prior information that systems can leverage to optimize the efficiency of data structure operations.

  • High space efficiency: Arrays allocate a contiguous block of memory for data, eliminating the need for additional structural overhead.
  • Support for random access: Arrays allow \\(O(1)\\) time access to any element.
  • Cache locality: When accessing array elements, the computer not only loads them but also caches the surrounding data, utilizing high-speed cache to enchance subsequent operation speeds.

However, continuous space storage is a double-edged sword, with the following limitations:

  • Low efficiency in insertion and deletion: As arrays accumulate many elements, inserting or deleting elements requires shifting a large number of elements.
  • Fixed length: The length of an array is fixed after initialization. Expanding an array requires copying all data to a new array, incurring significant costs.
  • Space wastage: If the allocated array size exceeds the what is necessary, the extra space is wasted.
"},{"location":"chapter_array_and_linkedlist/array/#413-typical-applications-of-arrays","title":"4.1.3 \u00a0 Typical applications of arrays","text":"

Arrays are fundamental and widely used data structures. They find frequent application in various algorithms and serve in the implementation of complex data structures.

  • Random access: Arrays are ideal for storing data when random sampling is required. By generating a random sequence based on indices, we can achieve random sampling efficiently.
  • Sorting and searching: Arrays are the most commonly used data structure for sorting and searching algorithms. Techniques like quick sort, merge sort, binary search, etc., are primarily operate on arrays.
  • Lookup tables: Arrays serve as efficient lookup tables for quick element or relationship retrieval. For instance, mapping characters to ASCII codes becomes seamless by using the ASCII code values as indices and storing corresponding elements in the array.
  • Machine learning: Within the domain of neural networks, arrays play a pivotal role in executing crucial linear algebra operations involving vectors, matrices, and tensors. Arrays serve as the primary and most extensively used data structure in neural network programming.
  • Data structure implementation: Arrays serve as the building blocks for implementing various data structures like stacks, queues, hash tables, heaps, graphs, etc. For instance, the adjacency matrix representation of a graph is essentially a two-dimensional array.
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 Linked list","text":"

Memory space is a shared resource among all programs. In a complex system environment, available memory can be dispersed throughout the memory space. We understand that the memory allocated for an array must be continuous. However, for very large arrays, finding a sufficiently large contiguous memory space might be challenging. This is where the flexible advantage of linked lists becomes evident.

A \"linked list\" is a linear data structure in which each element is a node object, and the nodes are interconnected through \"references\". These references hold the memory addresses of subsequent nodes, enabling navigation from one node to the next.

The design of linked lists allows for their nodes to be distributed across memory locations without requiring contiguous memory addresses.

Figure 4-5 \u00a0 Linked list definition and storage method

As shown in the figure, we see that the basic building block of a linked list is the \"node\" object. Each node comprises two key components: the node's \"value\" and a \"reference\" to the next node.

  • The first node in a linked list is the \"head node\", and the final one is the \"tail node\".
  • The tail node points to \"null\", designated as null in Java, nullptr in C++, and None in Python.
  • In languages that support pointers, like C, C++, Go, and Rust, this \"reference\" is typically implemented as a \"pointer\".

As the code below illustrates, a ListNode in a linked list, besides holding a value, must also maintain an additional reference (or pointer). Therefore, a linked list occupies more memory space than an array when storing the same quantity of data..

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class ListNode:\n    \"\"\"Linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # Node value\n        self.next: ListNode | None = None # Reference to the next node\n
/* Linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the next node\n    ListNode(int x) : val(x), next(nullptr) {}  // Constructor\n};\n
/* Linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
/* Linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;         // Node value\n    ListNode? next;      // Reference to the next node\n}\n
/* Linked list node structure */\ntype ListNode struct {\n    Val  int       // Node value\n    Next *ListNode // Pointer to the next node\n}\n\n// NewListNode Constructor, creates a new linked list\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // Node value\n        this.next = (next === undefined ? null : next); // Reference to the next node\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // Node value\n        this.next = next === undefined ? null : next;  // Reference to the next node\n    }\n}\n
/* Linked list node class */\nclass ListNode {\n  int val; // Node value\n  ListNode? next; // Reference to the next node\n  ListNode(this.val, [this.next]); // Constructor\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* Linked list node class */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to the next node\n}\n
/* Linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the next node\n} ListNode;\n\n/* Constructor */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
\n
// Linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the next node\n\n        // Constructor\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421-common-operations-on-linked-lists","title":"4.2.1 \u00a0 Common operations on linked lists","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1-initializing-a-linked-list","title":"1. \u00a0 Initializing a linked list","text":"

Constructing a linked list is a two-step process: first, initializing each node object, and second, forming the reference links between the nodes. After initialization, we can traverse all nodes sequentially from the head node by following the next reference.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig linked_list.py
# Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4\n# Initialize each node\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// Build references between nodes\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// Build references between nodes\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
\n
linked_list.zig
// Initialize linked list\n// Initialize each node\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// Build references between nodes\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n

The array as a whole is a variable, for instance, the array nums includes elements like nums[0], nums[1], and so on, whereas a linked list is made up of several distinct node objects. We typically refer to a linked list by its head node, for example, the linked list in the previous code snippet is referred to as n0.

"},{"location":"chapter_array_and_linkedlist/linked_list/#2-inserting-nodes","title":"2. \u00a0 Inserting nodes","text":"

Inserting a node into a linked list is very easy. As shown in the figure, let's assume we aim to insert a new node P between two adjacent nodes n0 and n1. This can be achieved by simply modifying two node references (pointers), with a time complexity of \\(O(1)\\).

By comparison, inserting an element into an array has a time complexity of \\(O(n)\\), which becomes less efficient when dealing with large data volumes.

Figure 4-6 \u00a0 Linked list node insertion example

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3-deleting-nodes","title":"3. \u00a0 Deleting nodes","text":"

As shown in the figure, deleting a node from a linked list is also very easy, involving only the modification of a single node's reference (pointer).

It's important to note that even though node P continues to point to n1 after being deleted, it becomes inaccessible during linked list traversal. This effectively means that P is no longer a part of the linked list.

Figure 4-7 \u00a0 Linked list node deletion

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
linked_list.kt
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4-accessing-nodes","title":"4. \u00a0 Accessing nodes","text":"

Accessing nodes in a linked list is less efficient. As previously mentioned, any element in an array can be accessed in \\(O(1)\\) time. In contrast, with a linked list, the program involves starting from the head node and sequentially traversing through the nodes until the desired node is found. In other words, to access the \\(i\\)-th node in a linked list, the program must iterate through \\(i - 1\\) nodes, resulting in a time complexity of \\(O(n)\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5-finding-nodes","title":"5. \u00a0 Finding nodes","text":"

Traverse the linked list to locate a node whose value matches target, and then output the index of that node within the linked list. This procedure is also an example of linear search. The corresponding code is provided below:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-arrays-vs-linked-lists","title":"4.2.2 \u00a0 Arrays vs. linked lists","text":"

The Table 4-1 summarizes the characteristics of arrays and linked lists, and it also compares their efficiencies in various operations. Because they utilize opposing storage strategies, their respective properties and operational efficiencies exhibit distinct contrasts.

Table 4-1 \u00a0 Efficiency comparison of arrays and linked lists

Arrays Linked Lists Storage Contiguous Memory Space Dispersed Memory Space Capacity Expansion Fixed Length Flexible Expansion Memory Efficiency Less Memory per Element, Potential Space Wastage More Memory per Element Accessing Elements \\(O(1)\\) \\(O(n)\\) Adding Elements \\(O(n)\\) \\(O(1)\\) Deleting Elements \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423-common-types-of-linked-lists","title":"4.2.3 \u00a0 Common types of linked lists","text":"

As shown in the figure, there are three common types of linked lists.

  • Singly linked list: This is the standard linked list described earlier. Nodes in a singly linked list include a value and a reference to the next node. The first node is known as the head node, and the last node, which points to null (None), is the tail node.
  • Circular linked list: This is formed when the tail node of a singly linked list points back to the head node, creating a loop. In a circular linked list, any node can function as the head node.
  • Doubly linked list: In contrast to a singly linked list, a doubly linked list maintains references in two directions. Each node contains references (pointer) to both its successor (the next node) and predecessor (the previous node). Although doubly linked lists offer more flexibility for traversing in either direction, they also consume more memory space.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class ListNode:\n    \"\"\"Bidirectional linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.next: ListNode | None = None  # Reference to the successor node\n        self.prev: ListNode | None = None  # Reference to a predecessor node\n
/* Bidirectional linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the successor node\n    ListNode *prev;  // Pointer to the predecessor node\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // Constructor\n};\n
/* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
/* Bidirectional linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;    // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n}\n
/* Bidirectional linked list node structure */\ntype DoublyListNode struct {\n    Val  int             // Node value\n    Next *DoublyListNode // Pointer to the successor node\n    Prev *DoublyListNode // Pointer to the predecessor node\n}\n\n// NewDoublyListNode initialization\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n    var prev: ListNode? // Reference to the predecessor node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
/* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(this.val, [this.next, this.prev]);  // Constructor\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Bidirectional linked list node type */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to successor node\n    prev: Option<Rc<RefCell<ListNode>>>, // Pointer to predecessor node\n}\n\n/* Constructors */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* Bidirectional linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the successor node\n    struct ListNode *prev; // Pointer to the predecessor node\n} ListNode;\n\n/* Constructors */\nListNode *newListNode(int val) {\n    ListNode *node, *next;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
\n
// Bidirectional linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the successor node\n        prev: ?*Self = null, // Pointer to the predecessor node\n\n        // Constructor\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

Figure 4-8 \u00a0 Common types of linked lists

"},{"location":"chapter_array_and_linkedlist/linked_list/#424-typical-applications-of-linked-lists","title":"4.2.4 \u00a0 Typical applications of linked lists","text":"

Singly linked lists are frequently utilized in implementing stacks, queues, hash tables, and graphs.

  • Stacks and queues: In singly linked lists, if insertions and deletions occur at the same end, it behaves like a stack (last-in-first-out). Conversely, if insertions are at one end and deletions at the other, it functions like a queue (first-in-first-out).
  • Hash tables: Linked lists are used in chaining, a popular method for resolving hash collisions. Here, all collided elements are grouped into a linked list.
  • Graphs: Adjacency lists, a standard method for graph representation, associate each graph vertex with a linked list. This list contains elements that represent vertices connected to the corresponding vertex.

Doubly linked lists are ideal for scenarios requiring rapid access to preceding and succeeding elements.

  • Advanced data structures: In structures like red-black trees and B-trees, accessing a node's parent is essential. This is achieved by incorporating a reference to the parent node in each node, akin to a doubly linked list.
  • Browser history: In web browsers, doubly linked lists facilitate navigating the history of visited pages when users click forward or back.
  • LRU algorithm: Doubly linked lists are apt for Least Recently Used (LRU) cache eviction algorithms, enabling swift identification of the least recently used data and facilitating fast node addition and removal.

Circular linked lists are ideal for applications that require periodic operations, such as resource scheduling in operating systems.

  • Round-robin scheduling algorithm: In operating systems, the round-robin scheduling algorithm is a common CPU scheduling method, requiring cycling through a group of processes. Each process is assigned a time slice, and upon expiration, the CPU rotates to the next process. This cyclical operation can be efficiently realized using a circular linked list, allowing for a fair and time-shared system among all processes.
  • Data buffers: Circular linked lists are also used in data buffers, like in audio and video players, where the data stream is divided into multiple buffer blocks arranged in a circular fashion for seamless playback.
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 List","text":"

A \"list\" is an abstract data structure concept that represents an ordered collection of elements, supporting operations such as element access, modification, addition, deletion, and traversal, without requiring users to consider capacity limitations. Lists can be implemented based on linked lists or arrays.

  • A linked list inherently serves as a list, supporting operations for adding, deleting, searching, and modifying elements, with the flexibility to dynamically adjust its size.
  • Arrays also support these operations, but due to their immutable length, they can be considered as a list with a length limit.

When implementing lists using arrays, the immutability of length reduces the practicality of the list. This is because predicting the amount of data to be stored in advance is often challenging, making it difficult to choose an appropriate list length. If the length is too small, it may not meet the requirements; if too large, it may waste memory space.

To solve this problem, we can implement lists using a \"dynamic array.\" It inherits the advantages of arrays and can dynamically expand during program execution.

In fact, many programming languages' standard libraries implement lists using dynamic arrays, such as Python's list, Java's ArrayList, C++'s vector, and C#'s List. In the following discussion, we will consider \"list\" and \"dynamic array\" as synonymous concepts.

"},{"location":"chapter_array_and_linkedlist/list/#431-common-list-operations","title":"4.3.1 \u00a0 Common list operations","text":""},{"location":"chapter_array_and_linkedlist/list/#1-initializing-a-list","title":"1. \u00a0 Initializing a list","text":"

We typically use two initialization methods: \"without initial values\" and \"with initial values\".

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Initialize list\n# Without initial values\nnums1: list[int] = []\n# With initial values\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* Initialize list */\n// Note, in C++ the vector is the equivalent of nums described here\n// Without initial values\nvector<int> nums1;\n// With initial values\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* Initialize list */\n// Without initial values\nList<Integer> nums1 = new ArrayList<>();\n// With initial values (note the element type should be the wrapper class Integer[] for int[])\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* Initialize list */\n// Without initial values\nnums1 := []int{}\n// With initial values\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* Initialize list */\n// Without initial values\nlet nums1: [Int] = []\n// With initial values\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* Initialize list */\n// Without initial values\nconst nums1 = [];\n// With initial values\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* Initialize list */\n// Without initial values\nconst nums1: number[] = [];\n// With initial values\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* Initialize list */\n// Without initial values\nlet nums1: Vec<i32> = Vec::new();\n// With initial values\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Initialize list\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
"},{"location":"chapter_array_and_linkedlist/list/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

Lists are essentially arrays, thus they can access and update elements in \\(O(1)\\) time, which is very efficient.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Access elements\nnum: int = nums[1]  # Access the element at index 1\n\n# Update elements\nnums[1] = 0    # Update the element at index 1 to 0\n
list.cpp
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.java
/* Access elements */\nint num = nums.get(1);  // Access the element at index 1\n\n/* Update elements */\nnums.set(1, 0);  // Update the element at index 1 to 0\n
list.cs
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list_test.go
/* Access elements */\nnum := nums[1]  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0     // Update the element at index 1 to 0\n
list.swift
/* Access elements */\nlet num = nums[1] // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0 // Update the element at index 1 to 0\n
list.js
/* Access elements */\nconst num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.ts
/* Access elements */\nconst num: number = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.dart
/* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
list.rs
/* Access elements */\nlet num: i32 = nums[1];  // Access the element at index 1\n/* Update elements */\nnums[1] = 0;             // Update the element at index 1 to 0\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Access elements\nvar num = nums.items[1]; // Access the element at index 1\n\n// Update elements\nnums.items[1] = 0; // Update the element at index 1 to 0  \n
"},{"location":"chapter_array_and_linkedlist/list/#3-inserting-and-removing-elements","title":"3. \u00a0 Inserting and removing elements","text":"

Compared to arrays, lists offer more flexibility in adding and removing elements. While adding elements to the end of a list is an \\(O(1)\\) operation, the efficiency of inserting and removing elements elsewhere in the list remains the same as in arrays, with a time complexity of \\(O(n)\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Clear list\nnums.clear()\n\n# Append elements at the end\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# Insert element in the middle\nnums.insert(3, 6)  # Insert number 6 at index 3\n\n# Remove elements\nnums.pop(3)        # Remove the element at index 3\n
list.cpp
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* Insert element in the middle */\nnums.insert(nums.begin() + 3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.erase(nums.begin() + 3);      // Remove the element at index 3\n
list.java
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.add(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);  // Remove the element at index 3\n
list.cs
/* Clear list */\nnums.Clear();\n\n/* Append elements at the end */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* Insert element in the middle */\nnums.Insert(3, 6);\n\n/* Remove elements */\nnums.RemoveAt(3);\n
list_test.go
/* Clear list */\nnums = nil\n\n/* Append elements at the end */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* Insert element in the middle */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Insert number 6 at index 3\n\n/* Remove elements */\nnums = append(nums[:3], nums[4:]...) // Remove the element at index 3\n
list.swift
/* Clear list */\nnums.removeAll()\n\n/* Append elements at the end */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* Insert element in the middle */\nnums.insert(6, at: 3) // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(at: 3) // Remove the element at index 3\n
list.js
/* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
list.ts
/* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
list.dart
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6); // Insert number 6 at index 3\n\n/* Remove elements */\nnums.removeAt(3); // Remove the element at index 3\n
list.rs
/* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);    // Remove the element at index 3\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Clear list\nnums.clearRetainingCapacity();\n\n// Append elements at the end\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// Insert element in the middle\ntry nums.insert(3, 6); // Insert number 6 at index 3\n\n// Remove elements\n_ = nums.orderedRemove(3); // Remove the element at index 3\n
"},{"location":"chapter_array_and_linkedlist/list/#4-iterating-the-list","title":"4. \u00a0 Iterating the list","text":"

Similar to arrays, lists can be iterated either by using indices or by directly iterating through each element.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Iterate through the list by index\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# Iterate directly through list elements\nfor num in nums:\n    count += num\n
list.cpp
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* Iterate directly through list elements */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* Iterate through the list by index */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* Iterate through the list by index */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* Iterate through the list by index */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// Iterate through the list by index\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// Iterate directly through list elements\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Iterate through the list by index\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// Iterate directly through list elements\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
"},{"location":"chapter_array_and_linkedlist/list/#5-concatenating-lists","title":"5. \u00a0 Concatenating lists","text":"

Given a new list nums1, we can append it to the end of the original list.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Concatenate two lists\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # Concatenate nums1 to the end of nums\n
list.cpp
/* Concatenate two lists */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// Concatenate nums1 to the end of nums\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* Concatenate two lists */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
list.cs
/* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // Concatenate nums1 to the end of nums\n
list_test.go
/* Concatenate two lists */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // Concatenate nums1 to the end of nums\n
list.swift
/* Concatenate two lists */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // Concatenate nums1 to the end of nums\n
list.js
/* Concatenate two lists */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
list.ts
/* Concatenate two lists */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
list.dart
/* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
list.rs
/* Concatenate two lists */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Concatenate two lists\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // Concatenate nums1 to the end of nums\n
"},{"location":"chapter_array_and_linkedlist/list/#6-sorting-the-list","title":"6. \u00a0 Sorting the list","text":"

Once the list is sorted, we can employ algorithms commonly used in array-related algorithm problems, such as \"binary search\" and \"two-pointer\" algorithms.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
# Sort the list\nnums.sort()  # After sorting, the list elements are in ascending order\n
list.cpp
/* Sort the list */\nsort(nums.begin(), nums.end());  // After sorting, the list elements are in ascending order\n
list.java
/* Sort the list */\nCollections.sort(nums);  // After sorting, the list elements are in ascending order\n
list.cs
/* Sort the list */\nnums.Sort(); // After sorting, the list elements are in ascending order\n
list_test.go
/* Sort the list */\nsort.Ints(nums)  // After sorting, the list elements are in ascending order\n
list.swift
/* Sort the list */\nnums.sort() // After sorting, the list elements are in ascending order\n
list.js
/* Sort the list */  \nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
list.ts
/* Sort the list */\nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
list.dart
/* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
list.rs
/* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
list.c
// C does not provide built-in dynamic arrays\n
list.kt
\n
list.zig
// Sort the list\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
"},{"location":"chapter_array_and_linkedlist/list/#432-list-implementation","title":"4.3.2 \u00a0 List implementation","text":"

Many programming languages come with built-in lists, including Java, C++, Python, etc. Their implementations tend to be intricate, featuring carefully considered settings for various parameters, like initial capacity and expansion factors. Readers who are curious can delve into the source code for further learning.

To enhance our understanding of how lists work, we will attempt to implement a simplified version of a list, focusing on three crucial design aspects:

  • Initial capacity: Choose a reasonable initial capacity for the array. In this example, we choose 10 as the initial capacity.
  • Size recording: Declare a variable size to record the current number of elements in the list, updating in real-time with element insertion and deletion. With this variable, we can locate the end of the list and determine whether expansion is needed.
  • Expansion mechanism: If the list reaches full capacity upon an element insertion, an expansion process is required. This involves creating a larger array based on the expansion factor, and then transferring all elements from the current array to the new one. In this example, we stipulate that the array size should double with each expansion.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 Memory and cache *","text":"

In the first two sections of this chapter, we explored arrays and linked lists, two fundamental and important data structures, representing \"continuous storage\" and \"dispersed storage\" respectively.

In fact, the physical structure largely determines the efficiency of a program's use of memory and cache, which in turn affects the overall performance of the algorithm.

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441-computer-storage-devices","title":"4.4.1 \u00a0 Computer storage devices","text":"

There are three types of storage devices in computers: \"hard disk,\" \"random-access memory (RAM),\" and \"cache memory.\" The following table shows their different roles and performance characteristics in computer systems.

Table 4-2 \u00a0 Computer storage devices

Hard Disk Memory Cache Usage Long-term storage of data, including OS, programs, files, etc. Temporary storage of currently running programs and data being processed Stores frequently accessed data and instructions, reducing the number of CPU accesses to memory Volatility Data is not lost after power off Data is lost after power off Data is lost after power off Capacity Larger, TB level Smaller, GB level Very small, MB level Speed Slower, several hundred to thousands MB/s Faster, several tens of GB/s Very fast, several tens to hundreds of GB/s Price Cheaper, several cents to yuan / GB More expensive, tens to hundreds of yuan / GB Very expensive, priced with CPU

We can imagine the computer storage system as a pyramid structure shown in the Figure 4-9 . The storage devices closer to the top of the pyramid are faster, have smaller capacity, and are more costly. This multi-level design is not accidental, but the result of careful consideration by computer scientists and engineers.

  • Hard disks are difficult to replace with memory. Firstly, data in memory is lost after power off, making it unsuitable for long-term data storage; secondly, the cost of memory is dozens of times that of hard disks, making it difficult to popularize in the consumer market.
  • It is difficult for caches to have both large capacity and high speed. As the capacity of L1, L2, L3 caches gradually increases, their physical size becomes larger, increasing the physical distance from the CPU core, leading to increased data transfer time and higher element access latency. Under current technology, a multi-level cache structure is the best balance between capacity, speed, and cost.

Figure 4-9 \u00a0 Computer storage system

Tip

The storage hierarchy of computers reflects a delicate balance between speed, capacity, and cost. In fact, this kind of trade-off is common in all industrial fields, requiring us to find the best balance between different advantages and limitations.

Overall, hard disks are used for long-term storage of large amounts of data, memory is used for temporary storage of data being processed during program execution, and cache is used to store frequently accessed data and instructions to improve program execution efficiency. Together, they ensure the efficient operation of computer systems.

As shown in the Figure 4-10 , during program execution, data is read from the hard disk into memory for CPU computation. The cache can be considered a part of the CPU, smartly loading data from memory to provide fast data access to the CPU, significantly enhancing program execution efficiency and reducing reliance on slower memory.

Figure 4-10 \u00a0 Data flow between hard disk, memory, and cache

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442-memory-efficiency-of-data-structures","title":"4.4.2 \u00a0 Memory efficiency of data structures","text":"

In terms of memory space utilization, arrays and linked lists have their advantages and limitations.

On one hand, memory is limited and cannot be shared by multiple programs, so we hope that data structures can use space as efficiently as possible. The elements of an array are tightly packed without extra space for storing references (pointers) between linked list nodes, making them more space-efficient. However, arrays require allocating sufficient continuous memory space at once, which may lead to memory waste, and array expansion also requires additional time and space costs. In contrast, linked lists allocate and reclaim memory dynamically on a per-node basis, providing greater flexibility.

On the other hand, during program execution, as memory is repeatedly allocated and released, the degree of fragmentation of free memory becomes higher, leading to reduced memory utilization efficiency. Arrays, due to their continuous storage method, are relatively less likely to cause memory fragmentation. In contrast, the elements of a linked list are dispersedly stored, and frequent insertion and deletion operations make memory fragmentation more likely.

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443-cache-efficiency-of-data-structures","title":"4.4.3 \u00a0 Cache efficiency of data structures","text":"

Although caches are much smaller in space capacity than memory, they are much faster and play a crucial role in program execution speed. Since the cache's capacity is limited and can only store a small part of frequently accessed data, when the CPU tries to access data not in the cache, a \"cache miss\" occurs, forcing the CPU to load the needed data from slower memory.

Clearly, the fewer the cache misses, the higher the CPU's data read-write efficiency, and the better the program performance. The proportion of successful data retrieval from the cache by the CPU is called the \"cache hit rate,\" a metric often used to measure cache efficiency.

To achieve higher efficiency, caches adopt the following data loading mechanisms.

  • Cache lines: Caches don't store and load data byte by byte but in units of cache lines. Compared to byte-by-byte transfer, the transmission of cache lines is more efficient.
  • Prefetch mechanism: Processors try to predict data access patterns (such as sequential access, fixed stride jumping access, etc.) and load data into the cache according to specific patterns to improve the hit rate.
  • Spatial locality: If data is accessed, data nearby is likely to be accessed in the near future. Therefore, when loading certain data, the cache also loads nearby data to improve the hit rate.
  • Temporal locality: If data is accessed, it's likely to be accessed again in the near future. Caches use this principle to retain recently accessed data to improve the hit rate.

In fact, arrays and linked lists have different cache utilization efficiencies, mainly reflected in the following aspects.

  • Occupied space: Linked list elements occupy more space than array elements, resulting in less effective data volume in the cache.
  • Cache lines: Linked list data is scattered throughout memory, and since caches load \"by line,\" the proportion of loading invalid data is higher.
  • Prefetch mechanism: The data access pattern of arrays is more \"predictable\" than that of linked lists, meaning the system is more likely to guess which data will be loaded next.
  • Spatial locality: Arrays are stored in concentrated memory spaces, so the data near the loaded data is more likely to be accessed next.

Overall, arrays have a higher cache hit rate and are generally more efficient in operation than linked lists. This makes data structures based on arrays more popular in solving algorithmic problems.

It should be noted that high cache efficiency does not mean that arrays are always better than linked lists. Which data structure to choose in actual applications should be based on specific requirements. For example, both arrays and linked lists can implement the \"stack\" data structure (which will be detailed in the next chapter), but they are suitable for different scenarios.

  • In algorithm problems, we tend to choose stacks based on arrays because they provide higher operational efficiency and random access capabilities, with the only cost being the need to pre-allocate a certain amount of memory space for the array.
  • If the data volume is very large, highly dynamic, and the expected size of the stack is difficult to estimate, then a stack based on a linked list is more appropriate. Linked lists can disperse a large amount of data in different parts of the memory and avoid the additional overhead of array expansion.
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 Summary","text":""},{"location":"chapter_array_and_linkedlist/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Arrays and linked lists are two basic data structures, representing two storage methods in computer memory: contiguous space storage and non-contiguous space storage. Their characteristics complement each other.
  • Arrays support random access and use less memory; however, they are inefficient in inserting and deleting elements and have a fixed length after initialization.
  • Linked lists implement efficient node insertion and deletion through changing references (pointers) and can flexibly adjust their length; however, they have lower node access efficiency and consume more memory.
  • Common types of linked lists include singly linked lists, circular linked lists, and doubly linked lists, each with its own application scenarios.
  • Lists are ordered collections of elements that support addition, deletion, and modification, typically implemented based on dynamic arrays, retaining the advantages of arrays while allowing flexible length adjustment.
  • The advent of lists significantly enhanced the practicality of arrays but may lead to some memory space wastage.
  • During program execution, data is mainly stored in memory. Arrays provide higher memory space efficiency, while linked lists are more flexible in memory usage.
  • Caches provide fast data access to CPUs through mechanisms like cache lines, prefetching, spatial locality, and temporal locality, significantly enhancing program execution efficiency.
  • Due to higher cache hit rates, arrays are generally more efficient than linked lists. When choosing a data structure, the appropriate choice should be made based on specific needs and scenarios.
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Does storing arrays on the stack versus the heap affect time and space efficiency?

Arrays stored on both the stack and heap are stored in contiguous memory spaces, and data operation efficiency is essentially the same. However, stacks and heaps have their own characteristics, leading to the following differences.

  1. Allocation and release efficiency: The stack is a smaller memory block, allocated automatically by the compiler; the heap memory is relatively larger and can be dynamically allocated in the code, more prone to fragmentation. Therefore, allocation and release operations on the heap are generally slower than on the stack.
  2. Size limitation: Stack memory is relatively small, while the heap size is generally limited by available memory. Therefore, the heap is more suitable for storing large arrays.
  3. Flexibility: The size of arrays on the stack needs to be determined at compile-time, while the size of arrays on the heap can be dynamically determined at runtime.

Q: Why do arrays require elements of the same type, while linked lists do not emphasize same-type elements?

Linked lists consist of nodes connected by references (pointers), and each node can store data of different types, such as int, double, string, object, etc.

In contrast, array elements must be of the same type, allowing the calculation of offsets to access the corresponding element positions. For example, an array containing both int and long types, with single elements occupying 4 bytes and 8 bytes respectively, cannot use the following formula to calculate offsets, as the array contains elements of two different lengths.

# Element memory address = array memory address + element length * element index\n

Q: After deleting a node, is it necessary to set P.next to None?

Not modifying P.next is also acceptable. From the perspective of the linked list, traversing from the head node to the tail node will no longer encounter P. This means that node P has been effectively removed from the list, and where P points no longer affects the list.

From a garbage collection perspective, for languages with automatic garbage collection mechanisms like Java, Python, and Go, whether node P is collected depends on whether there are still references pointing to it, not on the value of P.next. In languages like C and C++, we need to manually free the node's memory.

Q: In linked lists, the time complexity for insertion and deletion operations is O(1). But searching for the element before insertion or deletion takes O(n) time, so why isn't the time complexity O(n)?

If an element is searched first and then deleted, the time complexity is indeed O(n). However, the O(1) advantage of linked lists in insertion and deletion can be realized in other applications. For example, in the implementation of double-ended queues using linked lists, we maintain pointers always pointing to the head and tail nodes, making each insertion and deletion operation O(1).

Q: In the image \"Linked List Definition and Storage Method\", do the light blue storage nodes occupy a single memory address, or do they share half with the node value?

The diagram is just a qualitative representation; quantitative analysis depends on specific situations.

  • Different types of node values occupy different amounts of space, such as int, long, double, and object instances.
  • The memory space occupied by pointer variables depends on the operating system and compilation environment used, usually 8 bytes or 4 bytes.

Q: Is adding elements to the end of a list always O(1)?

If adding an element exceeds the list length, the list needs to be expanded first. The system will request a new memory block and move all elements of the original list over, in which case the time complexity becomes O(n).

Q: The statement \"The emergence of lists greatly improves the practicality of arrays, but may lead to some memory space wastage\" - does this refer to the memory occupied by additional variables like capacity, length, and expansion multiplier?

The space wastage here mainly refers to two aspects: on the one hand, lists are set with an initial length, which we may not always need; on the other hand, to prevent frequent expansion, expansion usually multiplies by a coefficient, such as \\(\\times 1.5\\). This results in many empty slots, which we typically cannot fully fill.

Q: In Python, after initializing n = [1, 2, 3], the addresses of these 3 elements are contiguous, but initializing m = [2, 1, 3] shows that each element's id is not consecutive but identical to those in n. If the addresses of these elements are not contiguous, is m still an array?

If we replace list elements with linked list nodes n = [n1, n2, n3, n4, n5], these 5 node objects are also typically dispersed throughout memory. However, given a list index, we can still access the node's memory address in O(1) time, thereby accessing the corresponding node. This is because the array stores references to the nodes, not the nodes themselves.

Unlike many languages, in Python, numbers are also wrapped as objects, and lists store references to these numbers, not the numbers themselves. Therefore, we find that the same number in two arrays has the same id, and these numbers' memory addresses need not be contiguous.

Q: The std::list in C++ STL has already implemented a doubly linked list, but it seems that some algorithm books don't directly use it. Is there any limitation?

On the one hand, we often prefer to use arrays to implement algorithms, only using linked lists when necessary, mainly for two reasons.

  • Space overhead: Since each element requires two additional pointers (one for the previous element and one for the next), std::list usually occupies more space than std::vector.
  • Cache unfriendly: As the data is not stored continuously, std::list has a lower cache utilization rate. Generally, std::vector performs better.

On the other hand, linked lists are primarily necessary for binary trees and graphs. Stacks and queues are often implemented using the programming language's stack and queue classes, rather than linked lists.

Q: Does initializing a list res = [0] * self.size() result in each element of res referencing the same address?

No. However, this issue arises with two-dimensional arrays, for example, initializing a two-dimensional list res = [[0] * self.size()] would reference the same list [0] multiple times.

Q: In deleting a node, is it necessary to break the reference to its successor node?

From the perspective of data structures and algorithms (problem-solving), it's okay not to break the link, as long as the program's logic is correct. From the perspective of standard libraries, breaking the link is safer and more logically clear. If the link is not broken, and the deleted node is not properly recycled, it could affect the recycling of the successor node's memory.

"},{"location":"chapter_computational_complexity/","title":"Chapter 2. \u00a0 Complexity analysis","text":"

Abstract

Complexity analysis is like a space-time navigator in the vast universe of algorithms.

It guides us in exploring deeper within the the dimensions of time and space, seeking more elegant solutions.

"},{"location":"chapter_computational_complexity/#chapter-contents","title":"Chapter contents","text":"
  • 2.1 \u00a0 Algorithm efficiency assessment
  • 2.2 \u00a0 Iteration and recursion
  • 2.3 \u00a0 Time complexity
  • 2.4 \u00a0 Space complexity
  • 2.5 \u00a0 Summary
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 Iteration and recursion","text":"

In algorithms, the repeated execution of a task is quite common and is closely related to the analysis of complexity. Therefore, before delving into the concepts of time complexity and space complexity, let's first explore how to implement repetitive tasks in programming. This involves understanding two fundamental programming control structures: iteration and recursion.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221-iteration","title":"2.2.1 \u00a0 Iteration","text":"

\"Iteration\" is a control structure for repeatedly performing a task. In iteration, a program repeats a block of code as long as a certain condition is met until this condition is no longer satisfied.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for-loops","title":"1. \u00a0 For loops","text":"

The for loop is one of the most common forms of iteration, and it's particularly suitable when the number of iterations is known in advance.

The following function uses a for loop to perform a summation of \\(1 + 2 + \\dots + n\\), with the sum being stored in the variable res. It's important to note that in Python, range(a, b) creates an interval that is inclusive of a but exclusive of b, meaning it iterates over the range from \\(a\\) up to \\(b\u22121\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
Code Visualization

Full Screen >

The flowchart below represents this sum function.

Figure 2-1 \u00a0 Flowchart of the sum function

The number of operations in this summation function is proportional to the size of the input data \\(n\\), or in other words, it has a \"linear relationship.\" This \"linear relationship\" is what time complexity describes. This topic will be discussed in more detail in the next section.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while-loops","title":"2. \u00a0 While loops","text":"

Similar to for loops, while loops are another approach for implementing iteration. In a while loop, the program checks a condition at the beginning of each iteration; if the condition is true, the execution continues, otherwise, the loop ends.

Below we use a while loop to implement the sum \\(1 + 2 + \\dots + n\\).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
iteration.cpp
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
iteration.zig
// while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
Code Visualization

Full Screen >

While loops provide more flexibility than for loops, especially since they allow for custom initialization and modification of the condition variable at each step.

For example, in the following code, the condition variable \\(i\\) is updated twice each round, which would be inconvenient to implement with a for loop.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
Code Visualization

Full Screen >

Overall, for loops are more concise, while while loops are more flexible. Both can implement iterative structures. Which one to use should be determined based on the specific requirements of the problem.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-nested-loops","title":"3. \u00a0 Nested loops","text":"

We can nest one loop structure within another. Below is an example using for loops:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
Code Visualization

Full Screen >

The flowchart below represents this nested loop.

Figure 2-2 \u00a0 Flowchart of the nested loop

In such cases, the number of operations of the function is proportional to \\(n^2\\), meaning the algorithm's runtime and the size of the input data \\(n\\) has a 'quadratic relationship.'

We can further increase the complexity by adding more nested loops, each level of nesting effectively \"increasing the dimension,\" which raises the time complexity to \"cubic,\" \"quartic,\" and so on.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222-recursion","title":"2.2.2 \u00a0 Recursion","text":"

\"Recursion\" is an algorithmic strategy where a function solves a problem by calling itself. It primarily involves two phases:

  1. Calling: This is where the program repeatedly calls itself, often with progressively smaller or simpler arguments, moving towards the \"termination condition.\"
  2. Returning: Upon triggering the \"termination condition,\" the program begins to return from the deepest recursive function, aggregating the results of each layer.

From an implementation perspective, recursive code mainly includes three elements.

  1. Termination Condition: Determines when to switch from \"calling\" to \"returning.\"
  2. Recursive Call: Corresponds to \"calling,\" where the function calls itself, usually with smaller or more simplified parameters.
  3. Return Result: Corresponds to \"returning,\" where the result of the current recursion level is returned to the previous layer.

Observe the following code, where simply calling the function recur(n) can compute the sum of \\(1 + 2 + \\dots + n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
recursion.cpp
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.java
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.cs
/* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.go
/* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.swift
/* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.js
/* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.ts
/* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.dart
/* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
recursion.rs
/* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
recursion.c
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.kt
/* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.rb
### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
recursion.zig
// \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
Code Visualization

Full Screen >

The Figure 2-3 shows the recursive process of this function.

Figure 2-3 \u00a0 Recursive process of the sum function

Although iteration and recursion can achieve the same results from a computational standpoint, they represent two entirely different paradigms of thinking and problem-solving.

  • Iteration: Solves problems \"from the bottom up.\" It starts with the most basic steps, and then repeatedly adds or accumulates these steps until the task is complete.
  • Recursion: Solves problems \"from the top down.\" It breaks down the original problem into smaller sub-problems, each of which has the same form as the original problem. These sub-problems are then further decomposed into even smaller sub-problems, stopping at the base case whose solution is known.

Let's take the earlier example of the summation function, defined as \\(f(n) = 1 + 2 + \\dots + n\\).

  • Iteration: In this approach, we simulate the summation process within a loop. Starting from \\(1\\) and traversing to \\(n\\), we perform the summation operation in each iteration to eventually compute \\(f(n)\\).
  • Recursion: Here, the problem is broken down into a sub-problem: \\(f(n) = n + f(n-1)\\). This decomposition continues recursively until reaching the base case, \\(f(1) = 1\\), at which point the recursion terminates.
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-call-stack","title":"1. \u00a0 Call stack","text":"

Every time a recursive function calls itself, the system allocates memory for the newly initiated function to store local variables, the return address, and other relevant information. This leads to two primary outcomes.

  • The function's context data is stored in a memory area called \"stack frame space\" and is only released after the function returns. Therefore, recursion generally consumes more memory space than iteration.
  • Recursive calls introduce additional overhead. Hence, recursion is usually less time-efficient than loops.

As shown in the Figure 2-4 , there are \\(n\\) unreturned recursive functions before triggering the termination condition, indicating a recursion depth of \\(n\\).

Figure 2-4 \u00a0 Recursion call depth

In practice, the depth of recursion allowed by programming languages is usually limited, and excessively deep recursion can lead to stack overflow errors.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-tail-recursion","title":"2. \u00a0 Tail recursion","text":"

Interestingly, if a function performs its recursive call as the very last step before returning, it can be optimized by the compiler or interpreter to be as space-efficient as iteration. This scenario is known as \"tail recursion.\"

  • Regular recursion: In standard recursion, when the function returns to the previous level, it continues to execute more code, requiring the system to save the context of the previous call.
  • Tail recursion: Here, the recursive call is the final operation before the function returns. This means that upon returning to the previous level, no further actions are needed, so the system does not need to save the context of the previous level.

For example, in calculating \\(1 + 2 + \\dots + n\\), we can make the result variable res a parameter of the function, thereby achieving tail recursion:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
Code Visualization

Full Screen >

The execution process of tail recursion is shown in the following figure. Comparing regular recursion and tail recursion, the point of the summation operation is different.

  • Regular recursion: The summation operation occurs during the \"returning\" phase, requiring another summation after each layer returns.
  • Tail recursion: The summation operation occurs during the \"calling\" phase, and the \"returning\" phase only involves returning through each layer.

Figure 2-5 \u00a0 Tail recursion process

Tip

Note that many compilers or interpreters do not support tail recursion optimization. For example, Python does not support tail recursion optimization by default, so even if the function is in the form of tail recursion, it may still encounter stack overflow issues.

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-recursion-tree","title":"3. \u00a0 Recursion tree","text":"

When dealing with algorithms related to \"divide and conquer\", recursion often offers a more intuitive approach and more readable code than iteration. Take the \"Fibonacci sequence\" as an example.

Question

Given a Fibonacci sequence \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\), find the \\(n\\)th number in the sequence.

Let the \\(n\\)th number of the Fibonacci sequence be \\(f(n)\\), it's easy to deduce two conclusions:

  • The first two numbers of the sequence are \\(f(1) = 0\\) and \\(f(2) = 1\\).
  • Each number in the sequence is the sum of the two preceding ones, that is, \\(f(n) = f(n - 1) + f(n - 2)\\).

Using the recursive relation, and considering the first two numbers as termination conditions, we can write the recursive code. Calling fib(n) will yield the \\(n\\)th number of the Fibonacci sequence:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
recursion.cpp
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.js
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
recursion.c
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.rb
### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
recursion.zig
// \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
Code Visualization

Full Screen >

Observing the above code, we see that it recursively calls two functions within itself, meaning that one call generates two branching calls. As illustrated below, this continuous recursive calling eventually creates a \"recursion tree\" with a depth of \\(n\\).

Figure 2-6 \u00a0 Fibonacci sequence recursion tree

Fundamentally, recursion embodies the paradigm of \"breaking down a problem into smaller sub-problems.\" This divide-and-conquer strategy is crucial.

  • From an algorithmic perspective, many important strategies like searching, sorting, backtracking, divide-and-conquer, and dynamic programming directly or indirectly use this way of thinking.
  • From a data structure perspective, recursion is naturally suited for dealing with linked lists, trees, and graphs, as they are well suited for analysis using the divide-and-conquer approach.
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223-comparison","title":"2.2.3 \u00a0 Comparison","text":"

Summarizing the above content, the following table shows the differences between iteration and recursion in terms of implementation, performance, and applicability.

Table: Comparison of iteration and recursion characteristics

Iteration Recursion Approach Loop structure Function calls itself Time Efficiency Generally higher efficiency, no function call overhead Each function call generates overhead Memory Usage Typically uses a fixed size of memory space Accumulative function calls can use a substantial amount of stack frame space Suitable Problems Suitable for simple loop tasks, intuitive and readable code Suitable for problem decomposition, like trees, graphs, divide-and-conquer, backtracking, etc., concise and clear code structure

Tip

If you find the following content difficult to understand, consider revisiting it after reading the \"Stack\" chapter.

So, what is the intrinsic connection between iteration and recursion? Taking the above recursive function as an example, the summation operation occurs during the recursion's \"return\" phase. This means that the initially called function is the last to complete its summation operation, mirroring the \"last in, first out\" principle of a stack.

Recursive terms like \"call stack\" and \"stack frame space\" hint at the close relationship between recursion and stacks.

  1. Calling: When a function is called, the system allocates a new stack frame on the \"call stack\" for that function, storing local variables, parameters, return addresses, and other data.
  2. Returning: When a function completes execution and returns, the corresponding stack frame is removed from the \"call stack,\" restoring the execution environment of the previous function.

Therefore, we can use an explicit stack to simulate the behavior of the call stack, thus transforming recursion into an iterative form:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
Code Visualization

Full Screen >

Observing the above code, when recursion is transformed into iteration, the code becomes more complex. Although iteration and recursion can often be transformed into each other, it's not always advisable to do so for two reasons:

  • The transformed code may become more challenging to understand and less readable.
  • For some complex problems, simulating the behavior of the system's call stack can be quite challenging.

In conclusion, whether to choose iteration or recursion depends on the specific nature of the problem. In programming practice, it's crucial to weigh the pros and cons of both and choose the most suitable approach for the situation at hand.

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 Algorithm efficiency assessment","text":"

In algorithm design, we pursue the following two objectives in sequence.

  1. Finding a Solution to the Problem: The algorithm should reliably find the correct solution within the stipulated range of inputs.
  2. Seeking the Optimal Solution: For the same problem, multiple solutions might exist, and we aim to find the most efficient algorithm possible.

In other words, under the premise of being able to solve the problem, algorithm efficiency has become the main criterion for evaluating the merits of an algorithm, which includes the following two dimensions.

  • Time efficiency: The speed at which an algorithm runs.
  • Space efficiency: The size of the memory space occupied by an algorithm.

In short, our goal is to design data structures and algorithms that are both fast and memory-efficient. Effectively assessing algorithm efficiency is crucial because only then can we compare various algorithms and guide the process of algorithm design and optimization.

There are mainly two methods of efficiency assessment: actual testing and theoretical estimation.

"},{"location":"chapter_computational_complexity/performance_evaluation/#211-actual-testing","title":"2.1.1 \u00a0 Actual testing","text":"

Suppose we have algorithms A and B, both capable of solving the same problem, and we need to compare their efficiencies. The most direct method is to use a computer to run these two algorithms and monitor and record their runtime and memory usage. This assessment method reflects the actual situation but has significant limitations.

On one hand, it's difficult to eliminate interference from the testing environment. Hardware configurations can affect algorithm performance. For example, algorithm A might run faster than B on one computer, but the opposite result may occur on another computer with different configurations. This means we would need to test on a variety of machines to calculate average efficiency, which is impractical.

On the other hand, conducting a full test is very resource-intensive. As the volume of input data changes, the efficiency of the algorithms may vary. For example, with smaller data volumes, algorithm A might run faster than B, but the opposite might be true with larger data volumes. Therefore, to draw convincing conclusions, we need to test a wide range of input data sizes, which requires significant computational resources.

"},{"location":"chapter_computational_complexity/performance_evaluation/#212-theoretical-estimation","title":"2.1.2 \u00a0 Theoretical estimation","text":"

Due to the significant limitations of actual testing, we can consider evaluating algorithm efficiency solely through calculations. This estimation method is known as \"asymptotic complexity analysis,\" or simply \"complexity analysis.\"

Complexity analysis reflects the relationship between the time and space resources required for algorithm execution and the size of the input data. It describes the trend of growth in the time and space required by the algorithm as the size of the input data increases. This definition might sound complex, but we can break it down into three key points to understand it better.

  • \"Time and space resources\" correspond to \"time complexity\" and \"space complexity,\" respectively.
  • \"As the size of input data increases\" means that complexity reflects the relationship between algorithm efficiency and the volume of input data.
  • \"The trend of growth in time and space\" indicates that complexity analysis focuses not on the specific values of runtime or space occupied but on the \"rate\" at which time or space grows.

Complexity analysis overcomes the disadvantages of actual testing methods, reflected in the following aspects:

  • It is independent of the testing environment and applicable to all operating platforms.
  • It can reflect algorithm efficiency under different data volumes, especially in the performance of algorithms with large data volumes.

Tip

If you're still confused about the concept of complexity, don't worry. We will introduce it in detail in subsequent chapters.

Complexity analysis provides us with a \"ruler\" to measure the time and space resources needed to execute an algorithm and compare the efficiency between different algorithms.

Complexity is a mathematical concept and may be abstract and challenging for beginners. From this perspective, complexity analysis might not be the best content to introduce first. However, when discussing the characteristics of a particular data structure or algorithm, it's hard to avoid analyzing its speed and space usage.

In summary, it's recommended that you establish a preliminary understanding of complexity analysis before diving deep into data structures and algorithms, so that you can carry out simple complexity analyses of algorithms.

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 Space complexity","text":"

\"Space complexity\" is used to measure the growth trend of the memory space occupied by an algorithm as the amount of data increases. This concept is very similar to time complexity, except that \"running time\" is replaced with \"occupied memory space\".

"},{"location":"chapter_computational_complexity/space_complexity/#241-space-related-to-algorithms","title":"2.4.1 \u00a0 Space related to algorithms","text":"

The memory space used by an algorithm during its execution mainly includes the following types.

  • Input space: Used to store the input data of the algorithm.
  • Temporary space: Used to store variables, objects, function contexts, and other data during the algorithm's execution.
  • Output space: Used to store the output data of the algorithm.

Generally, the scope of space complexity statistics includes both \"Temporary Space\" and \"Output Space\".

Temporary space can be further divided into three parts.

  • Temporary data: Used to save various constants, variables, objects, etc., during the algorithm's execution.
  • Stack frame space: Used to save the context data of the called function. The system creates a stack frame at the top of the stack each time a function is called, and the stack frame space is released after the function returns.
  • Instruction space: Used to store compiled program instructions, which are usually negligible in actual statistics.

When analyzing the space complexity of a program, we typically count the Temporary Data, Stack Frame Space, and Output Data, as shown in the Figure 2-15 .

Figure 2-15 \u00a0 Space types used in algorithms

The relevant code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
class Node:\n    \"\"\"Classes\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x               # node value\n        self.next: Node | None = None   # reference to the next node\n\ndef function() -> int:\n    \"\"\"Functions\"\"\"\n    # Perform certain operations...\n    return 0\n\ndef algorithm(n) -> int:    # input data\n    A = 0                   # temporary data (constant, usually in uppercase)\n    b = 0                   # temporary data (variable)\n    node = Node(0)          # temporary data (object)\n    c = function()          # Stack frame space (call function)\n    return A + b + c        # output data\n
/* Structures */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    const int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node* node = new Node(0);   // temporary data (object)\n    int c = func();             // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    final int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node node = new Node(0);    // temporary data (object)\n    int c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint Function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint Algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    Node node = new(0); // temporary data (object)\n    int c = Function(); // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
/* Structures */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* Create node structure */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* Functions */\nfunc function() int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n int) int { // input data\n    const a = 0             // temporary data (constant)\n    b := 0                  // temporary storage of data (variable)\n    newNode(0)              // temporary data (object)\n    c := function()         // stack frame space (call function)\n    return a + b + c        // output data\n}\n
/* Classes */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* Functions */\nfunc function() -> Int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // input data\n    let a = 0                   // temporary data (constant)\n    var b = 0                   // temporary data (variable)\n    let node = Node(x: 0)       // temporary data (object)\n    let c = function()          // stack frame space (call function)\n    return a + b + c            // output data\n}\n
/* Classes */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc() {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n) {         // input data\n    const a = 0;                // temporary data (constant)\n    let b = 0;                  // temporary data (variable)\n    const node = new Node(0);   // temporary data (object)\n    const c = constFunc();      // Stack frame space (calling function)\n    return a + b + c;           // output data\n}\n
/* Classes */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n: number): number { // input data\n    const a = 0;                        // temporary data (constant)\n    let b = 0;                          // temporary data (variable)\n    const node = new Node(0);           // temporary data (object)\n    const c = constFunc();              // Stack frame space (calling function)\n    return a + b + c;                   // output data\n}\n
/* Classes */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* Functions */\nint function() {\n  // Perform certain operations...\n  return 0;\n}\n\nint algorithm(int n) {  // input data\n  const int a = 0;      // temporary data (constant)\n  int b = 0;            // temporary data (variable)\n  Node node = Node(0);  // temporary data (object)\n  int c = function();   // stack frame space (call function)\n  return a + b + c;     // output data\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Structures */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* Constructor */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* Functions */\nfn function() -> i32 {     \n    // Perform certain operations...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {   // input data\n    const a: i32 = 0;           // temporary data (constant)\n    let mut b = 0;              // temporary data (variable)\n    let node = Node::new(0);    // temporary data (object)\n    let c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    int c = func();     // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242-calculation-method","title":"2.4.2 \u00a0 Calculation method","text":"

The method for calculating space complexity is roughly similar to that of time complexity, with the only change being the shift of the statistical object from \"number of operations\" to \"size of used space\".

However, unlike time complexity, we usually only focus on the worst-case space complexity. This is because memory space is a hard requirement, and we must ensure that there is enough memory space reserved under all input data.

Consider the following code, the term \"worst-case\" in worst-case space complexity has two meanings.

  1. Based on the worst input data: When \\(n < 10\\), the space complexity is \\(O(1)\\); but when \\(n > 10\\), the initialized array nums occupies \\(O(n)\\) space, thus the worst-case space complexity is \\(O(n)\\).
  2. Based on the peak memory used during the algorithm's execution: For example, before executing the last line, the program occupies \\(O(1)\\) space; when initializing the array nums, the program occupies \\(O(n)\\) space, hence the worst-case space complexity is \\(O(n)\\).
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                           // O(1)\n    let b = [0; 10000];                  // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];  // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
\n
\n

In recursive functions, stack frame space must be taken into count. Consider the following code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def function() -> int:\n    # Perform certain operations\n    return 0\n\ndef loop(n: int):\n    \"\"\"Loop O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"Recursion O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* Recursion O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // Perform certain operations\n  return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
\n
\n

The time complexity of both loop() and recur() functions is \\(O(n)\\), but their space complexities differ.

  • The loop() function calls function() \\(n\\) times in a loop, where each iteration's function() returns and releases its stack frame space, so the space complexity remains \\(O(1)\\).
  • The recursive function recur() will have \\(n\\) instances of unreturned recur() existing simultaneously during its execution, thus occupying \\(O(n)\\) stack frame space.
"},{"location":"chapter_computational_complexity/space_complexity/#243-common-types","title":"2.4.3 \u00a0 Common types","text":"

Let the size of the input data be \\(n\\), the following chart displays common types of space complexities (arranged from low to high).

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Quadratic Order} < \\text{Exponential Order} \\end{aligned} \\]

Figure 2-16 \u00a0 Common types of space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

Constant order is common in constants, variables, objects that are independent of the size of input data \\(n\\).

Note that memory occupied by initializing variables or calling functions in a loop, which is released upon entering the next cycle, does not accumulate over space, thus the space complexity remains \\(O(1)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/space_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

Linear order is common in arrays, linked lists, stacks, queues, etc., where the number of elements is proportional to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
Code Visualization

Full Screen >

As shown below, this function's recursive depth is \\(n\\), meaning there are \\(n\\) instances of unreturned linear_recur() function, using \\(O(n)\\) size of stack frame space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
Code Visualization

Full Screen >

Figure 2-17 \u00a0 Recursive function generating linear order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#3-quadratic-order-on2","title":"3. \u00a0 Quadratic order \\(O(n^2)\\)","text":"

Quadratic order is common in matrices and graphs, where the number of elements is quadratic to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
Code Visualization

Full Screen >

As shown below, the recursive depth of this function is \\(n\\), and in each recursive call, an array is initialized with lengths \\(n\\), \\(n-1\\), \\(\\dots\\), \\(2\\), \\(1\\), averaging \\(n/2\\), thus overall occupying \\(O(n^2)\\) space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
Code Visualization

Full Screen >

Figure 2-18 \u00a0 Recursive function generating quadratic order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#4-exponential-order-o2n","title":"4. \u00a0 Exponential order \\(O(2^n)\\)","text":"

Exponential order is common in binary trees. Observe the below image, a \"full binary tree\" with \\(n\\) levels has \\(2^n - 1\\) nodes, occupying \\(O(2^n)\\) space:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
Code Visualization

Full Screen >

Figure 2-19 \u00a0 Full binary tree generating exponential order space complexity

"},{"location":"chapter_computational_complexity/space_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

Logarithmic order is common in divide-and-conquer algorithms. For example, in merge sort, an array of length \\(n\\) is recursively divided in half each round, forming a recursion tree of height \\(\\log n\\), using \\(O(\\log n)\\) stack frame space.

Another example is converting a number to a string. Given a positive integer \\(n\\), its number of digits is \\(\\log_{10} n + 1\\), corresponding to the length of the string, thus the space complexity is \\(O(\\log_{10} n + 1) = O(\\log n)\\).

"},{"location":"chapter_computational_complexity/space_complexity/#244-balancing-time-and-space","title":"2.4.4 \u00a0 Balancing time and space","text":"

Ideally, we aim for both time complexity and space complexity to be optimal. However, in practice, optimizing both simultaneously is often difficult.

Lowering time complexity usually comes at the cost of increased space complexity, and vice versa. The approach of sacrificing memory space to improve algorithm speed is known as \"space-time tradeoff\"; the reverse is known as \"time-space tradeoff\".

The choice depends on which aspect we value more. In most cases, time is more precious than space, so \"space-time tradeoff\" is often the more common strategy. Of course, controlling space complexity is also very important when dealing with large volumes of data.

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 Summary","text":""},{"location":"chapter_computational_complexity/summary/#1-key-review","title":"1. \u00a0 Key review","text":"

Algorithm Efficiency Assessment

  • Time efficiency and space efficiency are the two main criteria for assessing the merits of an algorithm.
  • We can assess algorithm efficiency through actual testing, but it's challenging to eliminate the influence of the test environment, and it consumes substantial computational resources.
  • Complexity analysis can overcome the disadvantages of actual testing. Its results are applicable across all operating platforms and can reveal the efficiency of algorithms at different data scales.

Time Complexity

  • Time complexity measures the trend of an algorithm's running time with the increase in data volume, effectively assessing algorithm efficiency. However, it can fail in certain cases, such as with small input data volumes or when time complexities are the same, making it challenging to precisely compare the efficiency of algorithms.
  • Worst-case time complexity is denoted using big O notation, representing the asymptotic upper bound, reflecting the growth level of the number of operations \\(T(n)\\) as \\(n\\) approaches infinity.
  • Calculating time complexity involves two steps: first counting the number of operations, then determining the asymptotic upper bound.
  • Common time complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n \\log n)\\), \\(O(n^2)\\), \\(O(2^n)\\), and \\(O(n!)\\), among others.
  • The time complexity of some algorithms is not fixed and depends on the distribution of input data. Time complexities are divided into worst, best, and average cases. The best case is rarely used because input data generally needs to meet strict conditions to achieve the best case.
  • Average time complexity reflects the efficiency of an algorithm under random data inputs, closely resembling the algorithm's performance in actual applications. Calculating average time complexity requires accounting for the distribution of input data and the subsequent mathematical expectation.

Space Complexity

  • Space complexity, similar to time complexity, measures the trend of memory space occupied by an algorithm with the increase in data volume.
  • The relevant memory space used during the algorithm's execution can be divided into input space, temporary space, and output space. Generally, input space is not included in space complexity calculations. Temporary space can be divided into temporary data, stack frame space, and instruction space, where stack frame space usually affects space complexity only in recursive functions.
  • We usually focus only on the worst-case space complexity, which means calculating the space complexity of the algorithm under the worst input data and at the worst moment of operation.
  • Common space complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n^2)\\), and \\(O(2^n)\\), among others.
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the space complexity of tail recursion \\(O(1)\\)?

Theoretically, the space complexity of a tail-recursive function can be optimized to \\(O(1)\\). However, most programming languages (such as Java, Python, C++, Go, C#) do not support automatic optimization of tail recursion, so it's generally considered to have a space complexity of \\(O(n)\\).

Q: What is the difference between the terms \"function\" and \"method\"?

A \"function\" can be executed independently, with all parameters passed explicitly. A \"method\" is associated with an object and is implicitly passed to the object calling it, able to operate on the data contained within an instance of a class.

Here are some examples from common programming languages:

  • C is a procedural programming language without object-oriented concepts, so it only has functions. However, we can simulate object-oriented programming by creating structures (struct), and functions associated with these structures are equivalent to methods in other programming languages.
  • Java and C# are object-oriented programming languages where code blocks (methods) are typically part of a class. Static methods behave like functions because they are bound to the class and cannot access specific instance variables.
  • C++ and Python support both procedural programming (functions) and object-oriented programming (methods).

Q: Does the \"Common Types of Space Complexity\" figure reflect the absolute size of occupied space?

No, the figure shows space complexities, which reflect growth trends, not the absolute size of the occupied space.

If you take \\(n = 8\\), you might find that the values of each curve don't correspond to their functions. This is because each curve includes a constant term, intended to compress the value range into a visually comfortable range.

In practice, since we usually don't know the \"constant term\" complexity of each method, it's generally not possible to choose the best solution for \\(n = 8\\) based solely on complexity. However, for \\(n = 8^5\\), it's much easier to choose, as the growth trend becomes dominant.

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 Time complexity","text":"

Time complexity is a concept used to measure how the run time of an algorithm increases with the size of the input data. Understanding time complexity is crucial for accurately assessing the efficiency of an algorithm.

  1. Determining the Running Platform: This includes hardware configuration, programming language, system environment, etc., all of which can affect the efficiency of code execution.
  2. Evaluating the Run Time for Various Computational Operations: For instance, an addition operation + might take 1 ns, a multiplication operation * might take 10 ns, a print operation print() might take 5 ns, etc.
  3. Counting All the Computational Operations in the Code: Summing the execution times of all these operations gives the total run time.

For example, consider the following code with an input size of \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Under an operating platform\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # Cycle n times\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        System.out.println(0);     // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // Loop n times\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // Loop n times\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
// Under a particular operating platform\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // Loop n times\n  for (int i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n    print(0); // 5 ns\n  }\n}\n
// Under a particular operating platform\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // Loop n times\n    for _ in 0..n {     // 1 ns for each round i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // 1 ns , every round i++ is executed\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
\n
// Under a particular operating platform\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // Loop n times\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

Using the above method, the run time of the algorithm can be calculated as \\((6n + 12)\\) ns:

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

However, in practice, counting the run time of an algorithm is neither practical nor reasonable. First, we don't want to tie the estimated time to the running platform, as algorithms need to run on various platforms. Second, it's challenging to know the run time for each type of operation, making the estimation process difficult.

"},{"location":"chapter_computational_complexity/time_complexity/#231-assessing-time-growth-trend","title":"2.3.1 \u00a0 Assessing time growth trend","text":"

Time complexity analysis does not count the algorithm's run time, but rather the growth trend of the run time as the data volume increases.

Let's understand this concept of \"time growth trend\" with an example. Assume the input data size is \\(n\\), and consider three algorithms A, B, and C:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Time complexity of algorithm A: constant order\ndef algorithm_A(n: int):\n    print(0)\n# Time complexity of algorithm B: linear order\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# Time complexity of algorithm C: constant order\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// Time complexity of algorithm B: linear order\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// Time complexity of algorithm B: linear order\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// Time complexity of algorithm C: constant order\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// Time complexity of algorithm B: linear order\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// Time complexity of algorithm C: constant order\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithmA(int n) {\n  print(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// Time complexity of algorithm A: constant order\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
\n
// Time complexity of algorithm A: constant order\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

The following figure shows the time complexities of these three algorithms.

  • Algorithm A has just one print operation, and its run time does not grow with \\(n\\). Its time complexity is considered \"constant order.\"
  • Algorithm B involves a print operation looping \\(n\\) times, and its run time grows linearly with \\(n\\). Its time complexity is \"linear order.\"
  • Algorithm C has a print operation looping 1,000,000 times. Although it takes a long time, it is independent of the input data size \\(n\\). Therefore, the time complexity of C is the same as A, which is \"constant order.\"

Figure 2-7 \u00a0 Time growth trend of algorithms a, b, and c

Compared to directly counting the run time of an algorithm, what are the characteristics of time complexity analysis?

  • Time complexity effectively assesses algorithm efficiency. For instance, algorithm B has linearly growing run time, which is slower than algorithm A when \\(n > 1\\) and slower than C when \\(n > 1,000,000\\). In fact, as long as the input data size \\(n\\) is sufficiently large, a \"constant order\" complexity algorithm will always be better than a \"linear order\" one, demonstrating the essence of time growth trend.
  • Time complexity analysis is more straightforward. Obviously, the running platform and the types of computational operations are irrelevant to the trend of run time growth. Therefore, in time complexity analysis, we can simply treat the execution time of all computational operations as the same \"unit time,\" simplifying the \"computational operation run time count\" to a \"computational operation count.\" This significantly reduces the complexity of estimation.
  • Time complexity has its limitations. For example, although algorithms A and C have the same time complexity, their actual run times can be quite different. Similarly, even though algorithm B has a higher time complexity than C, it is clearly superior when the input data size \\(n\\) is small. In these cases, it's difficult to judge the efficiency of algorithms based solely on time complexity. Nonetheless, despite these issues, complexity analysis remains the most effective and commonly used method for evaluating algorithm efficiency.
"},{"location":"chapter_computational_complexity/time_complexity/#232-asymptotic-upper-bound","title":"2.3.2 \u00a0 Asymptotic upper bound","text":"

Consider a function with an input size of \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # Cycle n times\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // Loop n times\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // Loop n times\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // Loop n times\n  for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // Loop n times\n    for _ in 0..n { // +1 (execute i ++ every round)\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        printf(\"%d\", 0);            // +1\n    }\n} \n
\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for (0..n) |_| { // +1 (execute i ++ every round)\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

Given a function that represents the number of operations of an algorithm as a function of the input size \\(n\\), denoted as \\(T(n)\\), consider the following example:

\\[ T(n) = 3 + 2n \\]

Since \\(T(n)\\) is a linear function, its growth trend is linear, and therefore, its time complexity is of linear order, denoted as \\(O(n)\\). This mathematical notation, known as \"big-O notation,\" represents the \"asymptotic upper bound\" of the function \\(T(n)\\).

In essence, time complexity analysis is about finding the asymptotic upper bound of the \"number of operations \\(T(n)\\)\". It has a precise mathematical definition.

Asymptotic Upper Bound

If there exist positive real numbers \\(c\\) and \\(n_0\\) such that for all \\(n > n_0\\), \\(T(n) \\leq c \\cdot f(n)\\), then \\(f(n)\\) is considered an asymptotic upper bound of \\(T(n)\\), denoted as \\(T(n) = O(f(n))\\).

As illustrated below, calculating the asymptotic upper bound involves finding a function \\(f(n)\\) such that, as \\(n\\) approaches infinity, \\(T(n)\\) and \\(f(n)\\) have the same growth order, differing only by a constant factor \\(c\\).

Figure 2-8 \u00a0 Asymptotic upper bound of a function

"},{"location":"chapter_computational_complexity/time_complexity/#233-calculation-method","title":"2.3.3 \u00a0 Calculation method","text":"

While the concept of asymptotic upper bound might seem mathematically dense, you don't need to fully grasp it right away. Let's first understand the method of calculation, which can be practiced and comprehended over time.

Once \\(f(n)\\) is determined, we obtain the time complexity \\(O(f(n))\\). But how do we determine the asymptotic upper bound \\(f(n)\\)? This process generally involves two steps: counting the number of operations and determining the asymptotic upper bound.

"},{"location":"chapter_computational_complexity/time_complexity/#1-step-1-counting-the-number-of-operations","title":"1. \u00a0 Step 1: counting the number of operations","text":"

This step involves going through the code line by line. However, due to the presence of the constant \\(c\\) in \\(c \\cdot f(n)\\), all coefficients and constant terms in \\(T(n)\\) can be ignored. This principle allows for simplification techniques in counting operations.

  1. Ignore constant terms in \\(T(n)\\), as they do not affect the time complexity being independent of \\(n\\).
  2. Omit all coefficients. For example, looping \\(2n\\), \\(5n + 1\\) times, etc., can be simplified to \\(n\\) times since the coefficient before \\(n\\) does not impact the time complexity.
  3. Use multiplication for nested loops. The total number of operations equals the product of the number of operations in each loop, applying the simplification techniques from points 1 and 2 for each loop level.

Given a function, we can use these techniques to count operations:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
def algorithm(n: int):\n    a = 1      # +0 (trick 1)\n    a = a + n  # +0 (trick 1)\n    # +n (technique 2)\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n (technique 3)\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0 (trick 1)\n    a = a + n  // +0 (trick 1)\n    // +n (technique 2)\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n (technique 3)\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0 (trick 1)\n    a = a + n // +0 (trick 1)\n    // +n (technique 2)\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n (technique 3)\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0 (trick 1)\n  a = a + n; // +0 (trick 1)\n  // +n (technique 2)\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n (technique 3)\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0 (trick 1)\n    a = a + n;        // +0 (trick 1)\n\n    // +n (technique 2)\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n (technique 3)\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n (technique 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0 (trick 1)\n    a = a + @as(i32, @intCast(n));        // +0 (trick 1)\n\n    // +n (technique 2)\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n (technique 3)\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

The formula below shows the counting results before and after simplification, both leading to a time complexity of \\(O(n^2)\\):

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{Complete Count (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{Simplified Count (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2-step-2-determining-the-asymptotic-upper-bound","title":"2. \u00a0 Step 2: determining the asymptotic upper bound","text":"

The time complexity is determined by the highest order term in \\(T(n)\\). This is because, as \\(n\\) approaches infinity, the highest order term dominates, rendering the influence of other terms negligible.

The following table illustrates examples of different operation counts and their corresponding time complexities. Some exaggerated values are used to emphasize that coefficients cannot alter the order of growth. When \\(n\\) becomes very large, these constants become insignificant.

Table: Time complexity for different operation counts

Operation Count \\(T(n)\\) Time Complexity \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234-common-types-of-time-complexity","title":"2.3.4 \u00a0 Common types of time complexity","text":"

Let's consider the input data size as \\(n\\). The common types of time complexities are illustrated below, arranged from lowest to highest:

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Linear-Logarithmic Order} < \\text{Quadratic Order} < \\text{Exponential Order} < \\text{Factorial Order} \\end{aligned} \\]

Figure 2-9 \u00a0 Common types of time complexity

"},{"location":"chapter_computational_complexity/time_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

Constant order means the number of operations is independent of the input data size \\(n\\). In the following function, although the number of operations size might be large, the time complexity remains \\(O(1)\\) as it's unrelated to \\(n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/time_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

Linear order indicates the number of operations grows linearly with the input data size \\(n\\). Linear order commonly appears in single-loop structures:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Operations like array traversal and linked list traversal have a time complexity of \\(O(n)\\), where \\(n\\) is the length of the array or list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

It's important to note that the input data size \\(n\\) should be determined based on the type of input data. For example, in the first example, \\(n\\) represents the input data size, while in the second example, the length of the array \\(n\\) is the data size.

"},{"location":"chapter_computational_complexity/time_complexity/#3-quadratic-order-on2","title":"3. \u00a0 Quadratic order \\(O(n^2)\\)","text":"

Quadratic order means the number of operations grows quadratically with the input data size \\(n\\). Quadratic order typically appears in nested loops, where both the outer and inner loops have a time complexity of \\(O(n)\\), resulting in an overall complexity of \\(O(n^2)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

The following image compares constant order, linear order, and quadratic order time complexities.

Figure 2-10 \u00a0 Constant, linear, and quadratic order time complexities

For instance, in bubble sort, the outer loop runs \\(n - 1\\) times, and the inner loop runs \\(n-1\\), \\(n-2\\), ..., \\(2\\), \\(1\\) times, averaging \\(n / 2\\) times, resulting in a time complexity of \\(O((n - 1) n / 2) = O(n^2)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_computational_complexity/time_complexity/#4-exponential-order-o2n","title":"4. \u00a0 Exponential order \\(O(2^n)\\)","text":"

Biological \"cell division\" is a classic example of exponential order growth: starting with one cell, it becomes two after one division, four after two divisions, and so on, resulting in \\(2^n\\) cells after \\(n\\) divisions.

The following image and code simulate the cell division process, with a time complexity of \\(O(2^n)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-11 \u00a0 Exponential order time complexity

In practice, exponential order often appears in recursive functions. For example, in the code below, it recursively splits into two halves, stopping after \\(n\\) divisions:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
Code Visualization

Full Screen >

Exponential order growth is extremely rapid and is commonly seen in exhaustive search methods (brute force, backtracking, etc.). For large-scale problems, exponential order is unacceptable, often requiring dynamic programming or greedy algorithms as solutions.

"},{"location":"chapter_computational_complexity/time_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

In contrast to exponential order, logarithmic order reflects situations where \"the size is halved each round.\" Given an input data size \\(n\\), since the size is halved each round, the number of iterations is \\(\\log_2 n\\), the inverse function of \\(2^n\\).

The following image and code simulate the \"halving each round\" process, with a time complexity of \\(O(\\log_2 n)\\), commonly abbreviated as \\(O(\\log n)\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-12 \u00a0 Logarithmic order time complexity

Like exponential order, logarithmic order also frequently appears in recursive functions. The code below forms a recursive tree of height \\(\\log_2 n\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
Code Visualization

Full Screen >

Logarithmic order is typical in algorithms based on the divide-and-conquer strategy, embodying the \"split into many\" and \"simplify complex problems\" approach. It's slow-growing and is the most ideal time complexity after constant order.

What is the base of \\(O(\\log n)\\)?

Technically, \"splitting into \\(m\\)\" corresponds to a time complexity of \\(O(\\log_m n)\\). Using the logarithm base change formula, we can equate different logarithmic complexities:

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

This means the base \\(m\\) can be changed without affecting the complexity. Therefore, we often omit the base \\(m\\) and simply denote logarithmic order as \\(O(\\log n)\\).

"},{"location":"chapter_computational_complexity/time_complexity/#6-linear-logarithmic-order-on-log-n","title":"6. \u00a0 Linear-logarithmic order \\(O(n \\log n)\\)","text":"

Linear-logarithmic order often appears in nested loops, with the complexities of the two loops being \\(O(\\log n)\\) and \\(O(n)\\) respectively. The related code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

The image below demonstrates how linear-logarithmic order is generated. Each level of a binary tree has \\(n\\) operations, and the tree has \\(\\log_2 n + 1\\) levels, resulting in a time complexity of \\(O(n \\log n)\\).

Figure 2-13 \u00a0 Linear-logarithmic order time complexity

Mainstream sorting algorithms typically have a time complexity of \\(O(n \\log n)\\), such as quicksort, mergesort, and heapsort.

"},{"location":"chapter_computational_complexity/time_complexity/#7-factorial-order-on","title":"7. \u00a0 Factorial order \\(O(n!)\\)","text":"

Factorial order corresponds to the mathematical problem of \"full permutation.\" Given \\(n\\) distinct elements, the total number of possible permutations is:

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

Factorials are typically implemented using recursion. As shown in the image and code below, the first level splits into \\(n\\) branches, the second level into \\(n - 1\\) branches, and so on, stopping after the \\(n\\)th level:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
Code Visualization

Full Screen >

Figure 2-14 \u00a0 Factorial order time complexity

Note that factorial order grows even faster than exponential order; it's unacceptable for larger \\(n\\) values.

"},{"location":"chapter_computational_complexity/time_complexity/#235-worst-best-and-average-time-complexities","title":"2.3.5 \u00a0 Worst, best, and average time complexities","text":"

The time efficiency of an algorithm is often not fixed but depends on the distribution of the input data. Assume we have an array nums of length \\(n\\), consisting of numbers from \\(1\\) to \\(n\\), each appearing only once, but in a randomly shuffled order. The task is to return the index of the element \\(1\\). We can draw the following conclusions:

  • When nums = [?, ?, ..., 1], that is, when the last element is \\(1\\), it requires a complete traversal of the array, achieving the worst-case time complexity of \\(O(n)\\).
  • When nums = [1, ?, ?, ...], that is, when the first element is \\(1\\), no matter the length of the array, no further traversal is needed, achieving the best-case time complexity of \\(\\Omega(1)\\).

The \"worst-case time complexity\" corresponds to the asymptotic upper bound, denoted by the big \\(O\\) notation. Correspondingly, the \"best-case time complexity\" corresponds to the asymptotic lower bound, denoted by \\(\\Omega\\):

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
Code Visualization

Full Screen >

It's important to note that the best-case time complexity is rarely used in practice, as it is usually only achievable under very low probabilities and might be misleading. The worst-case time complexity is more practical as it provides a safety value for efficiency, allowing us to confidently use the algorithm.

From the above example, it's clear that both the worst-case and best-case time complexities only occur under \"special data distributions,\" which may have a small probability of occurrence and may not accurately reflect the algorithm's run efficiency. In contrast, the average time complexity can reflect the algorithm's efficiency under random input data, denoted by the \\(\\Theta\\) notation.

For some algorithms, we can simply estimate the average case under a random data distribution. For example, in the aforementioned example, since the input array is shuffled, the probability of element \\(1\\) appearing at any index is equal. Therefore, the average number of loops for the algorithm is half the length of the array \\(n / 2\\), giving an average time complexity of \\(\\Theta(n / 2) = \\Theta(n)\\).

However, calculating the average time complexity for more complex algorithms can be quite difficult, as it's challenging to analyze the overall mathematical expectation under the data distribution. In such cases, we usually use the worst-case time complexity as the standard for judging the efficiency of the algorithm.

Why is the \\(\\Theta\\) symbol rarely seen?

Possibly because the \\(O\\) notation is more commonly spoken, it is often used to represent the average time complexity. However, strictly speaking, this practice is not accurate. In this book and other materials, if you encounter statements like \"average time complexity \\(O(n)\\)\", please understand it directly as \\(\\Theta(n)\\).

"},{"location":"chapter_data_structure/","title":"Chapter 3. \u00a0 Data structures","text":"

Abstract

Data structures serve as a robust and diverse framework.

They offer a blueprint for the orderly organization of data, upon which algorithms come to life.

"},{"location":"chapter_data_structure/#chapter-contents","title":"Chapter contents","text":"
  • 3.1 \u00a0 Classification of data structures
  • 3.2 \u00a0 Basic data types
  • 3.3 \u00a0 Number encoding *
  • 3.4 \u00a0 Character encoding *
  • 3.5 \u00a0 Summary
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 Basic data types","text":"

When discussing data in computers, various forms like text, images, videos, voice and 3D models comes to mind. Despite their different organizational forms, they are all composed of various basic data types.

Basic data types are those that the CPU can directly operate on and are directly used in algorithms, mainly including the following.

  • Integer types: byte, short, int, long.
  • Floating-point types: float, double, used to represent decimals.
  • Character type: char, used to represent letters, punctuation, and even emojis in various languages.
  • Boolean type: bool, used to represent \"yes\" or \"no\" decisions.

Basic data types are stored in computers in binary form. One binary digit is 1 bit. In most modern operating systems, 1 byte consists of 8 bits.

The range of values for basic data types depends on the size of the space they occupy. Below, we take Java as an example.

  • The integer type byte occupies 1 byte = 8 bits and can represent \\(2^8\\) numbers.
  • The integer type int occupies 4 bytes = 32 bits and can represent \\(2^{32}\\) numbers.

The following table lists the space occupied, value range, and default values of various basic data types in Java. While memorizing this table isn't necessary, having a general understanding of it and referencing it when required is recommended.

Table 3-1 \u00a0 Space occupied and value range of basic data types

Type Symbol Space Occupied Minimum Value Maximum Value Default Value Integer byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) 0 short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) 0 int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) 0 long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) 0 Float float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) 0.0 Char char 2 bytes 0 \\(2^{16} - 1\\) 0 Boolean bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

Please note that the above table is specific to Java's basic data types. Every programming language has its own data type definitions, which might differ in space occupied, value ranges, and default values.

  • In Python, the integer type int can be of any size, limited only by available memory; the floating-point float is double precision 64-bit; there is no char type, as a single character is actually a string str of length 1.
  • C and C++ do not specify the size of basic data types, it varies with implementation and platform. The above table follows the LP64 data model, used for Unix 64-bit operating systems including Linux and macOS.
  • The size of char in C and C++ is 1 byte, while in most programming languages, it depends on the specific character encoding method, as detailed in the \"Character Encoding\" chapter.
  • Even though representing a boolean only requires 1 bit (0 or 1), it is usually stored in memory as 1 byte. This is because modern computer CPUs typically use 1 byte as the smallest addressable memory unit.

So, what is the connection between basic data types and data structures? We know that data structures are ways to organize and store data in computers. The focus here is on \"structure\" rather than \"data\".

If we want to represent \"a row of numbers\", we naturally think of using an array. This is because the linear structure of an array can represent the adjacency and the ordering of the numbers, but whether the stored content is an integer int, a decimal float, or a character char, is irrelevant to the \"data structure\".

In other words, basic data types provide the \"content type\" of data, while data structures provide the \"way of organizing\" data. For example, in the following code, we use the same data structure (array) to store and represent different basic data types, including int, float, char, bool, etc.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
# Using various basic data types to initialize arrays\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python's characters are actually strings of length 1\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python's lists can freely store various basic data types and object references\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// Using various basic data types to initialize arrays\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// Using various basic data types to initialize arrays\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// Using various basic data types to initialize arrays\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript's arrays can freely store various basic data types and objects\nconst array = [0, 0.0, 'a', false];\n
// Using various basic data types to initialize arrays\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// Using various basic data types to initialize arrays\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// Using various basic data types to initialize arrays\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0, 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// Using various basic data types to initialize arrays\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
\n
// Using various basic data types to initialize arrays\nvar numbers: [5]i32 = undefined;\nvar decimals: [5]f32 = undefined;\nvar characters: [5]u8 = undefined;\nvar bools: [5]bool = undefined;\n
"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 Character encoding *","text":"

In the computer system, all data is stored in binary form, and characters (represented by char) are no exception. To represent characters, we need to develop a \"character set\" that defines a one-to-one mapping between each character and binary numbers. With the character set, computers can convert binary numbers to characters by looking up the table.

"},{"location":"chapter_data_structure/character_encoding/#341-ascii-character-set","title":"3.4.1 \u00a0 ASCII character set","text":"

The \"ASCII code\" is one of the earliest character sets, officially known as the American Standard Code for Information Interchange. It uses 7 binary digits (the lower 7 bits of a byte) to represent a character, allowing for a maximum of 128 different characters. As shown in the Figure 3-6 , ASCII includes uppercase and lowercase English letters, numbers 0 ~ 9, various punctuation marks, and certain control characters (such as newline and tab).

Figure 3-6 \u00a0 ASCII code

However, ASCII can only represent English characters. With the globalization of computers, a character set called \"EASCII\" was developed to represent more languages. It expands from the 7-bit structure of ASCII to 8 bits, enabling the representation of 256 characters.

Globally, various region-specific EASCII character sets have been introduced. The first 128 characters of these sets are consistent with the ASCII, while the remaining 128 characters are defined differently to accommodate the requirements of different languages.

"},{"location":"chapter_data_structure/character_encoding/#342-gbk-character-set","title":"3.4.2 \u00a0 GBK character set","text":"

Later, it was found that EASCII still could not meet the character requirements of many languages. For instance, there are nearly a hundred thousand Chinese characters, with several thousand used regularly. In 1980, the Standardization Administration of China released the \"GB2312\" character set, which included 6763 Chinese characters, essentially fulfilling the computer processing needs for the Chinese language.

However, GB2312 could not handle some rare and traditional characters. The \"GBK\" character set expands GB2312 and includes 21886 Chinese characters. In the GBK encoding scheme, ASCII characters are represented with one byte, while Chinese characters use two bytes.

"},{"location":"chapter_data_structure/character_encoding/#343-unicode-character-set","title":"3.4.3 \u00a0 Unicode character set","text":"

With the rapid evolution of computer technology and a plethora of character sets and encoding standards, numerous problems arose. On the one hand, these character sets generally only defined characters for specific languages and could not function properly in multilingual environments. On the other hand, the existence of multiple character set standards for the same language caused garbled text when information was exchanged between computers using different encoding standards.

Researchers of that era thought: What if a comprehensive character set encompassing all global languages and symbols was developed? Wouldn't this resolve the issues associated with cross-linguistic environments and garbled text? Inspired by this idea, the extensive character set, Unicode, was born.

\"Unicode\" is referred to as \"\u7edf\u4e00\u7801\" (Unified Code) in Chinese, theoretically capable of accommodating over a million characters. It aims to incorporate characters from all over the world into a single set, providing a universal character set for processing and displaying various languages and reducing the issues of garbled text due to different encoding standards.

Since its release in 1991, Unicode has continually expanded to include new languages and characters. As of September 2022, Unicode contains 149,186 characters, including characters, symbols, and even emojis from various languages. In the vast Unicode character set, commonly used characters occupy 2 bytes, while some rare characters may occupy 3 or even 4 bytes.

Unicode is a universal character set that assigns a number (called a \"code point\") to each character, but it does not specify how these character code points should be stored in a computer system. One might ask: How does a system interpret Unicode code points of varying lengths within a text? For example, given a 2-byte code, how does the system determine if it represents a single 2-byte character or two 1-byte characters?

A straightforward solution to this problem is to store all characters as equal-length encodings. As shown in the Figure 3-7 , each character in \"Hello\" occupies 1 byte, while each character in \"\u7b97\u6cd5\" (algorithm) occupies 2 bytes. We could encode all characters in \"Hello \u7b97\u6cd5\" as 2 bytes by padding the higher bits with zeros. This method would enable the system to interpret a character every 2 bytes, recovering the content of the phrase.

Figure 3-7 \u00a0 Unicode encoding example

However, as ASCII has shown us, encoding English only requires 1 byte. Using the above approach would double the space occupied by English text compared to ASCII encoding, which is a waste of memory space. Therefore, a more efficient Unicode encoding method is needed.

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8-encoding","title":"3.4.4 \u00a0 UTF-8 encoding","text":"

Currently, UTF-8 has become the most widely used Unicode encoding method internationally. It is a variable-length encoding, using 1 to 4 bytes to represent a character, depending on the complexity of the character. ASCII characters need only 1 byte, Latin and Greek letters require 2 bytes, commonly used Chinese characters need 3 bytes, and some other rare characters need 4 bytes.

The encoding rules for UTF-8 are not complex and can be divided into two cases:

  • For 1-byte characters, set the highest bit to \\(0\\), and the remaining 7 bits to the Unicode code point. Notably, ASCII characters occupy the first 128 code points in the Unicode set. This means that UTF-8 encoding is backward compatible with ASCII. This implies that UTF-8 can be used to parse ancient ASCII text.
  • For characters of length \\(n\\) bytes (where \\(n > 1\\)), set the highest \\(n\\) bits of the first byte to \\(1\\), and the \\((n + 1)^{\\text{th}}\\) bit to \\(0\\); starting from the second byte, set the highest 2 bits of each byte to \\(10\\); the rest of the bits are used to fill the Unicode code point.

The Figure 3-8 shows the UTF-8 encoding for \"Hello\u7b97\u6cd5\". It can be observed that since the highest \\(n\\) bits are set to \\(1\\), the system can determine the length of the character as \\(n\\) by counting the number of highest bits set to \\(1\\).

But why set the highest 2 bits of the remaining bytes to \\(10\\)? Actually, this \\(10\\) serves as a kind of checksum. If the system starts parsing text from an incorrect byte, the \\(10\\) at the beginning of the byte can help the system quickly detect anomalies.

The reason for using \\(10\\) as a checksum is that, under UTF-8 encoding rules, it's impossible for the highest two bits of a character to be \\(10\\). This can be proven by contradiction: If the highest two bits of a character are \\(10\\), it indicates that the character's length is \\(1\\), corresponding to ASCII. However, the highest bit of an ASCII character should be \\(0\\), which contradicts the assumption.

Figure 3-8 \u00a0 UTF-8 encoding example

Apart from UTF-8, other common encoding methods include:

  • UTF-16 encoding: Uses 2 or 4 bytes to represent a character. All ASCII characters and commonly used non-English characters are represented with 2 bytes; a few characters require 4 bytes. For 2-byte characters, the UTF-16 encoding equals the Unicode code point.
  • UTF-32 encoding: Every character uses 4 bytes. This means UTF-32 occupies more space than UTF-8 and UTF-16, especially for texts with a high proportion of ASCII characters.

From the perspective of storage space, using UTF-8 to represent English characters is very efficient because it only requires 1 byte; using UTF-16 to encode some non-English characters (such as Chinese) can be more efficient because it only requires 2 bytes, while UTF-8 might need 3 bytes.

From a compatibility perspective, UTF-8 is the most versatile, with many tools and libraries supporting UTF-8 as a priority.

"},{"location":"chapter_data_structure/character_encoding/#345-character-encoding-in-programming-languages","title":"3.4.5 \u00a0 Character encoding in programming languages","text":"

Historically, many programming languages utilized fixed-length encodings such as UTF-16 or UTF-32 for processing strings during program execution. This allows strings to be handled as arrays, offering several advantages:

  • Random access: Strings encoded in UTF-16 can be accessed randomly with ease. For UTF-8, which is a variable-length encoding, locating the \\(i^{th}\\) character requires traversing the string from the start to the \\(i^{th}\\) position, taking \\(O(n)\\) time.
  • Character counting: Similar to random access, counting the number of characters in a UTF-16 encoded string is an \\(O(1)\\) operation. However, counting characters in a UTF-8 encoded string requires traversing the entire string.
  • String operations: Many string operations like splitting, concatenating, inserting, and deleting are easier on UTF-16 encoded strings. These operations generally require additional computation on UTF-8 encoded strings to ensure the validity of the UTF-8 encoding.

The design of character encoding schemes in programming languages is an interesting topic involving various factors:

  • Java\u2019s String type uses UTF-16 encoding, with each character occupying 2 bytes. This was based on the initial belief that 16 bits were sufficient to represent all possible characters and proven incorrect later. As the Unicode standard expanded beyond 16 bits, characters in Java may now be represented by a pair of 16-bit values, known as \u201csurrogate pairs.\u201d
  • JavaScript and TypeScript use UTF-16 encoding for similar reasons as Java. When JavaScript was first introduced by Netscape in 1995, Unicode was still in its early stages, and 16-bit encoding was sufficient to represent all Unicode characters.
  • C# uses UTF-16 encoding, largely because the .NET platform, designed by Microsoft, and many Microsoft technologies, including the Windows operating system, extensively use UTF-16 encoding.

Due to the underestimation of character counts, these languages had to use \"surrogate pairs\" to represent Unicode characters exceeding 16 bits. This approach has its drawbacks: strings containing surrogate pairs may have characters occupying 2 or 4 bytes, losing the advantage of fixed-length encoding. Additionally, handling surrogate pairs adds complexity and debugging difficulty to programming.

Addressing these challenges, some languages have adopted alternative encoding strategies:

  • Python\u2019s str type uses Unicode encoding with a flexible representation where the storage length of characters depends on the largest Unicode code point in the string. If all characters are ASCII, each character occupies 1 byte, 2 bytes for characters within the Basic Multilingual Plane (BMP), and 4 bytes for characters beyond the BMP.
  • Go\u2019s string type internally uses UTF-8 encoding. Go also provides the rune type for representing individual Unicode code points.
  • Rust\u2019s str and String types use UTF-8 encoding internally. Rust also offers the char type for individual Unicode code points.

It\u2019s important to note that the above discussion pertains to how strings are stored in programming languages, which is different from how strings are stored in files or transmitted over networks. For file storage or network transmission, strings are usually encoded in UTF-8 format for optimal compatibility and space efficiency.

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 Classification of data structures","text":"

Common data structures include arrays, linked lists, stacks, queues, hash tables, trees, heaps, and graphs. They can be classified into \"logical structure\" and \"physical structure\".

"},{"location":"chapter_data_structure/classification_of_data_structure/#311-logical-structure-linear-and-non-linear","title":"3.1.1 \u00a0 Logical structure: linear and non-linear","text":"

The logical structures reveal the logical relationships between data elements. In arrays and linked lists, data are arranged in a specific sequence, demonstrating the linear relationship between data; while in trees, data are arranged hierarchically from the top down, showing the derived relationship between \"ancestors\" and \"descendants\"; and graphs are composed of nodes and edges, reflecting the intricate network relationship.

As shown in the Figure 3-1 , logical structures can be divided into two major categories: \"linear\" and \"non-linear\". Linear structures are more intuitive, indicating data is arranged linearly in logical relationships; non-linear structures, conversely, are arranged non-linearly.

  • Linear data structures: Arrays, Linked Lists, Stacks, Queues, Hash Tables.
  • Non-linear data structures: Trees, Heaps, Graphs, Hash Tables.

Figure 3-1 \u00a0 Linear and non-linear data structures

Non-linear data structures can be further divided into tree structures and network structures.

  • Linear structures: Arrays, linked lists, queues, stacks, and hash tables, where elements have a one-to-one sequential relationship.
  • Tree structures: Trees, Heaps, Hash Tables, where elements have a one-to-many relationship.
  • Network structures: Graphs, where elements have a many-to-many relationships.
"},{"location":"chapter_data_structure/classification_of_data_structure/#312-physical-structure-contiguous-and-dispersed","title":"3.1.2 \u00a0 Physical structure: contiguous and dispersed","text":"

During the execution of an algorithm, the data being processed is stored in memory. The Figure 3-2 shows a computer memory stick where each black square is a physical memory space. We can think of memory as a vast Excel spreadsheet, with each cell capable of storing a certain amount of data.

The system accesses the data at the target location by means of a memory address. As shown in the Figure 3-2 , the computer assigns a unique identifier to each cell in the table according to specific rules, ensuring that each memory space has a unique memory address. With these addresses, the program can access the data stored in memory.

Figure 3-2 \u00a0 Memory stick, memory spaces, memory addresses

Tip

It's worth noting that comparing memory to an Excel spreadsheet is a simplified analogy. The actual working mechanism of memory is more complex, involving concepts like address space, memory management, cache mechanisms, virtual memory, and physical memory.

Memory is a shared resource for all programs. When a block of memory is occupied by one program, it cannot be simultaneously used by other programs. Therefore, considering memory resources is crucial in designing data structures and algorithms. For instance, the algorithm's peak memory usage should not exceed the remaining free memory of the system; if there is a lack of contiguous memory blocks, then the data structure chosen must be able to be stored in non-contiguous memory blocks.

As illustrated in the Figure 3-3 , the physical structure reflects the way data is stored in computer memory and it can be divided into contiguous space storage (arrays) and non-contiguous space storage (linked lists). The two types of physical structures exhibit complementary characteristics in terms of time efficiency and space efficiency.

Figure 3-3 \u00a0 Contiguous space storage and dispersed space storage

It is worth noting that all data structures are implemented based on arrays, linked lists, or a combination of both. For example, stacks and queues can be implemented using either arrays or linked lists; while implementations of hash tables may involve both arrays and linked lists. - Array-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, Matrices, Tensors (arrays with dimensions \\(\\geq 3\\)). - Linked-list-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, etc.

Data structures implemented based on arrays are also called \u201cStatic Data Structures,\u201d meaning their length cannot be changed after initialization. Conversely, those based on linked lists are called \u201cDynamic Data Structures,\u201d which can still adjust their size during program execution.

Tip

If you find it challenging to comprehend the physical structure, it is recommended that you read the next chapter, \"Arrays and Linked Lists,\" and revisit this section later.

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 Number encoding *","text":"

Tip

In this book, chapters marked with an asterisk '*' are optional readings. If you are short on time or find them challenging, you may skip these initially and return to them after completing the essential chapters.

"},{"location":"chapter_data_structure/number_encoding/#331-integer-encoding","title":"3.3.1 \u00a0 Integer encoding","text":"

In the table from the previous section, we observed that all integer types can represent one more negative number than positive numbers, such as the byte range of \\([-128, 127]\\). This phenomenon seems counterintuitive, and its underlying reason involves knowledge of sign-magnitude, one's complement, and two's complement encoding.

Firstly, it's important to note that numbers are stored in computers using the two's complement form. Before analyzing why this is the case, let's define these three encoding methods:

  • Sign-magnitude: The highest bit of a binary representation of a number is considered the sign bit, where \\(0\\) represents a positive number and \\(1\\) represents a negative number. The remaining bits represent the value of the number.
  • One's complement: The one's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by inverting all bits except the sign bit.
  • Two's complement: The two's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by adding \\(1\\) to their one's complement.

The following diagram illustrates the conversions among sign-magnitude, one's complement, and two's complement:

Figure 3-4 \u00a0 Conversions between sign-magnitude, one's complement, and two's complement

Although sign-magnitude is the most intuitive, it has limitations. For one, negative numbers in sign-magnitude cannot be directly used in calculations. For example, in sign-magnitude, calculating \\(1 + (-2)\\) results in \\(-3\\), which is incorrect.

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

To address this, computers introduced the one's complement. If we convert to one's complement and calculate \\(1 + (-2)\\), then convert the result back to sign-magnitude, we get the correct result of \\(-1\\).

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(Sign-magnitude)} + 1000 \\; 0010 \\; \\text{(Sign-magnitude)} \\newline & = 0000 \\; 0001 \\; \\text{(One's complement)} + 1111 \\; 1101 \\; \\text{(One's complement)} \\newline & = 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & \\rightarrow -1 \\end{aligned} \\]

Additionally, there are two representations of zero in sign-magnitude: \\(+0\\) and \\(-0\\). This means two different binary encodings for zero, which could lead to ambiguity. For example, in conditional checks, not differentiating between positive and negative zero might result in incorrect outcomes. Addressing this ambiguity would require additional checks, potentially reducing computational efficiency.

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

Like sign-magnitude, one's complement also suffers from the positive and negative zero ambiguity. Therefore, computers further introduced the two's complement. Let's observe the conversion process for negative zero in sign-magnitude, one's complement, and two's complement:

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(Sign-magnitude)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(One's complement)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(Two's complement)} \\newline \\end{aligned} \\]

Adding \\(1\\) to the one's complement of negative zero produces a carry, but with byte length being only 8 bits, the carried-over \\(1\\) to the 9th bit is discarded. Therefore, the two's complement of negative zero is \\(0000 \\; 0000\\), the same as positive zero, thus resolving the ambiguity.

One last puzzle is the \\([-128, 127]\\) range for byte, with an additional negative number, \\(-128\\). We observe that for the interval \\([-127, +127]\\), all integers have corresponding sign-magnitude, one's complement, and two's complement, allowing for mutual conversion between them.

However, the two's complement \\(1000 \\; 0000\\) is an exception without a corresponding sign-magnitude. According to the conversion method, its sign-magnitude would be \\(0000 \\; 0000\\), indicating zero. This presents a contradiction because its two's complement should represent itself. Computers designate this special two's complement \\(1000 \\; 0000\\) as representing \\(-128\\). In fact, the calculation of \\((-1) + (-127)\\) in two's complement results in \\(-128\\).

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(Sign-magnitude)} + 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & = 1000 \\; 0000 \\; \\text{(One's complement)} + 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Two's complement)} + 1111 \\; 1111 \\; \\text{(Two's complement)} \\newline & = 1000 \\; 0000 \\; \\text{(Two's complement)} \\newline & \\rightarrow -128 \\end{aligned} \\]

As you might have noticed, all these calculations are additions, hinting at an important fact: computers' internal hardware circuits are primarily designed around addition operations. This is because addition is simpler to implement in hardware compared to other operations like multiplication, division, and subtraction, allowing for easier parallelization and faster computation.

It's important to note that this doesn't mean computers can only perform addition. By combining addition with basic logical operations, computers can execute a variety of other mathematical operations. For example, the subtraction \\(a - b\\) can be translated into \\(a + (-b)\\); multiplication and division can be translated into multiple additions or subtractions.

We can now summarize the reason for using two's complement in computers: with two's complement representation, computers can use the same circuits and operations to handle both positive and negative number addition, eliminating the need for special hardware circuits for subtraction and avoiding the ambiguity of positive and negative zero. This greatly simplifies hardware design and enhances computational efficiency.

The design of two's complement is quite ingenious, and due to space constraints, we'll stop here. Interested readers are encouraged to explore further.

"},{"location":"chapter_data_structure/number_encoding/#332-floating-point-number-encoding","title":"3.3.2 \u00a0 Floating-point number encoding","text":"

You might have noticed something intriguing: despite having the same length of 4 bytes, why does a float have a much larger range of values compared to an int? This seems counterintuitive, as one would expect the range to shrink for float since it needs to represent fractions.

In fact, this is due to the different representation method used by floating-point numbers (float). Let's consider a 32-bit binary number as:

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

According to the IEEE 754 standard, a 32-bit float consists of the following three parts:

  • Sign bit \\(\\mathrm{S}\\): Occupies 1 bit, corresponding to \\(b_{31}\\).
  • Exponent bit \\(\\mathrm{E}\\): Occupies 8 bits, corresponding to \\(b_{30} b_{29} \\ldots b_{23}\\).
  • Fraction bit \\(\\mathrm{N}\\): Occupies 23 bits, corresponding to \\(b_{22} b_{21} \\ldots b_0\\).

The value of a binary float number is calculated as:

\\[ \\text{val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2 - 127} \\times \\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

Converted to a decimal formula, this becomes:

\\[ \\text{val} = (-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} - 127} \\times (1 + \\mathrm{N}) \\]

The range of each component is:

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} \\times 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

Figure 3-5 \u00a0 Example calculation of a float in IEEE 754 standard

Observing the diagram, given an example data \\(\\mathrm{S} = 0\\), \\(\\mathrm{E} = 124\\), \\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\), we have:

\\[ \\text{val} = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

Now we can answer the initial question: The representation of float includes an exponent bit, leading to a much larger range than int. Based on the above calculation, the maximum positive number representable by float is approximately \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\), and the minimum negative number is obtained by switching the sign bit.

However, the trade-off for float's expanded range is a sacrifice in precision. The integer type int uses all 32 bits to represent the number, with values evenly distributed; but due to the exponent bit, the larger the value of a float, the greater the difference between adjacent numbers.

As shown in the Table 3-2 , exponent bits \\(\\mathrm{E} = 0\\) and \\(\\mathrm{E} = 255\\) have special meanings, used to represent zero, infinity, \\(\\mathrm{NaN}\\), etc.

Table 3-2 \u00a0 Meaning of exponent bits

Exponent Bit E Fraction Bit \\(\\mathrm{N} = 0\\) Fraction Bit \\(\\mathrm{N} \\ne 0\\) Calculation Formula \\(0\\) \\(\\pm 0\\) Subnormal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) Normal Numbers Normal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

It's worth noting that subnormal numbers significantly improve the precision of floating-point numbers. The smallest positive normal number is \\(2^{-126}\\), and the smallest positive subnormal number is \\(2^{-126} \\times 2^{-23}\\).

Double-precision double also uses a similar representation method to float, which is not elaborated here for brevity.

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 Summary","text":""},{"location":"chapter_data_structure/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Data structures can be categorized from two perspectives: logical structure and physical structure. Logical structure describes the logical relationships between data elements, while physical structure describes how data is stored in computer memory.
  • Common logical structures include linear, tree-like, and network structures. We generally classify data structures into linear (arrays, linked lists, stacks, queues) and non-linear (trees, graphs, heaps) based on their logical structure. The implementation of hash tables may involve both linear and non-linear data structures.
  • When a program runs, data is stored in computer memory. Each memory space has a corresponding memory address, and the program accesses data through these addresses.
  • Physical structures are primarily divided into contiguous space storage (arrays) and dispersed space storage (linked lists). All data structures are implemented using arrays, linked lists, or a combination of both.
  • Basic data types in computers include integers (byte, short, int, long), floating-point numbers (float, double), characters (char), and booleans (boolean). Their range depends on the size of the space occupied and the representation method.
  • Original code, complement code, and two's complement code are three methods of encoding numbers in computers, and they can be converted into each other. The highest bit of the original code of an integer is the sign bit, and the remaining bits represent the value of the number.
  • Integers are stored in computers in the form of two's complement. In this representation, the computer can treat the addition of positive and negative numbers uniformly, without the need for special hardware circuits for subtraction, and there is no ambiguity of positive and negative zero.
  • The encoding of floating-point numbers consists of 1 sign bit, 8 exponent bits, and 23 fraction bits. Due to the presence of the exponent bit, the range of floating-point numbers is much greater than that of integers, but at the cost of sacrificing precision.
  • ASCII is the earliest English character set, 1 byte in length, and includes 127 characters. The GBK character set is a commonly used Chinese character set, including more than 20,000 Chinese characters. Unicode strives to provide a complete character set standard, including characters from various languages worldwide, thus solving the problem of garbled characters caused by inconsistent character encoding methods.
  • UTF-8 is the most popular Unicode encoding method, with excellent universality. It is a variable-length encoding method with good scalability and effectively improves the efficiency of space usage. UTF-16 and UTF-32 are fixed-length encoding methods. When encoding Chinese characters, UTF-16 occupies less space than UTF-8. Programming languages like Java and C# use UTF-16 encoding by default.
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Why does a hash table contain both linear and non-linear data structures?

The underlying structure of a hash table is an array. To resolve hash collisions, we may use \"chaining\": each bucket in the array points to a linked list, which, when exceeding a certain threshold, might be transformed into a tree (usually a red-black tree). From a storage perspective, the foundation of a hash table is an array, where each bucket slot might contain a value, a linked list, or a tree. Therefore, hash tables may contain both linear data structures (arrays, linked lists) and non-linear data structures (trees).

Q: Is the length of the char type 1 byte?

The length of the char type is determined by the encoding method used by the programming language. For example, Java, JavaScript, TypeScript, and C# all use UTF-16 encoding (to save Unicode code points), so the length of the char type is 2 bytes.

Q: Is there ambiguity in calling data structures based on arrays \"static data structures\"? Because operations like push and pop on stacks are \"dynamic\".

While stacks indeed allow for dynamic data operations, the data structure itself remains \"static\" (with unchangeable length). Even though data structures based on arrays can dynamically add or remove elements, their capacity is fixed. If the data volume exceeds the pre-allocated size, a new, larger array needs to be created, and the contents of the old array copied into it.

Q: When building stacks (queues) without specifying their size, why are they considered \"static data structures\"?

In high-level programming languages, we don't need to manually specify the initial capacity of stacks (queues); this task is automatically handled internally by the class. For example, the initial capacity of Java's ArrayList is usually 10. Furthermore, the expansion operation is also implemented automatically. See the subsequent \"List\" chapter for details.

"},{"location":"chapter_graph/","title":"Chapter 9. \u00a0 Graph","text":"

Abstract

In the journey of life, we are like individual nodes, connected by countless invisible edges.

Each encounter and parting leaves a distinctive imprint on this vast network graph.

"},{"location":"chapter_graph/#chapter-contents","title":"Chapter contents","text":"
  • 9.1 \u00a0 Graph
  • 9.2 \u00a0 Basic graph operations
  • 9.3 \u00a0 Graph traversal
  • 9.4 \u00a0 Summary
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 Graph","text":"

A \"graph\" is a type of nonlinear data structure, consisting of \"vertices\" and \"edges\". A graph \\(G\\) can be abstractly represented as a collection of a set of vertices \\(V\\) and a set of edges \\(E\\). The following example shows a graph containing 5 vertices and 7 edges.

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

If vertices are viewed as nodes and edges as references (pointers) connecting the nodes, graphs can be seen as a data structure that extends from linked lists. As shown below, compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) are more complex due to their higher degree of freedom.

Figure 9-1 \u00a0 Relationship between linked lists, trees, and graphs

"},{"location":"chapter_graph/graph/#911-common-types-of-graphs","title":"9.1.1 \u00a0 Common types of graphs","text":"

Based on whether edges have direction, graphs can be divided into \"undirected graphs\" and \"directed graphs\", as shown below.

  • In undirected graphs, edges represent a \"bidirectional\" connection between two vertices, for example, the \"friendship\" in WeChat or QQ.
  • In directed graphs, edges have directionality, that is, the edges \\(A \\rightarrow B\\) and \\(A \\leftarrow B\\) are independent of each other, for example, the \"follow\" and \"be followed\" relationship on Weibo or TikTok.

Figure 9-2 \u00a0 Directed and undirected graphs

Based on whether all vertices are connected, graphs can be divided into \"connected graphs\" and \"disconnected graphs\", as shown below.

  • For connected graphs, it is possible to reach any other vertex starting from a certain vertex.
  • For disconnected graphs, there is at least one vertex that cannot be reached from a certain starting vertex.

Figure 9-3 \u00a0 Connected and disconnected graphs

We can also add a \"weight\" variable to edges, resulting in \"weighted graphs\" as shown below. For example, in mobile games like \"Honor of Kings\", the system calculates the \"closeness\" between players based on shared gaming time, and this closeness network can be represented with a weighted graph.

Figure 9-4 \u00a0 Weighted and unweighted graphs

Graph data structures include the following commonly used terms.

  • \"Adjacency\": When there is an edge connecting two vertices, these two vertices are said to be \"adjacent\". In the above figure, the adjacent vertices of vertex 1 are vertices 2, 3, and 5.
  • \"Path\": The sequence of edges passed from vertex A to vertex B is called a \"path\" from A to B. In the above figure, the edge sequence 1-5-2-4 is a path from vertex 1 to vertex 4.
  • \"Degree\": The number of edges a vertex has. For directed graphs, \"in-degree\" refers to how many edges point to the vertex, and \"out-degree\" refers to how many edges point out from the vertex.
"},{"location":"chapter_graph/graph/#912-representation-of-graphs","title":"9.1.2 \u00a0 Representation of graphs","text":"

Common representations of graphs include \"adjacency matrices\" and \"adjacency lists\". The following examples use undirected graphs.

"},{"location":"chapter_graph/graph/#1-adjacency-matrix","title":"1. \u00a0 Adjacency matrix","text":"

Let the number of vertices in the graph be \\(n\\), the \"adjacency matrix\" uses an \\(n \\times n\\) matrix to represent the graph, where each row (column) represents a vertex, and the matrix elements represent edges, with \\(1\\) or \\(0\\) indicating whether there is an edge between two vertices.

As shown below, let the adjacency matrix be \\(M\\), and the list of vertices be \\(V\\), then the matrix element \\(M[i, j] = 1\\) indicates there is an edge between vertex \\(V[i]\\) and vertex \\(V[j]\\), conversely \\(M[i, j] = 0\\) indicates there is no edge between the two vertices.

Figure 9-5 \u00a0 Representation of a graph with an adjacency matrix

Adjacency matrices have the following characteristics.

  • A vertex cannot be connected to itself, so the elements on the main diagonal of the adjacency matrix are meaningless.
  • For undirected graphs, edges in both directions are equivalent, thus the adjacency matrix is symmetric about the main diagonal.
  • By replacing the elements of the adjacency matrix from \\(1\\) and \\(0\\) to weights, it can represent weighted graphs.

When representing graphs with adjacency matrices, it is possible to directly access matrix elements to obtain edges, thus operations of addition, deletion, lookup, and modification are very efficient, all with a time complexity of \\(O(1)\\). However, the space complexity of the matrix is \\(O(n^2)\\), which consumes more memory.

"},{"location":"chapter_graph/graph/#2-adjacency-list","title":"2. \u00a0 Adjacency list","text":"

The \"adjacency list\" uses \\(n\\) linked lists to represent the graph, with each linked list node representing a vertex. The \\(i\\)-th linked list corresponds to vertex \\(i\\) and contains all adjacent vertices (vertices connected to that vertex). The Figure 9-6 shows an example of a graph stored using an adjacency list.

Figure 9-6 \u00a0 Representation of a graph with an adjacency list

The adjacency list only stores actual edges, and the total number of edges is often much less than \\(n^2\\), making it more space-efficient. However, finding edges in the adjacency list requires traversing the linked list, so its time efficiency is not as good as that of the adjacency matrix.

Observing the above figure, the structure of the adjacency list is very similar to the \"chaining\" in hash tables, hence we can use similar methods to optimize efficiency. For example, when the linked list is long, it can be transformed into an AVL tree or red-black tree, thus optimizing the time efficiency from \\(O(n)\\) to \\(O(\\log n)\\); the linked list can also be transformed into a hash table, thus reducing the time complexity to \\(O(1)\\).

"},{"location":"chapter_graph/graph/#913-common-applications-of-graphs","title":"9.1.3 \u00a0 Common applications of graphs","text":"

As shown in the Table 9-1 , many real-world systems can be modeled with graphs, and corresponding problems can be reduced to graph computing problems.

Table 9-1 \u00a0 Common graphs in real life

Vertices Edges Graph Computing Problem Social Networks Users Friendships Potential Friend Recommendations Subway Lines Stations Connectivity Between Stations Shortest Route Recommendations Solar System Celestial Bodies Gravitational Forces Between Celestial Bodies Planetary Orbit Calculations"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 Basic operations on graphs","text":"

The basic operations on graphs can be divided into operations on \"edges\" and operations on \"vertices\". Under the two representation methods of \"adjacency matrix\" and \"adjacency list\", the implementation methods are different.

"},{"location":"chapter_graph/graph_operations/#921-implementation-based-on-adjacency-matrix","title":"9.2.1 \u00a0 Implementation based on adjacency matrix","text":"

Given an undirected graph with \\(n\\) vertices, the various operations are implemented as shown in the Figure 9-7 .

  • Adding or removing an edge: Directly modify the specified edge in the adjacency matrix, using \\(O(1)\\) time. Since it is an undirected graph, it is necessary to update the edges in both directions simultaneously.
  • Adding a vertex: Add a row and a column at the end of the adjacency matrix and fill them all with \\(0\\)s, using \\(O(n)\\) time.
  • Removing a vertex: Delete a row and a column in the adjacency matrix. The worst case is when the first row and column are removed, requiring \\((n-1)^2\\) elements to be \"moved up and to the left\", thus using \\(O(n^2)\\) time.
  • Initialization: Pass in \\(n\\) vertices, initialize a vertex list vertices of length \\(n\\), using \\(O(n)\\) time; initialize an \\(n \\times n\\) size adjacency matrix adjMat, using \\(O(n^2)\\) time.
Initialize adjacency matrixAdd an edgeRemove an edgeAdd a vertexRemove a vertex

Figure 9-7 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency matrix

Below is the implementation code for graphs represented using an adjacency matrix:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_graph/graph_operations/#922-implementation-based-on-adjacency-list","title":"9.2.2 \u00a0 Implementation based on adjacency list","text":"

Given an undirected graph with a total of \\(n\\) vertices and \\(m\\) edges, the various operations can be implemented as shown in the Figure 9-8 .

  • Adding an edge: Simply add the edge at the end of the corresponding vertex's linked list, using \\(O(1)\\) time. Because it is an undirected graph, it is necessary to add edges in both directions simultaneously.
  • Removing an edge: Find and remove the specified edge in the corresponding vertex's linked list, using \\(O(m)\\) time. In an undirected graph, it is necessary to remove edges in both directions simultaneously.
  • Adding a vertex: Add a linked list in the adjacency list and make the new vertex the head node of the list, using \\(O(1)\\) time.
  • Removing a vertex: It is necessary to traverse the entire adjacency list, removing all edges that include the specified vertex, using \\(O(n + m)\\) time.
  • Initialization: Create \\(n\\) vertices and \\(2m\\) edges in the adjacency list, using \\(O(n + m)\\) time.
Initialize adjacency listAdd an edgeRemove an edgeAdd a vertexRemove a vertex

Figure 9-8 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency list

Below is the adjacency list code implementation. Compared to the above diagram, the actual code has the following differences.

  • For convenience in adding and removing vertices, and to simplify the code, we use lists (dynamic arrays) instead of linked lists.
  • Use a hash table to store the adjacency list, key being the vertex instance, value being the list (linked list) of adjacent vertices of that vertex.

Additionally, we use the Vertex class to represent vertices in the adjacency list. The reason for this is: if, like with the adjacency matrix, list indexes were used to distinguish different vertices, then suppose you want to delete the vertex at index \\(i\\), you would need to traverse the entire adjacency list and decrement all indexes greater than \\(i\\) by \\(1\\), which is very inefficient. However, if each vertex is a unique Vertex instance, then deleting a vertex does not require any changes to other vertices.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_graph/graph_operations/#923-efficiency-comparison","title":"9.2.3 \u00a0 Efficiency comparison","text":"

Assuming there are \\(n\\) vertices and \\(m\\) edges in the graph, the Table 9-2 compares the time efficiency and space efficiency of the adjacency matrix and adjacency list.

Table 9-2 \u00a0 Comparison of adjacency matrix and adjacency list

Adjacency matrix Adjacency list (Linked list) Adjacency list (Hash table) Determine adjacency \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add an edge \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Remove an edge \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add a vertex \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) Remove a vertex \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) Memory space usage \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

Observing the Table 9-2 , it seems that the adjacency list (hash table) has the best time efficiency and space efficiency. However, in practice, operating on edges in the adjacency matrix is more efficient, requiring only a single array access or assignment operation. Overall, the adjacency matrix exemplifies the principle of \"space for time\", while the adjacency list exemplifies \"time for space\".

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 Graph traversal","text":"

Trees represent a \"one-to-many\" relationship, while graphs have a higher degree of freedom and can represent any \"many-to-many\" relationship. Therefore, we can consider trees as a special case of graphs. Clearly, tree traversal operations are also a special case of graph traversal operations.

Both graphs and trees require the application of search algorithms to implement traversal operations. Graph traversal can be divided into two types: \"Breadth-First Search (BFS)\" and \"Depth-First Search (DFS)\".

"},{"location":"chapter_graph/graph_traversal/#931-breadth-first-search","title":"9.3.1 \u00a0 Breadth-first search","text":"

Breadth-first search is a near-to-far traversal method, starting from a certain node, always prioritizing the visit to the nearest vertices and expanding outwards layer by layer. As shown in the Figure 9-9 , starting from the top left vertex, first traverse all adjacent vertices of that vertex, then traverse all adjacent vertices of the next vertex, and so on, until all vertices have been visited.

Figure 9-9 \u00a0 Breadth-first traversal of a graph

"},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation","title":"1. \u00a0 Algorithm implementation","text":"

BFS is usually implemented with the help of a queue, as shown in the code below. The queue has a \"first in, first out\" property, which aligns with the BFS idea of traversing \"from near to far\".

  1. Add the starting vertex startVet to the queue and start the loop.
  2. In each iteration of the loop, pop the vertex at the front of the queue and record it as visited, then add all adjacent vertices of that vertex to the back of the queue.
  3. Repeat step 2. until all vertices have been visited.

To prevent revisiting vertices, we use a hash table visited to record which nodes have been visited.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
graph_bfs.kt
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
Code Visualization

Full Screen >

The code is relatively abstract, it is suggested to compare with the following figure to deepen the understanding.

<1><2><3><4><5><6><7><8><9><10><11>

Figure 9-10 \u00a0 Steps of breadth-first search of a graph

Is the sequence of breadth-first traversal unique?

Not unique. Breadth-first traversal only requires traversing in a \"from near to far\" order, and the traversal order of multiple vertices at the same distance can be arbitrarily shuffled. For example, in the above figure, the visitation order of vertices \\(1\\) and \\(3\\) can be switched, as can the order of vertices \\(2\\), \\(4\\), and \\(6\\).

"},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"

Time complexity: All vertices will be enqueued and dequeued once, using \\(O(|V|)\\) time; in the process of traversing adjacent vertices, since it is an undirected graph, all edges will be visited \\(2\\) times, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

Space complexity: The maximum number of vertices in list res, hash table visited, and queue que is \\(|V|\\), using \\(O(|V|)\\) space.

"},{"location":"chapter_graph/graph_traversal/#932-depth-first-search","title":"9.3.2 \u00a0 Depth-first search","text":"

Depth-first search is a traversal method that prioritizes going as far as possible and then backtracks when no further paths are available. As shown in the Figure 9-11 , starting from the top left vertex, visit some adjacent vertex of the current vertex until no further path is available, then return and continue until all vertices are traversed.

Figure 9-11 \u00a0 Depth-first traversal of a graph

"},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation_1","title":"1. \u00a0 Algorithm implementation","text":"

This \"go as far as possible and then return\" algorithm paradigm is usually implemented based on recursion. Similar to breadth-first search, in depth-first search, we also need the help of a hash table visited to record the visited vertices to avoid revisiting.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
Code Visualization

Full Screen >

The algorithm process of depth-first search is shown in the following figure.

  • Dashed lines represent downward recursion, indicating that a new recursive method has been initiated to visit a new vertex.
  • Curved dashed lines represent upward backtracking, indicating that this recursive method has returned to the position where this method was initiated.

To deepen the understanding, it is suggested to combine the following figure with the code to simulate (or draw) the entire DFS process in your mind, including when each recursive method is initiated and when it returns.

<1><2><3><4><5><6><7><8><9><10><11>

Figure 9-12 \u00a0 Steps of depth-first search of a graph

Is the sequence of depth-first traversal unique?

Similar to breadth-first traversal, the order of the depth-first traversal sequence is also not unique. Given a certain vertex, exploring in any direction first is possible, that is, the order of adjacent vertices can be arbitrarily shuffled, all being part of depth-first traversal.

Taking tree traversal as an example, \"root \\(\\rightarrow\\) left \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) right \\(\\rightarrow\\) root\" correspond to preorder, inorder, and postorder traversals, respectively. They showcase three types of traversal priorities, yet all three are considered depth-first traversal.

"},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"

Time complexity: All vertices will be visited once, using \\(O(|V|)\\) time; all edges will be visited twice, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

Space complexity: The maximum number of vertices in list res, hash table visited is \\(|V|\\), and the maximum recursion depth is \\(|V|\\), therefore using \\(O(|V|)\\) space.

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 Summary","text":""},{"location":"chapter_graph/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A graph consists of vertices and edges and can be represented as a set comprising a group of vertices and a group of edges.
  • Compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) have a higher degree of freedom and are therefore more complex.
  • The edges of a directed graph have directionality, any vertex in a connected graph is reachable, and each edge in a weighted graph contains a weight variable.
  • Adjacency matrices use matrices to represent graphs, with each row (column) representing a vertex and matrix elements representing edges, using \\(1\\) or \\(0\\) to indicate the presence or absence of an edge between two vertices. Adjacency matrices are highly efficient for add, delete, find, and modify operations, but they consume more space.
  • Adjacency lists use multiple linked lists to represent graphs, with the \\(i^{th}\\) list corresponding to vertex \\(i\\), containing all its adjacent vertices. Adjacency lists save more space compared to adjacency matrices, but since it is necessary to traverse the list to find edges, their time efficiency is lower.
  • When the linked lists in the adjacency list are too long, they can be converted into red-black trees or hash tables to improve query efficiency.
  • From the perspective of algorithmic thinking, adjacency matrices embody the principle of \"space for time,\" while adjacency lists embody \"time for space.\"
  • Graphs can be used to model various real systems, such as social networks, subway routes, etc.
  • A tree is a special case of a graph, and tree traversal is also a special case of graph traversal.
  • Breadth-first traversal of a graph is a search method that expands layer by layer from near to far, usually implemented with a queue.
  • Depth-first traversal of a graph is a search method that prefers to go as deep as possible and backtracks when no further paths are available, often based on recursion.
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is a path defined as a sequence of vertices or a sequence of edges?

Definitions vary between different language versions on Wikipedia: the English version defines a path as \"a sequence of edges,\" while the Chinese version defines it as \"a sequence of vertices.\" Here is the original text from the English version: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

In this document, a path is considered a sequence of edges, rather than a sequence of vertices. This is because there might be multiple edges connecting two vertices, in which case each edge corresponds to a path.

Q: In a disconnected graph, are there points that cannot be traversed to?

In a disconnected graph, starting from a certain vertex, there is at least one vertex that cannot be reached. Traversing a disconnected graph requires setting multiple starting points to traverse all connected components of the graph.

Q: In an adjacency list, does the order of \"all vertices connected to that vertex\" matter?

It can be in any order. However, in practical applications, it might be necessary to sort according to certain rules, such as the order in which vertices are added, or the order of vertex values, etc., to facilitate the quick search for vertices with certain extremal values.

"},{"location":"chapter_hashing/","title":"Chapter 6. \u00a0 Hash table","text":"

Abstract

In the world of computing, a hash table is akin to an intelligent librarian.

It understands how to compute index numbers, enabling swift retrieval of the desired book.

"},{"location":"chapter_hashing/#chapter-contents","title":"Chapter contents","text":"
  • 6.1 \u00a0 Hash table
  • 6.2 \u00a0 Hash collision
  • 6.3 \u00a0 Hash algorithm
  • 6.4 \u00a0 Summary
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 Hash algorithms","text":"

The previous two sections introduced the working principle of hash tables and the methods to handle hash collisions. However, both open addressing and chaining can only ensure that the hash table functions normally when collisions occur, but cannot reduce the frequency of hash collisions.

If hash collisions occur too frequently, the performance of the hash table will deteriorate drastically. As shown in the Figure 6-8 , for a chaining hash table, in the ideal case, the key-value pairs are evenly distributed across the buckets, achieving optimal query efficiency; in the worst case, all key-value pairs are stored in the same bucket, degrading the time complexity to \\(O(n)\\).

Figure 6-8 \u00a0 Ideal and worst cases of hash collisions

The distribution of key-value pairs is determined by the hash function. Recalling the steps of calculating a hash function, first compute the hash value, then modulo it by the array length:

index = hash(key) % capacity\n

Observing the above formula, when the hash table capacity capacity is fixed, the hash algorithm hash() determines the output value, thereby determining the distribution of key-value pairs in the hash table.

This means that, to reduce the probability of hash collisions, we should focus on the design of the hash algorithm hash().

"},{"location":"chapter_hashing/hash_algorithm/#631-goals-of-hash-algorithms","title":"6.3.1 \u00a0 Goals of hash algorithms","text":"

To achieve a \"fast and stable\" hash table data structure, hash algorithms should have the following characteristics:

  • Determinism: For the same input, the hash algorithm should always produce the same output. Only then can the hash table be reliable.
  • High efficiency: The process of computing the hash value should be fast enough. The smaller the computational overhead, the more practical the hash table.
  • Uniform distribution: The hash algorithm should ensure that key-value pairs are evenly distributed in the hash table. The more uniform the distribution, the lower the probability of hash collisions.

In fact, hash algorithms are not only used to implement hash tables but are also widely applied in other fields.

  • Password storage: To protect the security of user passwords, systems usually do not store the plaintext passwords but rather the hash values of the passwords. When a user enters a password, the system calculates the hash value of the input and compares it with the stored hash value. If they match, the password is considered correct.
  • Data integrity check: The data sender can calculate the hash value of the data and send it along; the receiver can recalculate the hash value of the received data and compare it with the received hash value. If they match, the data is considered intact.

For cryptographic applications, to prevent reverse engineering such as deducing the original password from the hash value, hash algorithms need higher-level security features.

  • Unidirectionality: It should be impossible to deduce any information about the input data from the hash value.
  • Collision resistance: It should be extremely difficult to find two different inputs that produce the same hash value.
  • Avalanche effect: Minor changes in the input should lead to significant and unpredictable changes in the output.

Note that \"Uniform Distribution\" and \"Collision Resistance\" are two separate concepts. Satisfying uniform distribution does not necessarily mean collision resistance. For example, under random input key, the hash function key % 100 can produce a uniformly distributed output. However, this hash algorithm is too simple, and all key with the same last two digits will have the same output, making it easy to deduce a usable key from the hash value, thereby cracking the password.

"},{"location":"chapter_hashing/hash_algorithm/#632-design-of-hash-algorithms","title":"6.3.2 \u00a0 Design of hash algorithms","text":"

The design of hash algorithms is a complex issue that requires consideration of many factors. However, for some less demanding scenarios, we can also design some simple hash algorithms.

  • Additive hash: Add up the ASCII codes of each character in the input and use the total sum as the hash value.
  • Multiplicative hash: Utilize the non-correlation of multiplication, multiplying each round by a constant, accumulating the ASCII codes of each character into the hash value.
  • XOR hash: Accumulate the hash value by XORing each element of the input data.
  • Rotating hash: Accumulate the ASCII code of each character into a hash value, performing a rotation operation on the hash value before each accumulation.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
Code Visualization

Full Screen >

It is observed that the last step of each hash algorithm is to take the modulus of the large prime number \\(1000000007\\) to ensure that the hash value is within an appropriate range. It is worth pondering why emphasis is placed on modulo a prime number, or what are the disadvantages of modulo a composite number? This is an interesting question.

To conclude: Using a large prime number as the modulus can maximize the uniform distribution of hash values. Since a prime number does not share common factors with other numbers, it can reduce the periodic patterns caused by the modulo operation, thus avoiding hash collisions.

For example, suppose we choose the composite number \\(9\\) as the modulus, which can be divided by \\(3\\), then all key divisible by \\(3\\) will be mapped to hash values \\(0\\), \\(3\\), \\(6\\).

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

If the input key happens to have this kind of arithmetic sequence distribution, then the hash values will cluster, thereby exacerbating hash collisions. Now, suppose we replace modulus with the prime number \\(13\\), since there are no common factors between key and modulus, the uniformity of the output hash values will be significantly improved.

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

It is worth noting that if the key is guaranteed to be randomly and uniformly distributed, then choosing a prime number or a composite number as the modulus can both produce uniformly distributed hash values. However, when the distribution of key has some periodicity, modulo a composite number is more likely to result in clustering.

In summary, we usually choose a prime number as the modulus, and this prime number should be large enough to eliminate periodic patterns as much as possible, enhancing the robustness of the hash algorithm.

"},{"location":"chapter_hashing/hash_algorithm/#633-common-hash-algorithms","title":"6.3.3 \u00a0 Common hash algorithms","text":"

It is not hard to see that the simple hash algorithms mentioned above are quite \"fragile\" and far from reaching the design goals of hash algorithms. For example, since addition and XOR obey the commutative law, additive hash and XOR hash cannot distinguish strings with the same content but in different order, which may exacerbate hash collisions and cause security issues.

In practice, we usually use some standard hash algorithms, such as MD5, SHA-1, SHA-2, and SHA-3. They can map input data of any length to a fixed-length hash value.

Over the past century, hash algorithms have been in a continuous process of upgrading and optimization. Some researchers strive to improve the performance of hash algorithms, while others, including hackers, are dedicated to finding security issues in hash algorithms. The Table 6-2 shows hash algorithms commonly used in practical applications.

  • MD5 and SHA-1 have been successfully attacked multiple times and are thus abandoned in various security applications.
  • SHA-2 series, especially SHA-256, is one of the most secure hash algorithms to date, with no successful attacks reported, hence commonly used in various security applications and protocols.
  • SHA-3 has lower implementation costs and higher computational efficiency compared to SHA-2, but its current usage coverage is not as extensive as the SHA-2 series.

Table 6-2 \u00a0 Common hash algorithms

MD5 SHA-1 SHA-2 SHA-3 Release Year 1992 1995 2002 2008 Output Length 128 bit 160 bit 256/512 bit 224/256/384/512 bit Hash Collisions Frequent Frequent Rare Rare Security Level Low, has been successfully attacked Low, has been successfully attacked High High Applications Abandoned, still used for data integrity checks Abandoned Cryptocurrency transaction verification, digital signatures, etc. Can be used to replace SHA-2"},{"location":"chapter_hashing/hash_algorithm/#hash-values-in-data-structures","title":"Hash values in data structures","text":"

We know that the keys in a hash table can be of various data types such as integers, decimals, or strings. Programming languages usually provide built-in hash algorithms for these data types to calculate the bucket indices in the hash table. Taking Python as an example, we can use the hash() function to compute the hash values for various data types.

  • The hash values of integers and booleans are their own values.
  • The calculation of hash values for floating-point numbers and strings is more complex, and interested readers are encouraged to study this on their own.
  • The hash value of a tuple is a combination of the hash values of each of its elements, resulting in a single hash value.
  • The hash value of an object is generated based on its memory address. By overriding the hash method of an object, hash values can be generated based on content.

Tip

Be aware that the definition and methods of the built-in hash value calculation functions in different programming languages vary.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# Hash value of integer 3 is 3\n\nbol = True\nhash_bol = hash(bol)\n# Hash value of boolean True is 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# Hash value of decimal 3.14159 is 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# Hash value of string \"Hello \u7b97\u6cd5\" is 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# Hash value of tuple (12836, '\u5c0f\u54c8') is 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# Hash value of ListNode object at 0x1058fd810 is 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// Hash value of integer 3 is 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// Hash value of boolean 1 is 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// Hash value of decimal 3.14159 is 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// Hash value of string \"Hello \u7b97\u6cd5\" is 15466937326284535026\n\n// In C++, built-in std::hash() only provides hash values for basic data types\n// Hash values for arrays and objects need to be implemented separately\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// Hash value of integer 3 is 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// Hash value of decimal 3.14159 is -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// Hash value of array [12836, \u5c0f\u54c8] is 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// Hash value of ListNode object utils.ListNode@7dc5e7b4 is 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// Hash value of integer 3 is 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// Hash value of boolean true is 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// Hash value of decimal 3.14159 is -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// Hash value of array [12836, \u5c0f\u54c8] is 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// Hash value of ListNode object 0 is 39053774;\n
built_in_hash.go
// Go does not provide built-in hash code functions\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// Hash value of integer 3 is 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// Hash value of boolean true is -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// Hash value of decimal 3.14159 is -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// Hash value of string \"Hello \u7b97\u6cd5\" is -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// Hash value of array [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] is -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// Hash value of ListNode object utils.ListNode is -2434780518035996159\n
built_in_hash.js
// JavaScript does not provide built-in hash code functions\n
built_in_hash.ts
// TypeScript does not provide built-in hash code functions\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// Hash value of integer 3 is 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// Hash value of decimal 3.14159 is 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// Hash value of string \"Hello \u7b97\u6cd5\" is 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// Hash value of array [12836, \u5c0f\u54c8] is 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// Hash value of ListNode object Instance of 'ListNode' is 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// Hash value of integer 3 is 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// Hash value of boolean true is 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// Hash value of decimal 3.14159 is 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// Hash value of string \"Hello \u7b97\u6cd5\" is 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// Hash value of tuple (12836, \"\u5c0f\u54c8\") is 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// Hash value of ListNode object RefCell { value: ListNode { val: 42, next: None } } is 15387811073369036852\n
built_in_hash.c
// C does not provide built-in hash code functions\n
built_in_hash.kt
\n
built_in_hash.zig
\n
Code Visualization

Full Screen >

In many programming languages, only immutable objects can serve as the key in a hash table. If we use a list (dynamic array) as a key, when the contents of the list change, its hash value also changes, and we would no longer be able to find the original value in the hash table.

Although the member variables of a custom object (such as a linked list node) are mutable, it is hashable. This is because the hash value of an object is usually generated based on its memory address, and even if the contents of the object change, the memory address remains the same, so the hash value remains unchanged.

You might have noticed that the hash values output in different consoles are different. This is because the Python interpreter adds a random salt to the string hash function each time it starts up. This approach effectively prevents HashDoS attacks and enhances the security of the hash algorithm.

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 Hash collision","text":"

As mentioned in the previous section, usually the input space of a hash function is much larger than its output space, making hash collisions theoretically inevitable. For example, if the input space consists of all integers and the output space is the size of the array capacity, multiple integers will inevitably map to the same bucket index.

Hash collisions can lead to incorrect query results, severely affecting the usability of hash tables. To solve this problem, we expand the hash table whenever a hash collision occurs, until the collision is resolved. This method is simple and effective but inefficient due to the extensive data transfer and hash value computation involved in resizing the hash table. To improve efficiency, we can adopt the following strategies:

  1. Improve the data structure of the hash table, allowing it to function normally in the event of a hash collision.
  2. Only perform resizing when necessary, i.e., when hash collisions are severe.

There are mainly two methods for improving the structure of hash tables: \"Separate Chaining\" and \"Open Addressing\".

"},{"location":"chapter_hashing/hash_collision/#621-separate-chaining","title":"6.2.1 \u00a0 Separate chaining","text":"

In the original hash table, each bucket can store only one key-value pair. \"Separate chaining\" transforms individual elements into a linked list, with key-value pairs as list nodes, storing all colliding key-value pairs in the same list. The Figure 6-5 shows an example of a hash table with separate chaining.

Figure 6-5 \u00a0 Separate chaining hash table

The operations of a hash table implemented with separate chaining have changed as follows:

  • Querying elements: Input key, pass through the hash function to obtain the bucket index, access the head node of the list, then traverse the list and compare key to find the target key-value pair.
  • Adding elements: First access the list head node via the hash function, then add the node (key-value pair) to the list.
  • Deleting elements: Access the list head based on the hash function's result, then traverse the list to find and remove the target node.

Separate chaining has the following limitations:

  • Increased space usage: The linked list contains node pointers, which consume more memory space than arrays.
  • Reduced query efficiency: Due to the need for linear traversal of the list to find the corresponding element.

The code below provides a simple implementation of a separate chaining hash table, with two things to note:

  • Lists (dynamic arrays) are used instead of linked lists for simplicity. In this setup, the hash table (array) contains multiple buckets, each of which is a list.
  • This implementation includes a method for resizing the hash table. When the load factor exceeds \\(\\frac{2}{3}\\), we resize the hash table to twice its original size.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
Code Visualization

Full Screen >

It's worth noting that when the list is very long, the query efficiency \\(O(n)\\) is poor. At this point, the list can be converted to an \"AVL tree\" or \"Red-Black tree\" to optimize the time complexity of the query operation to \\(O(\\log n)\\).

"},{"location":"chapter_hashing/hash_collision/#622-open-addressing","title":"6.2.2 \u00a0 Open addressing","text":"

\"Open addressing\" does not introduce additional data structures but uses \"multiple probes\" to handle hash collisions. The probing methods mainly include linear probing, quadratic probing, and double hashing.

Let's use linear probing as an example to introduce the mechanism of open addressing hash tables.

"},{"location":"chapter_hashing/hash_collision/#1-linear-probing","title":"1. \u00a0 Linear probing","text":"

Linear probing uses a fixed-step linear search for probing, differing from ordinary hash tables.

  • Inserting elements: Calculate the bucket index using the hash function. If the bucket already contains an element, linearly traverse forward from the conflict position (usually with a step size of \\(1\\)) until an empty bucket is found, then insert the element.
  • Searching for elements: If a hash collision is found, use the same step size to linearly traverse forward until the corresponding element is found and return value; if an empty bucket is encountered, it means the target element is not in the hash table, so return None.

The Figure 6-6 shows the distribution of key-value pairs in an open addressing (linear probing) hash table. According to this hash function, keys with the same last two digits will be mapped to the same bucket. Through linear probing, they are stored consecutively in that bucket and the buckets below it.

Figure 6-6 \u00a0 Distribution of key-value pairs in open addressing (linear probing) hash table

However, linear probing tends to create \"clustering\". Specifically, the longer a continuous position in the array is occupied, the more likely these positions are to encounter hash collisions, further promoting the growth of these clusters and eventually leading to deterioration in the efficiency of operations.

It's important to note that we cannot directly delete elements in an open addressing hash table. Deleting an element creates an empty bucket None in the array. When searching for elements, if linear probing encounters this empty bucket, it will return, making the elements below this bucket inaccessible. The program may incorrectly assume these elements do not exist, as shown in the Figure 6-7 .

Figure 6-7 \u00a0 Query issues caused by deletion in open addressing

To solve this problem, we can use a \"lazy deletion\" mechanism: instead of directly removing elements from the hash table, use a constant TOMBSTONE to mark the bucket. In this mechanism, both None and TOMBSTONE represent empty buckets and can hold key-value pairs. However, when linear probing encounters TOMBSTONE, it should continue traversing since there may still be key-value pairs below it.

However, lazy deletion may accelerate the degradation of hash table performance. Every deletion operation produces a delete mark, and as TOMBSTONE increases, so does the search time, as linear probing may have to skip multiple TOMBSTONE to find the target element.

Therefore, consider recording the index of the first TOMBSTONE encountered during linear probing and swapping the target element found with this TOMBSTONE. The advantage of this is that each time a query or addition is performed, the element is moved to a bucket closer to the ideal position (starting point of probing), thereby optimizing the query efficiency.

The code below implements an open addressing (linear probing) hash table with lazy deletion. To make fuller use of the hash table space, we treat the hash table as a \"circular array,\" continuing to traverse from the beginning when the end of the array is passed.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2-quadratic-probing","title":"2. \u00a0 Quadratic probing","text":"

Quadratic probing is similar to linear probing and is one of the common strategies of open addressing. When a collision occurs, quadratic probing does not simply skip a fixed number of steps but skips \"the square of the number of probes,\" i.e., \\(1, 4, 9, \\dots\\) steps.

Quadratic probing has the following advantages:

  • Quadratic probing attempts to alleviate the clustering effect of linear probing by skipping the distance of the square of the number of probes.
  • Quadratic probing skips larger distances to find empty positions, helping to distribute data more evenly.

However, quadratic probing is not perfect:

  • Clustering still exists, i.e., some positions are more likely to be occupied than others.
  • Due to the growth of squares, quadratic probing may not probe the entire hash table, meaning it might not access empty buckets even if they exist in the hash table.
"},{"location":"chapter_hashing/hash_collision/#3-double-hashing","title":"3. \u00a0 Double hashing","text":"

As the name suggests, the double hashing method uses multiple hash functions \\(f_1(x)\\), \\(f_2(x)\\), \\(f_3(x)\\), \\(\\dots\\) for probing.

  • Inserting elements: If hash function \\(f_1(x)\\) encounters a conflict, try \\(f_2(x)\\), and so on, until an empty position is found and the element is inserted.
  • Searching for elements: Search in the same order of hash functions until the target element is found and returned; if an empty position is encountered or all hash functions have been tried, it indicates the element is not in the hash table, then return None.

Compared to linear probing, double hashing is less prone to clustering but involves additional computation for multiple hash functions.

Tip

Please note that open addressing (linear probing, quadratic probing, and double hashing) hash tables all have the issue of \"not being able to directly delete elements.\"

"},{"location":"chapter_hashing/hash_collision/#623-choice-of-programming-languages","title":"6.2.3 \u00a0 Choice of programming languages","text":"

Various programming languages have adopted different hash table implementation strategies, here are a few examples:

  • Python uses open addressing. The dict dictionary uses pseudo-random numbers for probing.
  • Java uses separate chaining. Since JDK 1.8, when the array length in HashMap reaches 64 and the length of a linked list reaches 8, the linked list is converted to a red-black tree to improve search performance.
  • Go uses separate chaining. Go stipulates that each bucket can store up to 8 key-value pairs, and if the capacity is exceeded, an overflow bucket is connected; when there are too many overflow buckets, a special equal-size expansion operation is performed to ensure performance.
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 Hash table","text":"

A \"hash table\", also known as a \"hash map\", achieves efficient element querying by establishing a mapping between keys and values. Specifically, when we input a key into the hash table, we can retrieve the corresponding value in \\(O(1)\\) time.

As shown in the Figure 6-1 , given \\(n\\) students, each with two pieces of data: \"name\" and \"student number\". If we want to implement a query feature that returns the corresponding name when given a student number, we can use the hash table shown in the Figure 6-1 .

Figure 6-1 \u00a0 Abstract representation of a hash table

Apart from hash tables, arrays and linked lists can also be used to implement querying functions. Their efficiency is compared in the Table 6-1 .

  • Adding elements: Simply add the element to the end of the array (or linked list), using \\(O(1)\\) time.
  • Querying elements: Since the array (or linked list) is unordered, it requires traversing all the elements, using \\(O(n)\\) time.
  • Deleting elements: First, locate the element, then delete it from the array (or linked list), using \\(O(n)\\) time.

Table 6-1 \u00a0 Comparison of element query efficiency

Array Linked List Hash Table Find Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) Add Element \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Delete Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

Observations reveal that the time complexity for adding, deleting, and querying in a hash table is \\(O(1)\\), which is highly efficient.

"},{"location":"chapter_hashing/hash_map/#611-common-operations-of-hash-table","title":"6.1.1 \u00a0 Common operations of hash table","text":"

Common operations of a hash table include initialization, querying, adding key-value pairs, and deleting key-value pairs, etc. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
# Initialize hash table\nhmap: dict = {}\n\n# Add operation\n# Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n# Query operation\n# Input key into hash table, get value\nname: str = hmap[15937]\n\n# Delete operation\n# Delete key-value pair (key, value) from hash table\nhmap.pop(10583)\n
hash_map.cpp
/* Initialize hash table */\nunordered_map<int, string> map;\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.erase(10583);\n
hash_map.java
/* Initialize hash table */\nMap<Integer, String> map = new HashMap<>();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.put(12836, \"Xiao Ha\");   \nmap.put(15937, \"Xiao Luo\");   \nmap.put(16750, \"Xiao Suan\");   \nmap.put(13276, \"Xiao Fa\");\nmap.put(10583, \"Xiao Ya\");\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
hash_map.cs
/* Initialize hash table */\nDictionary<int, string> map = new() {\n    /* Add operation */\n    // Add key-value pair (key, value) to the hash table\n    { 12836, \"Xiao Ha\" },\n    { 15937, \"Xiao Luo\" },\n    { 16750, \"Xiao Suan\" },\n    { 13276, \"Xiao Fa\" },\n    { 10583, \"Xiao Ya\" }\n};\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.Remove(10583);\n
hash_map_test.go
/* Initialize hash table */\nhmap := make(map[int]string)\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nname := hmap[15937]\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\ndelete(hmap, 10583)\n
hash_map.swift
/* Initialize hash table */\nvar map: [Int: String] = [:]\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\"\nmap[15937] = \"Xiao Luo\"\nmap[16750] = \"Xiao Suan\"\nmap[13276] = \"Xiao Fa\"\nmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map[15937]!\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* Initialize hash table */\nconst map = new Map();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\n
hash_map.ts
/* Initialize hash table */\nconst map = new Map<number, string>();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\nconsole.info('\\nAfter adding, the hash table is\\nKey -> Value');\nconsole.info(map);\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\nconsole.info('\\nInput student number 15937, query name ' + name);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\nconsole.info('\\nAfter deleting 10583, the hash table is\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* Initialize hash table */\nMap<int, String> map = {};\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* Initialize hash table */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.insert(12836, \"Xiao Ha\".to_string());\nmap.insert(15937, \"Xiao Luo\".to_string());\nmap.insert(16750, \"Xiao Suan\".to_string());\nmap.insert(13279, \"Xiao Fa\".to_string());\nmap.insert(10583, \"Xiao Ya\".to_string());\n\n/* Query operation */\n// Input key into hash table, get value\nlet _name: Option<&String> = map.get(&15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C does not provide a built-in hash table\n
hash_map.kt
\n
hash_map.zig
\n
Code Visualization

Full Screen >

There are three common ways to traverse a hash table: traversing key-value pairs, keys, and values. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
# Traverse hash table\n# Traverse key-value pairs key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# Traverse keys only\nfor key in hmap.keys():\n    print(key)\n# Traverse values only\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// Traverse using iterator key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (Map.Entry<Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// Traverse keys only\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// Traverse values only\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// Traverse keys only\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// Traverse values only\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* Traverse hash table */\n// Traverse key-value pairs key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// Traverse keys only\nfor key := range hmap {\n    fmt.Println(key)\n}\n// Traverse values only\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// Traverse keys only\nfor key in map.keys {\n    print(key)\n}\n// Traverse values only\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nmap.forEach((key, value) {\nprint('$key -> $value');\n});\n\n// Traverse keys only Key\nmap.keys.forEach((key) {\nprint(key);\n});\n\n// Traverse values only Value\nmap.values.forEach((value) {\nprint(value);\n});\n
hash_map.rs
/* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// Traverse keys only Key\nfor key in map.keys() {\n    println!(\"{key}\"); \n}\n\n// Traverse values only Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C does not provide a built-in hash table\n
hash_map.kt
\n
hash_map.zig
// Zig example is not provided\n
Code Visualization

Full Screen >

"},{"location":"chapter_hashing/hash_map/#612-simple-implementation-of-hash-table","title":"6.1.2 \u00a0 Simple implementation of hash table","text":"

First, let's consider the simplest case: implementing a hash table using just an array. In the hash table, each empty slot in the array is called a \"bucket\", and each bucket can store one key-value pair. Therefore, the query operation involves finding the bucket corresponding to the key and retrieving the value from it.

So, how do we locate the appropriate bucket based on the key? This is achieved through a \"hash function\". The role of the hash function is to map a larger input space to a smaller output space. In a hash table, the input space is all possible keys, and the output space is all buckets (array indices). In other words, input a key, and we can use the hash function to determine the storage location of the corresponding key-value pair in the array.

The calculation process of the hash function for a given key is divided into the following two steps:

  1. Calculate the hash value using a certain hash algorithm hash().
  2. Take the modulus of the hash value with the number of buckets (array length) capacity to obtain the array index index.
index = hash(key) % capacity\n

Afterward, we can use index to access the corresponding bucket in the hash table and thereby retrieve the value.

Assuming array length capacity = 100 and hash algorithm hash(key) = key, the hash function is key % 100. The Figure 6-2 uses key as the student number and value as the name to demonstrate the working principle of the hash function.

Figure 6-2 \u00a0 Working principle of hash function

The following code implements a simple hash table. Here, we encapsulate key and value into a class Pair to represent the key-value pair.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_hashing/hash_map/#613-hash-collision-and-resizing","title":"6.1.3 \u00a0 Hash collision and resizing","text":"

Fundamentally, the role of the hash function is to map the entire input space of all keys to the output space of all array indices. However, the input space is often much larger than the output space. Therefore, theoretically, there must be situations where \"multiple inputs correspond to the same output\".

For the hash function in the above example, if the last two digits of the input key are the same, the output of the hash function will also be the same. For example, when querying for students with student numbers 12836 and 20336, we find:

12836 % 100 = 36\n20336 % 100 = 36\n

As shown in the Figure 6-3 , both student numbers point to the same name, which is obviously incorrect. This situation where multiple inputs correspond to the same output is known as \"hash collision\".

Figure 6-3 \u00a0 Example of hash collision

It is easy to understand that the larger the capacity \\(n\\) of the hash table, the lower the probability of multiple keys being allocated to the same bucket, and the fewer the collisions. Therefore, expanding the capacity of the hash table can reduce hash collisions.

As shown in the Figure 6-4 , before expansion, key-value pairs (136, A) and (236, D) collided; after expansion, the collision is resolved.

Figure 6-4 \u00a0 Hash table expansion

Similar to array expansion, resizing a hash table requires migrating all key-value pairs from the original hash table to the new one, which is time-consuming. Furthermore, since the capacity capacity of the hash table changes, we need to recalculate the storage positions of all key-value pairs using the hash function, which adds to the computational overhead of the resizing process. Therefore, programming languages often reserve a sufficiently large capacity for the hash table to prevent frequent resizing.

The \"load factor\" is an important concept for hash tables. It is defined as the ratio of the number of elements in the hash table to the number of buckets. It is used to measure the severity of hash collisions and is often used as a trigger for resizing the hash table. For example, in Java, when the load factor exceeds \\(0.75\\), the system will resize the hash table to twice its original size.

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 Summary","text":""},{"location":"chapter_hashing/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Given an input key, a hash table can retrieve the corresponding value in \\(O(1)\\) time, which is highly efficient.
  • Common hash table operations include querying, adding key-value pairs, deleting key-value pairs, and traversing the hash table.
  • The hash function maps a key to an array index, allowing access to the corresponding bucket and retrieval of the value.
  • Two different keys may end up with the same array index after hashing, leading to erroneous query results. This phenomenon is known as hash collision.
  • The larger the capacity of the hash table, the lower the probability of hash collisions. Therefore, hash table resizing can mitigate hash collisions. Similar to array resizing, hash table resizing is costly.
  • The load factor, defined as the number of elements divided by the number of buckets, reflects the severity of hash collisions and is often used as a condition to trigger hash table resizing.
  • Chaining addresses hash collisions by converting each element into a linked list, storing all colliding elements in the same list. However, excessively long lists can reduce query efficiency, which can be improved by converting the lists into red-black trees.
  • Open addressing handles hash collisions through multiple probes. Linear probing uses a fixed step size but it cannot delete elements and is prone to clustering. Multiple hashing uses several hash functions for probing which reduces clustering compared to linear probing but increases computational overhead.
  • Different programming languages adopt various hash table implementations. For example, Java's HashMap uses chaining, while Python's dict employs open addressing.
  • In hash tables, we desire hash algorithms with determinism, high efficiency, and uniform distribution. In cryptography, hash algorithms should also possess collision resistance and the avalanche effect.
  • Hash algorithms typically use large prime numbers as moduli to ensure uniform distribution of hash values and reduce hash collisions.
  • Common hash algorithms include MD5, SHA-1, SHA-2, and SHA-3. MD5 is often used for file integrity checks, while SHA-2 is commonly used in secure applications and protocols.
  • Programming languages usually provide built-in hash algorithms for data types to calculate bucket indices in hash tables. Generally, only immutable objects are hashable.
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: When does the time complexity of a hash table degrade to \\(O(n)\\)?

The time complexity of a hash table can degrade to \\(O(n)\\) when hash collisions are severe. When the hash function is well-designed, the capacity is set appropriately, and collisions are evenly distributed, the time complexity is \\(O(1)\\). We usually consider the time complexity to be \\(O(1)\\) when using built-in hash tables in programming languages.

Q: Why not use the hash function \\(f(x) = x\\)? This would eliminate collisions.

Under the hash function \\(f(x) = x\\), each element corresponds to a unique bucket index, which is equivalent to an array. However, the input space is usually much larger than the output space (array length), so the last step of a hash function is often to take the modulo of the array length. In other words, the goal of a hash table is to map a larger state space to a smaller one while providing \\(O(1)\\) query efficiency.

Q: Why can hash tables be more efficient than arrays, linked lists, or binary trees, even though hash tables are implemented using these structures?

Firstly, hash tables have higher time efficiency but lower space efficiency. A significant portion of memory in hash tables remains unused.

Secondly, hash tables are only more time-efficient in specific use cases. If a feature can be implemented with the same time complexity using an array or a linked list, it's usually faster than using a hash table. This is because the computation of the hash function incurs overhead, making the constant factor in the time complexity larger.

Lastly, the time complexity of hash tables can degrade. For example, in chaining, we perform search operations in a linked list or red-black tree, which still risks degrading to \\(O(n)\\) time.

Q: Does multiple hashing also have the flaw of not being able to delete elements directly? Can space marked as deleted be reused?

Multiple hashing is a form of open addressing, and all open addressing methods have the drawback of not being able to delete elements directly; they require marking elements as deleted. Marked spaces can be reused. When inserting new elements into the hash table, and the hash function points to a position marked as deleted, that position can be used by the new element. This maintains the probing sequence of the hash table while ensuring efficient use of space.

Q: Why do hash collisions occur during the search process in linear probing?

During the search process, the hash function points to the corresponding bucket and key-value pair. If the key doesn't match, it indicates a hash collision. Therefore, linear probing will search downwards at a predetermined step size until the correct key-value pair is found or the search fails.

Q: Why can resizing a hash table alleviate hash collisions?

The last step of a hash function often involves taking the modulo of the array length \\(n\\), to keep the output within the array index range. When resizing, the array length \\(n\\) changes, and the indices corresponding to the keys may also change. Keys that were previously mapped to the same bucket might be distributed across multiple buckets after resizing, thereby mitigating hash collisions.

"},{"location":"chapter_heap/","title":"Chapter 8. \u00a0 Heap","text":"

Abstract

The heap is like mountain peaks, stacked and undulating, each with its unique shape.

Among these peaks, the highest one always catches the eye first.

"},{"location":"chapter_heap/#chapter-contents","title":"Chapter contents","text":"
  • 8.1 \u00a0 Heap
  • 8.2 \u00a0 Building a heap
  • 8.3 \u00a0 Top-k problem
  • 8.4 \u00a0 Summary
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 Heap construction operation","text":"

In some cases, we want to build a heap using all elements of a list, and this process is known as \"heap construction operation.\"

"},{"location":"chapter_heap/build_heap/#821-implementing-with-heap-insertion-operation","title":"8.2.1 \u00a0 Implementing with heap insertion operation","text":"

First, we create an empty heap and then iterate through the list, performing the \"heap insertion operation\" on each element in turn. This means adding the element to the end of the heap and then \"heapifying\" it from bottom to top.

Each time an element is added to the heap, the length of the heap increases by one. Since nodes are added to the binary tree from top to bottom, the heap is constructed \"from top to bottom.\"

Let the number of elements be \\(n\\), and each element's insertion operation takes \\(O(\\log{n})\\) time, thus the time complexity of this heap construction method is \\(O(n \\log n)\\).

"},{"location":"chapter_heap/build_heap/#822-implementing-by-heapifying-through-traversal","title":"8.2.2 \u00a0 Implementing by heapifying through traversal","text":"

In fact, we can implement a more efficient method of heap construction in two steps.

  1. Add all elements of the list as they are into the heap, at this point the properties of the heap are not yet satisfied.
  2. Traverse the heap in reverse order (reverse of level-order traversal), and perform \"top to bottom heapify\" on each non-leaf node.

After heapifying a node, the subtree with that node as the root becomes a valid sub-heap. Since the traversal is in reverse order, the heap is built \"from bottom to top.\"

The reason for choosing reverse traversal is that it ensures the subtree below the current node is already a valid sub-heap, making the heapification of the current node effective.

It's worth mentioning that since leaf nodes have no children, they naturally form valid sub-heaps and do not need to be heapified. As shown in the following code, the last non-leaf node is the parent of the last node; we start from it and traverse in reverse order to perform heapification:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/build_heap/#823-complexity-analysis","title":"8.2.3 \u00a0 Complexity analysis","text":"

Next, let's attempt to calculate the time complexity of this second method of heap construction.

  • Assuming the number of nodes in the complete binary tree is \\(n\\), then the number of leaf nodes is \\((n + 1) / 2\\), where \\(/\\) is integer division. Therefore, the number of nodes that need to be heapified is \\((n - 1) / 2\\).
  • In the process of \"top to bottom heapification,\" each node is heapified to the leaf nodes at most, so the maximum number of iterations is the height of the binary tree \\(\\log n\\).

Multiplying the two, we get the time complexity of the heap construction process as \\(O(n \\log n)\\). But this estimate is not accurate, because it does not take into account the nature of the binary tree having far more nodes at the lower levels than at the top.

Let's perform a more accurate calculation. To simplify the calculation, assume a \"perfect binary tree\" with \\(n\\) nodes and height \\(h\\); this assumption does not affect the correctness of the result.

Figure 8-5 \u00a0 Node counts at each level of a perfect binary tree

As shown in the Figure 8-5 , the maximum number of iterations for a node \"to be heapified from top to bottom\" is equal to the distance from that node to the leaf nodes, which is precisely \"node height.\" Therefore, we can sum the \"number of nodes \\(\\times\\) node height\" at each level, to get the total number of heapification iterations for all nodes.

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

To simplify the above equation, we need to use knowledge of sequences from high school, first multiply \\(T(h)\\) by \\(2\\), to get:

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^h\\times1 \\newline \\end{aligned} \\]

By subtracting \\(T(h)\\) from \\(2T(h)\\) using the method of displacement, we get:

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

Observing the equation, \\(T(h)\\) is an geometric series, which can be directly calculated using the sum formula, resulting in a time complexity of:

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

Further, a perfect binary tree with height \\(h\\) has \\(n = 2^{h+1} - 1\\) nodes, thus the complexity is \\(O(2^h) = O(n)\\). This calculation shows that the time complexity of inputting a list and constructing a heap is \\(O(n)\\), which is very efficient.

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 Heap","text":"

A \"heap\" is a complete binary tree that satisfies specific conditions and can be mainly divided into two types, as shown in the Figure 8-1 .

  • \"Min heap\": The value of any node \\(\\leq\\) the values of its child nodes.
  • \"Max heap\": The value of any node \\(\\geq\\) the values of its child nodes.

Figure 8-1 \u00a0 Min heap and max heap

As a special case of a complete binary tree, heaps have the following characteristics:

  • The bottom layer nodes are filled from left to right, and nodes in other layers are fully filled.
  • The root node of the binary tree is called the \"heap top,\" and the bottom-rightmost node is called the \"heap bottom.\"
  • For max heaps (min heaps), the value of the heap top element (root node) is the largest (smallest).
"},{"location":"chapter_heap/heap/#811-common-operations-on-heaps","title":"8.1.1 \u00a0 Common operations on heaps","text":"

It should be noted that many programming languages provide a \"priority queue,\" which is an abstract data structure defined as a queue with priority sorting.

In fact, heaps are often used to implement priority queues, with max heaps equivalent to priority queues where elements are dequeued in descending order. From a usage perspective, we can consider \"priority queue\" and \"heap\" as equivalent data structures. Therefore, this book does not make a special distinction between the two, uniformly referring to them as \"heap.\"

Common operations on heaps are shown in the Table 8-1 , and the method names depend on the programming language.

Table 8-1 \u00a0 Efficiency of Heap Operations

Method name Description Time complexity push() Add an element to the heap \\(O(\\log n)\\) pop() Remove the top element from the heap \\(O(\\log n)\\) peek() Access the top element (for max/min heap, the max/min value) \\(O(1)\\) size() Get the number of elements in the heap \\(O(1)\\) isEmpty() Check if the heap is empty \\(O(1)\\)

In practice, we can directly use the heap class (or priority queue class) provided by programming languages.

Similar to sorting algorithms where we have \"ascending order\" and \"descending order,\" we can switch between \"min heap\" and \"max heap\" by setting a flag or modifying the Comparator. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.kt
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20min_heap,%20flag%20%3D%20%5B%5D,%201%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20max_heap,%20flag%20%3D%20%5B%5D,%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20Python%20%E7%9A%84%20heapq%20%E6%A8%A1%E5%9D%97%E9%BB%98%E8%AE%A4%E5%AE%9E%E7%8E%B0%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E8%80%83%E8%99%91%E5%B0%86%E2%80%9C%E5%85%83%E7%B4%A0%E5%8F%96%E8%B4%9F%E2%80%9D%E5%90%8E%E5%86%8D%E5%85%A5%E5%A0%86%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%A4%A7%E5%B0%8F%E5%85%B3%E7%B3%BB%E9%A2%A0%E5%80%92%EF%BC%8C%E4%BB%8E%E8%80%8C%E5%AE%9E%E7%8E%B0%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E5%9C%A8%E6%9C%AC%E7%A4%BA%E4%BE%8B%E4%B8%AD%EF%BC%8Cflag%20%3D%201%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%B0%8F%E9%A1%B6%E5%A0%86%EF%BC%8Cflag%20%3D%20-1%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E5%A0%86%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%201%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%203%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%202%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%205%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%0A%20%20%20%20peek%20%3D%20flag%20*%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%E5%87%BA%E5%A0%86%0A%20%20%20%20%23%20%E5%87%BA%E5%A0%86%E5%85%83%E7%B4%A0%E4%BC%9A%E5%BD%A2%E6%88%90%E4%B8%80%E4%B8%AA%E4%BB%8E%E5%A4%A7%E5%88%B0%E5%B0%8F%E7%9A%84%E5%BA%8F%E5%88%97%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E5%A4%A7%E5%B0%8F%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%A0%86%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%BE%93%E5%85%A5%E5%88%97%E8%A1%A8%E5%B9%B6%E5%BB%BA%E5%A0%86%0A%20%20%20%20min_heap%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_heap/heap/#812-implementation-of-heaps","title":"8.1.2 \u00a0 Implementation of heaps","text":"

The following implementation is of a max heap. To convert it into a min heap, simply invert all size logic comparisons (for example, replace \\(\\geq\\) with \\(\\leq\\)). Interested readers are encouraged to implement it on their own.

"},{"location":"chapter_heap/heap/#1-storage-and-representation-of-heaps","title":"1. \u00a0 Storage and representation of heaps","text":"

As mentioned in the \"Binary Trees\" section, complete binary trees are well-suited for array representation. Since heaps are a type of complete binary tree, we will use arrays to store heaps.

When using an array to represent a binary tree, elements represent node values, and indexes represent node positions in the binary tree. Node pointers are implemented through an index mapping formula.

As shown in the Figure 8-2 , given an index \\(i\\), the index of its left child is \\(2i + 1\\), the index of its right child is \\(2i + 2\\), and the index of its parent is \\((i - 1) / 2\\) (floor division). When the index is out of bounds, it signifies a null node or the node does not exist.

Figure 8-2 \u00a0 Representation and storage of heaps

We can encapsulate the index mapping formula into functions for convenient later use:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2-accessing-the-top-element-of-the-heap","title":"2. \u00a0 Accessing the top element of the heap","text":"

The top element of the heap is the root node of the binary tree, which is also the first element of the list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#3-inserting-an-element-into-the-heap","title":"3. \u00a0 Inserting an element into the heap","text":"

Given an element val, we first add it to the bottom of the heap. After addition, since val may be larger than other elements in the heap, the heap's integrity might be compromised, thus it's necessary to repair the path from the inserted node to the root node. This operation is called \"heapifying\".

Considering starting from the node inserted, perform heapify from bottom to top. As shown in the Figure 8-3 , we compare the value of the inserted node with its parent node, and if the inserted node is larger, we swap them. Then continue this operation, repairing each node in the heap from bottom to top until passing the root node or encountering a node that does not need to be swapped.

<1><2><3><4><5><6><7><8><9>

Figure 8-3 \u00a0 Steps of element insertion into the heap

Given a total of \\(n\\) nodes, the height of the tree is \\(O(\\log n)\\). Hence, the loop iterations for the heapify operation are at most \\(O(\\log n)\\), making the time complexity of the element insertion operation \\(O(\\log n)\\). The code is as shown:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#4-removing-the-top-element-from-the-heap","title":"4. \u00a0 Removing the top element from the heap","text":"

The top element of the heap is the root node of the binary tree, that is, the first element of the list. If we directly remove the first element from the list, all node indexes in the binary tree would change, making it difficult to use heapify for repairs subsequently. To minimize changes in element indexes, we use the following steps.

  1. Swap the top element with the bottom element of the heap (swap the root node with the rightmost leaf node).
  2. After swapping, remove the bottom of the heap from the list (note, since it has been swapped, what is actually being removed is the original top element).
  3. Starting from the root node, perform heapify from top to bottom.

As shown in the Figure 8-4 , the direction of \"heapify from top to bottom\" is opposite to \"heapify from bottom to top\". We compare the value of the root node with its two children and swap it with the largest child. Then repeat this operation until passing the leaf node or encountering a node that does not need to be swapped.

<1><2><3><4><5><6><7><8><9><10>

Figure 8-4 \u00a0 Steps of removing the top element from the heap

Similar to the element insertion operation, the time complexity of the top element removal operation is also \\(O(\\log n)\\). The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_heap/heap/#813-common-applications-of-heaps","title":"8.1.3 \u00a0 Common applications of heaps","text":"
  • Priority Queue: Heaps are often the preferred data structure for implementing priority queues, with both enqueue and dequeue operations having a time complexity of \\(O(\\log n)\\), and building a queue having a time complexity of \\(O(n)\\), all of which are very efficient.
  • Heap Sort: Given a set of data, we can create a heap from them and then continually perform element removal operations to obtain ordered data. However, we usually use a more elegant method to implement heap sort, as detailed in the \"Heap Sort\" section.
  • Finding the Largest \\(k\\) Elements: This is a classic algorithm problem and also a typical application, such as selecting the top 10 hot news for Weibo hot search, picking the top 10 selling products, etc.
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 Summary","text":""},{"location":"chapter_heap/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A heap is a complete binary tree, which can be divided into a max heap and a min heap based on its property. The top element of a max (min) heap is the largest (smallest).
  • A priority queue is defined as a queue with dequeue priority, usually implemented using a heap.
  • Common operations of a heap and their corresponding time complexities include: element insertion into the heap \\(O(\\log n)\\), removing the top element from the heap \\(O(\\log n)\\), and accessing the top element of the heap \\(O(1)\\).
  • A complete binary tree is well-suited to be represented by an array, thus heaps are commonly stored using arrays.
  • Heapify operations are used to maintain the properties of the heap and are used in both heap insertion and removal operations.
  • The time complexity of inserting \\(n\\) elements into a heap and building the heap can be optimized to \\(O(n)\\), which is highly efficient.
  • Top-k is a classic algorithm problem that can be efficiently solved using the heap data structure, with a time complexity of \\(O(n \\log k)\\).
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the \"heap\" in data structures the same concept as the \"heap\" in memory management?

The two are not the same concept, even though they are both referred to as \"heap\". The heap in computer system memory is part of dynamic memory allocation, where the program can use it to store data during execution. The program can request a certain amount of heap memory to store complex structures like objects and arrays. When these data are no longer needed, the program needs to release this memory to prevent memory leaks. Compared to stack memory, the management and usage of heap memory need to be more cautious, as improper use may lead to memory leaks and dangling pointers.

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k problem","text":"

Question

Given an unordered array nums of length \\(n\\), return the largest \\(k\\) elements in the array.

For this problem, we will first introduce two straightforward solutions, then explain a more efficient heap-based method.

"},{"location":"chapter_heap/top_k/#831-method-1-iterative-selection","title":"8.3.1 \u00a0 Method 1: Iterative selection","text":"

We can perform \\(k\\) rounds of iterations as shown in the Figure 8-6 , extracting the \\(1^{st}\\), \\(2^{nd}\\), \\(\\dots\\), \\(k^{th}\\) largest elements in each round, with a time complexity of \\(O(nk)\\).

This method is only suitable when \\(k \\ll n\\), as the time complexity approaches \\(O(n^2)\\) when \\(k\\) is close to \\(n\\), which is very time-consuming.

Figure 8-6 \u00a0 Iteratively finding the largest k elements

Tip

When \\(k = n\\), we can obtain a complete ordered sequence, which is equivalent to the \"selection sort\" algorithm.

"},{"location":"chapter_heap/top_k/#832-method-2-sorting","title":"8.3.2 \u00a0 Method 2: Sorting","text":"

As shown in the Figure 8-7 , we can first sort the array nums and then return the last \\(k\\) elements, with a time complexity of \\(O(n \\log n)\\).

Clearly, this method \"overachieves\" the task, as we only need to find the largest \\(k\\) elements, without the need to sort the other elements.

Figure 8-7 \u00a0 Sorting to find the largest k elements

"},{"location":"chapter_heap/top_k/#833-method-3-heap","title":"8.3.3 \u00a0 Method 3: Heap","text":"

We can solve the Top-k problem more efficiently based on heaps, as shown in the following process.

  1. Initialize a min heap, where the top element is the smallest.
  2. First, insert the first \\(k\\) elements of the array into the heap.
  3. Starting from the \\(k + 1^{th}\\) element, if the current element is greater than the top element of the heap, remove the top element of the heap and insert the current element into the heap.
  4. After completing the traversal, the heap contains the largest \\(k\\) elements.
<1><2><3><4><5><6><7><8><9>

Figure 8-8 \u00a0 Find the largest k elements based on heap

Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
Code Visualization

Full Screen >

A total of \\(n\\) rounds of heap insertions and deletions are performed, with the maximum heap size being \\(k\\), hence the time complexity is \\(O(n \\log k)\\). This method is very efficient; when \\(k\\) is small, the time complexity tends towards \\(O(n)\\); when \\(k\\) is large, the time complexity will not exceed \\(O(n \\log n)\\).

Additionally, this method is suitable for scenarios with dynamic data streams. By continuously adding data, we can maintain the elements within the heap, thereby achieving dynamic updates of the largest \\(k\\) elements.

"},{"location":"chapter_hello_algo/","title":"Before starting","text":"

A few years ago, I shared the \"Sword for Offer\" problem solutions on LeetCode, receiving encouragement and support from many readers. During interactions with readers, the most common question I encountered was \"how to get started with algorithms.\" Gradually, I developed a keen interest in this question.

Directly solving problems seems to be the most popular method \u2014 it's simple, direct, and effective. However, problem-solving is like playing a game of Minesweeper: those with strong self-study abilities can defuse the mines one by one, but those with insufficient basics might end up metaphorically bruised from explosions, retreating step by step in frustration. Going through textbooks is also common, but for those aiming for job applications, the energy spent on thesis writing, resume submissions, and preparation for written tests and interviews leaves little for tackling thick books, turning it into a daunting challenge.

If you're facing similar troubles, then this book are lucky to have found you. This book is my answer to the question. While it may not be the best solution, it is at least a positive attempt. This book may not directly land you an offer, but it will guide you through the \"knowledge map\" in data structures and algorithms, help you understand the shapes, sizes, and locations of different \"mines,\" and enable you to master various \"demining methods.\" With these skills, I believe you can solve problems and read literature more comfortably, gradually building a knowledge system.

I deeply agree with Professor Feynman's statement: \"Knowledge isn't free. You have to pay attention.\" In this sense, this book is not entirely \"free.\" To not disappoint the precious \"attention\" you pay for this book, I will do my best, dedicating my utmost \"attention\" to this book.

Knowing my limitations, although the content of this book has been refined over time, there are surely many errors remaining. I sincerely request critiques and corrections from all teachers and students.

Hello, Algo!

The advent of computers has brought significant changes to the world. With their high-speed computing power and excellent programmability, they have become the ideal medium for executing algorithms and processing data. Whether it's the realistic graphics of video games, the intelligent decisions in autonomous driving, the brilliant Go games of AlphaGo, or the natural interactions of ChatGPT, these applications are all exquisite demonstrations of algorithms at work on computers.

In fact, before the advent of computers, algorithms and data structures already existed in every corner of the world. Early algorithms were relatively simple, such as ancient counting methods and tool-making procedures. As civilization progressed, algorithms became more refined and complex. From the exquisite craftsmanship of artisans, to industrial products that liberate productive forces, to the scientific laws governing the universe, almost every ordinary or astonishing thing has behind it the ingenious thought of algorithms.

Similarly, data structures are everywhere: from social networks to subway lines, many systems can be modeled as \"graphs\"; from a country to a family, the main forms of social organization exhibit characteristics of \"trees\"; winter clothes are like a \"stack\", where the first item worn is the last to be taken off; a badminton shuttle tube resembles a \"queue\", with one end for insertion and the other for retrieval; a dictionary is like a \"hash table\", enabling quick search for target entries.

This book aims to help readers understand the core concepts of algorithms and data structures through clear, easy-to-understand animated illustrations and runnable code examples, and to be able to implement them through programming. On this basis, this book strives to reveal the vivid manifestations of algorithms in the complex world, showcasing the beauty of algorithms. I hope this book can help you!

"},{"location":"chapter_introduction/","title":"Chapter 1. \u00a0 Encounter with algorithms","text":"

Abstract

A graceful maiden dances, intertwined with the data, her skirt swaying to the melody of algorithms.

She invites you to a dance, follow her steps, and enter the world of algorithms full of logic and beauty.

"},{"location":"chapter_introduction/#chapter-contents","title":"Chapter contents","text":"
  • 1.1 \u00a0 Algorithms are everywhere
  • 1.2 \u00a0 What is an algorithm
  • 1.3 \u00a0 Summary
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 Algorithms are everywhere","text":"

When we hear the word \"algorithm,\" we naturally think of mathematics. However, many algorithms do not involve complex mathematics but rely more on basic logic, which can be seen everywhere in our daily lives.

Before formally discussing algorithms, there's an interesting fact worth sharing: you have already unconsciously learned many algorithms and have become accustomed to applying them in your daily life. Here, I will give a few specific examples to prove this point.

Example 1: Looking Up a Dictionary. In an English dictionary, words are listed alphabetically. Suppose we're searching for a word that starts with the letter \\(r\\). This is typically done in the following way:

  1. Open the dictionary to about halfway and check the first letter on the page, let's say the letter is \\(m\\).
  2. Since \\(r\\) comes after \\(m\\) in the alphabet, we can ignore the first half of the dictionary and focus on the latter half.
  3. Repeat steps 1. and 2. until you find the page where the word starts with \\(r\\).
<1><2><3><4><5>

Figure 1-1 \u00a0 Process of Looking Up a Dictionary

This essential skill for elementary students, looking up a dictionary, is actually the famous \"Binary Search\" algorithm. From a data structure perspective, we can consider the dictionary as a sorted \"array\"; from an algorithmic perspective, the series of actions taken to look up a word in the dictionary can be viewed as \"Binary Search.\"

Example 2: Organizing Playing Cards. When playing cards, we need to arrange the cards in our hand in ascending order, as shown in the following process.

  1. Divide the playing cards into \"ordered\" and \"unordered\" sections, assuming initially the leftmost card is already in order.
  2. Take out a card from the unordered section and insert it into the correct position in the ordered section; after this, the leftmost two cards are in order.
  3. Continue to repeat step 2. until all cards are in order.

Figure 1-2 \u00a0 Playing cards sorting process

The above method of organizing playing cards is essentially the \"Insertion Sort\" algorithm, which is very efficient for small datasets. Many programming languages' sorting functions include the insertion sort.

Example 3: Making Change. Suppose we buy goods worth \\(69\\) yuan at a supermarket and give the cashier \\(100\\) yuan, then the cashier needs to give us \\(31\\) yuan in change. They would naturally complete the thought process as shown below.

  1. The options are currencies smaller than \\(31\\), including \\(1\\), \\(5\\), \\(10\\), and \\(20\\).
  2. Take out the largest \\(20\\) from the options, leaving \\(31 - 20 = 11\\).
  3. Take out the largest \\(10\\) from the remaining options, leaving \\(11 - 10 = 1\\).
  4. Take out the largest \\(1\\) from the remaining options, leaving \\(1 - 1 = 0\\).
  5. Complete the change-making, with the solution being \\(20 + 10 + 1 = 31\\).

Figure 1-3 \u00a0 Change making process

In the above steps, we make the best choice at each step (using the largest denomination possible), ultimately resulting in a feasible change-making plan. From the perspective of data structures and algorithms, this method is essentially a \"Greedy\" algorithm.

From cooking a meal to interstellar travel, almost all problem-solving involves algorithms. The advent of computers allows us to store data structures in memory and write code to call the CPU and GPU to execute algorithms. In this way, we can transfer real-life problems to computers, solving various complex issues more efficiently.

Tip

If concepts such as data structures, algorithms, arrays, and binary search still seem somewhat obsecure, I encourage you to continue reading. This book will gently guide you into the realm of understanding data structures and algorithms.

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 Summary","text":"
  • Algorithms are ubiquitous in daily life and are not as inaccessible and complex as they might seem. In fact, we have already unconsciously learned many algorithms to solve various problems in life.
  • The principle of looking up a word in a dictionary is consistent with the binary search algorithm. The binary search algorithm embodies the important algorithmic concept of divide and conquer.
  • The process of organizing playing cards is very similar to the insertion sort algorithm. The insertion sort algorithm is suitable for sorting small datasets.
  • The steps of making change in currency essentially follow the greedy algorithm, where each step involves making the best possible choice at the moment.
  • An algorithm is a set of instructions or steps used to solve a specific problem within a finite amount of time, while a data structure is the way data is organized and stored in a computer.
  • Data structures and algorithms are closely linked. Data structures are the foundation of algorithms, and algorithms are the stage to utilize the functions of data structures.
  • We can liken data structures and algorithms to building blocks. The blocks represent data, the shape and connection method of the blocks represent data structures, and the steps of assembling the blocks correspond to algorithms.
"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 What is an algorithm","text":""},{"location":"chapter_introduction/what_is_dsa/#121-definition-of-an-algorithm","title":"1.2.1 \u00a0 Definition of an algorithm","text":"

An \"algorithm\" is a set of instructions or steps to solve a specific problem within a finite amount of time. It has the following characteristics:

  • The problem is clearly defined, including unambiguous definitions of input and output.
  • The algorithm is feasible, meaning it can be completed within a finite number of steps, time, and memory space.
  • Each step has a definitive meaning. The output is consistently the same under the same inputs and conditions.
"},{"location":"chapter_introduction/what_is_dsa/#122-definition-of-a-data-structure","title":"1.2.2 \u00a0 Definition of a data structure","text":"

A \"data structure\" is a way of organizing and storing data in a computer, with the following design goals:

  • Minimize space occupancy to save computer memory.
  • Make data operations as fast as possible, covering data access, addition, deletion, updating, etc.
  • Provide concise data representation and logical information to enable efficient algorithm execution.

Designing data structures is a balancing act, often requiring trade-offs. If you want to improve in one aspect, you often need to compromise in another. Here are two examples:

  • Compared to arrays, linked lists offer more convenience in data addition and deletion but sacrifice data access speed.
  • Graphs, compared to linked lists, provide richer logical information but require more memory space.
"},{"location":"chapter_introduction/what_is_dsa/#123-relationship-between-data-structures-and-algorithms","title":"1.2.3 \u00a0 Relationship between data structures and algorithms","text":"

As shown in the Figure 1-4 , data structures and algorithms are highly related and closely integrated, specifically in the following three aspects:

  • Data structures are the foundation of algorithms. They provide structured data storage and methods for manipulating data for algorithms.
  • Algorithms are the stage where data structures come into play. The data structure alone only stores data information; it is through the application of algorithms that specific problems can be solved.
  • Algorithms can often be implemented based on different data structures, but their execution efficiency can vary greatly. Choosing the right data structure is key.

Figure 1-4 \u00a0 Relationship between data structures and algorithms

Data structures and algorithms can be likened to a set of building blocks, as illustrated in the Figure 1-5 . A building block set includes numerous pieces, accompanied by detailed assembly instructions. Following these instructions step by step allows us to construct an intricate block model.

Figure 1-5 \u00a0 Assembling blocks

The detailed correspondence between the two is shown in the Table 1-1 .

Table 1-1 \u00a0 Comparing data structures and algorithms to building blocks

Data Structures and Algorithms Building Blocks Input data Unassembled blocks Data structure Organization of blocks, including shape, size, connections, etc Algorithm A series of steps to assemble the blocks into the desired shape Output data Completed Block model

It's worth noting that data structures and algorithms are independent of programming languages. For this reason, this book is able to provide implementations in multiple programming languages.

Conventional Abbreviation

In real-life discussions, we often refer to \"Data Structures and Algorithms\" simply as \"Algorithms\". For example, the well-known LeetCode algorithm problems actually test both data structure and algorithm knowledge.

"},{"location":"chapter_preface/","title":"Chapter 0. \u00a0 Preface","text":"

Abstract

Algorithms are like a beautiful symphony, with each line of code flowing like a rhythm.

May this book ring softly in your mind, leaving a unique and profound melody.

"},{"location":"chapter_preface/#chapter-contents","title":"Chapter contents","text":"
  • 0.1 \u00a0 About this book
  • 0.2 \u00a0 How to read
  • 0.3 \u00a0 Summary
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 About this book","text":"

This open-source project aims to create a free, and beginner-friendly crash course on data structures and algorithms.

  • Using animated illustrations, it delivers structured insights into data structures and algorithmic concepts, ensuring comprehensibility and a smooth learning curve.
  • Run code with just one click, supporting Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig and other languages.
  • Readers are encouraged to engage with each other in the discussion area for each section, questions and comments are usually answered within two days.
"},{"location":"chapter_preface/about_the_book/#011-target-audience","title":"0.1.1 \u00a0 Target audience","text":"

If you are new to algorithms with limited exposure, or you have accumulated some experience in algorithms, but you only have a vague understanding of data structures and algorithms, and you are constantly jumping between \"yep\" and \"hmm\", then this book is for you!

If you have already accumulated a certain amount of problem-solving experience, and are familiar with most types of problems, then this book can help you review and organize your algorithm knowledge system. The repository's source code can be used as a \"problem-solving toolkit\" or an \"algorithm cheat sheet\".

If you are an algorithm expert, we look forward to receiving your valuable suggestions, or join us and collaborate.

Prerequisites

You should know how to write and read simple code in at least one programming language.

"},{"location":"chapter_preface/about_the_book/#012-content-structure","title":"0.1.2 \u00a0 Content structure","text":"

The main content of the book is shown in the following figure.

  • Complexity analysis: explores aspects and methods for evaluating data structures and algorithms. Covers methods of deriving time complexity and space complexity, along with common types and examples.
  • Data structures: focuses on fundamental data types, classification methods, definitions, pros and cons, common operations, types, applications, and implementation methods of data structures such as array, linked list, stack, queue, hash table, tree, heap, graph, etc.
  • Algorithms: defines algorithms, discusses their pros and cons, efficiency, application scenarios, problem-solving steps, and includes sample questions for various algorithms such as search, sorting, divide and conquer, backtracking, dynamic programming, greedy algorithms, and more.

Figure 0-1 \u00a0 Main content of the book

"},{"location":"chapter_preface/about_the_book/#013-acknowledgements","title":"0.1.3 \u00a0 Acknowledgements","text":"

This book is continuously improved with the joint efforts of many contributors from the open-source community. Thanks to each writer who invested their time and energy, listed in the order generated by GitHub: krahets, codingonion, nuomi1, Gonglja, Reanon, justin-tse, danielsss, hpstory, S-N-O-R-L-A-X, night-cruise, msk397, gvenusleo, RiverTwilight, gyt95, zhuoqinyue, Zuoxun, Xia-Sang, mingXta, FangYuan33, GN-Yu, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, mgisr, JoseHung, qualifier1024, pengchzn, Guanngxu, longsizhuo, L-Super, what-is-me, yuan0221, lhxsm, Slone123c, WSL0809, longranger2, theNefelibatas, xiongsp, JeffersonHuang, hongyun-robot, K3v123, yuelinxin, a16su, gaofer, malone6, Wonderdch, xjr7670, DullSword, Horbin-Magician, NI-SW, reeswell, XC-Zero, XiaChuerwu, yd-j, iron-irax, huawuque404, MolDuM, Nigh, KorsChen, foursevenlove, 52coder, bubble9um, youshaoXG, curly210102, gltianwen, fanchenggang, Transmigration-zhou, FloranceYeh, FreddieLi, ShiMaRing, lipusheng, Javesun99, JackYang-hellobobo, shanghai-Jerry, 0130w, Keynman, psychelzh, logan-qiu, ZnYang2018, MwumLi, 1ch0, Phoenix0415, qingpeng9802, Richard-Zhang1019, QiLOL, Suremotoo, Turing-1024-Lee, Evilrabbit520, GaochaoZhu, ZJKung, linzeyan, hezhizhen, ZongYangL, beintentional, czruby, coderlef, dshlstarr, szu17dmy, fbigm, gledfish, hts0000, boloboloda, iStig, jiaxianhua, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, liuxjerry, lucaswangdev, lyl625760, chadyi, noobcodemaker, selear, siqyka, syd168, 4yDX3906, tao363, wangwang105, weibk, yabo083, yi427, yishangzhang, zhouLion, baagod, ElaBosak233, xb534, luluxia, yanedie, thomasq0, YangXuanyi and th1nk3r-ing.

The code review work for this book was completed by codingonion, Gonglja, gvenusleo, hpstory, justin\u2010tse, krahets, night-cruise, nuomi1, and Reanon (listed in alphabetical order). Thanks to them for their time and effort, ensuring the standardization and uniformity of the code in various languages.

Throughout the creation of this book, numerous individuals provided invaluable assistance, including but not limited to:

  • Thanks to my mentor at the company, Dr. Xi Li, who encouraged me in a conversation to \"get moving fast,\" which solidified my determination to write this book;
  • Thanks to my girlfriend Bubble, as the first reader of this book, for offering many valuable suggestions from the perspective of a beginner in algorithms, making this book more suitable for newbies;
  • Thanks to Tengbao, Qibao, and Feibao for coming up with a creative name for this book, evoking everyone's fond memories of writing their first line of code \"Hello World!\";
  • Thanks to Xiaoquan for providing professional help in intellectual property, which has played a significant role in the development of this open-source book;
  • Thanks to Sutong for designing a beautiful cover and logo for this book, and for patiently making multiple revisions under my insistence;
  • Thanks to @squidfunk for providing writing and typesetting suggestions, as well as his developed open-source documentation theme Material-for-MkDocs.

Throughout the writing journey, I delved into numerous textbooks and articles on data structures and algorithms. These works served as exemplary models, ensuring the accuracy and quality of this book's content. I extend my gratitude to all who preceded me for their invaluable contributions!

This book advocates a combination of hands-on and minds-on learning, inspired in this regard by \"Dive into Deep Learning\". I highly recommend this excellent book to all readers.

Heartfelt thanks to my parents, whose ongoing support and encouragement have allowed me to do this interesting work.

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 How to read","text":"

Tip

For the best reading experience, it is recommended that you read through this section.

"},{"location":"chapter_preface/suggestions/#021-writing-conventions","title":"0.2.1 \u00a0 Writing conventions","text":"
  • Chapters marked with '*' after the title are optional and contain relatively challenging content. If you are short on time, it is advisable to skip them.
  • Technical terms will be in boldface (in the print and PDF versions) or underlined (in the web version), for instance, array. It's advisable to familiarize yourself with these for better comprehension of technical texts.
  • Bolded text indicates key content or summary statements, which deserve special attention.
  • Words and phrases with specific meanings are indicated with \u201cquotation marks\u201d to avoid ambiguity.
  • When it comes to terms that are inconsistent between programming languages, this book follows Python, for example using None to mean null.
  • This book partially ignores the comment conventions for programming languages in exchange for a more compact layout of the content. The comments primarily consist of three types: title comments, content comments, and multi-line comments.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
\"\"\"Header comments for labeling functions, classes, test samples, etc\"\"\"\n\n# Comments for explaining details\n\n\"\"\"\nMultiline\ncomments\n\"\"\"\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
/* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
// Header comments for labeling functions, classes, test samples, etc\n\n// Comments for explaining details.\n\n// Multiline\n// comments\n
"},{"location":"chapter_preface/suggestions/#022-efficient-learning-via-animated-illustrations","title":"0.2.2 \u00a0 Efficient learning via animated illustrations","text":"

Compared with text, videos and pictures have a higher density of information and are more structured, making them easier to understand. In this book, key and difficult concepts are mainly presented through animations and illustrations, with text serving as explanations and supplements.

When encountering content with animations or illustrations as shown in the Figure 0-2 , prioritize understanding the figure, with text as supplementary, integrating both for a comprehensive understanding.

Figure 0-2 \u00a0 Animated illustration example

"},{"location":"chapter_preface/suggestions/#023-deepen-understanding-through-coding-practice","title":"0.2.3 \u00a0 Deepen understanding through coding practice","text":"

The source code of this book is hosted on the GitHub Repository. As shown in the Figure 0-3 , the source code comes with test examples and can be executed with just a single click.

If time permits, it's recommended to type out the code yourself. If pressed for time, at least read and run all the codes.

Compared to just reading code, writing code often yields more learning. Learning by doing is the real way to learn.

Figure 0-3 \u00a0 Running code example

Setting up to run the code involves three main steps.

Step 1: Install a local programming environment. Follow the tutorial in the appendix for installation, or skip this step if already installed.

Step 2: Clone or download the code repository. Visit the GitHub Repository.

If Git is installed, use the following command to clone the repository:

git clone https://github.com/krahets/hello-algo.git\n

Alternatively, you can also click the \"Download ZIP\" button at the location shown in the Figure 0-4 to directly download the code as a compressed ZIP file. Then, you can simply extract it locally.

Figure 0-4 \u00a0 Cloning repository and downloading code

Step 3: Run the source code. As shown in the Figure 0-5 , for the code block labeled with the file name at the top, we can find the corresponding source code file in the codes folder of the repository. These files can be executed with a single click, which will help you save unnecessary debugging time and allow you to focus on learning.

Figure 0-5 \u00a0 Code block and corresponding source code file

"},{"location":"chapter_preface/suggestions/#024-learning-together-in-discussion","title":"0.2.4 \u00a0 Learning together in discussion","text":"

While reading this book, please don't skip over the points that you didn't learn. Feel free to post your questions in the comment section. We will be happy to answer them and can usually respond within two days.

As illustrated in the Figure 0-6 , each chapter features a comment section at the bottom. I encourage you to pay attention to these comments. They not only expose you to others' encountered problems, aiding in identifying knowledge gaps and sparking deeper contemplation, but also invite you to generously contribute by answering fellow readers' inquiries, sharing insights, and fostering mutual improvement.

Figure 0-6 \u00a0 Comment section example

"},{"location":"chapter_preface/suggestions/#025-algorithm-learning-path","title":"0.2.5 \u00a0 Algorithm learning path","text":"

Overall, the journey of mastering data structures and algorithms can be divided into three stages:

  1. Stage 1: Introduction to algorithms. We need to familiarize ourselves with the characteristics and usage of various data structures and learn about the principles, processes, uses, and efficiency of different algorithms.
  2. Stage 2: Practicing algorithm problems. It is recommended to start from popular problems, such as Sword for Offer and LeetCode Hot 100, and accumulate at least 100 questions to familiarize yourself with mainstream algorithmic problems. Forgetfulness can be a challenge when you start practicing, but rest assured that this is normal. We can follow the \"Ebbinghaus Forgetting Curve\" to review the questions, and usually after 3~5 rounds of repetitions, we will be able to memorize them.
  3. Stage 3: Building the knowledge system. In terms of learning, we can read algorithm column articles, solution frameworks, and algorithm textbooks to continuously enrich the knowledge system. In terms of practicing, we can try advanced strategies, such as categorizing by topic, multiple solutions for a single problem, and one solution for multiple problems, etc. Insights on these strategies can be found in various communities.

As shown in the Figure 0-7 , this book mainly covers \u201cStage 1,\u201d aiming to help you more efficiently embark on Stages 2 and 3.

Figure 0-7 \u00a0 Algorithm learning path

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 Summary","text":"
  • The main audience of this book is beginners in algorithm. If you already have some basic knowledge, this book can help you systematically review your algorithm knowledge, and the source code in this book can also be used as a \"Coding Toolkit\".
  • The book consists of three main sections, Complexity Analysis, Data Structures, and Algorithms, covering most of the topics in the field.
  • For newcomers to algorithms, it is crucial to read an introductory book in the beginning stages to avoid many detours or common pitfalls.
  • Animations and figures within the book are usually used to introduce key points and difficult knowledge. These should be given more attention when reading the book.
  • Practice is the best way to learn programming. It is highly recommended that you run the source code and type in the code yourself.
  • Each chapter in the web version of this book features a discussion section, and you are welcome to share your questions and insights at any time.
"},{"location":"chapter_stack_and_queue/","title":"Chapter 5. \u00a0 Stack and queue","text":"

Abstract

A stack is like cats placed on top of each other, while a queue is like cats lined up one by one.

They represent the logical relationships of Last-In-First-Out (LIFO) and First-In-First-Out (FIFO), respectively.

"},{"location":"chapter_stack_and_queue/#chapter-contents","title":"Chapter contents","text":"
  • 5.1 \u00a0 Stack
  • 5.2 \u00a0 Queue
  • 5.3 \u00a0 Double-ended queue
  • 5.4 \u00a0 Summary
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 Double-ended queue","text":"

In a queue, we can only delete elements from the head or add elements to the tail. As shown in the following diagram, a \"double-ended queue (deque)\" offers more flexibility, allowing the addition or removal of elements at both the head and the tail.

Figure 5-7 \u00a0 Operations in double-ended queue

"},{"location":"chapter_stack_and_queue/deque/#531-common-operations-in-double-ended-queue","title":"5.3.1 \u00a0 Common operations in double-ended queue","text":"

The common operations in a double-ended queue are listed below, and the names of specific methods depend on the programming language used.

Table 5-3 \u00a0 Efficiency of double-ended queue operations

Method Name Description Time Complexity pushFirst() Add an element to the head \\(O(1)\\) pushLast() Add an element to the tail \\(O(1)\\) popFirst() Remove the first element \\(O(1)\\) popLast() Remove the last element \\(O(1)\\) peekFirst() Access the first element \\(O(1)\\) peekLast() Access the last element \\(O(1)\\)

Similarly, we can directly use the double-ended queue classes implemented in programming languages:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig deque.py
from collections import deque\n\n# Initialize the deque\ndeq: deque[int] = deque()\n\n# Enqueue elements\ndeq.append(2)      # Add to the tail\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # Add to the head\ndeq.appendleft(1)\n\n# Access elements\nfront: int = deq[0]  # The first element\nrear: int = deq[-1]  # The last element\n\n# Dequeue elements\npop_front: int = deq.popleft()  # The first element dequeued\npop_rear: int = deq.pop()       # The last element dequeued\n\n# Get the length of the deque\nsize: int = len(deq)\n\n# Check if the deque is empty\nis_empty: bool = len(deq) == 0\n
deque.cpp
/* Initialize the deque */\ndeque<int> deque;\n\n/* Enqueue elements */\ndeque.push_back(2);   // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nint front = deque.front(); // The first element\nint back = deque.back();   // The last element\n\n/* Dequeue elements */\ndeque.pop_front();  // The first element dequeued\ndeque.pop_back();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nbool empty = deque.empty();\n
deque.java
/* Initialize the deque */\nDeque<Integer> deque = new LinkedList<>();\n\n/* Enqueue elements */\ndeque.offerLast(2);   // Add to the tail\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // Add to the head\ndeque.offerFirst(1);\n\n/* Access elements */\nint peekFirst = deque.peekFirst();  // The first element\nint peekLast = deque.peekLast();    // The last element\n\n/* Dequeue elements */\nint popFirst = deque.pollFirst();  // The first element dequeued\nint popLast = deque.pollLast();    // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* Initialize the deque */\n// In C#, LinkedList is used as a deque\nLinkedList<int> deque = new();\n\n/* Enqueue elements */\ndeque.AddLast(2);   // Add to the tail\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // Add to the head\ndeque.AddFirst(1);\n\n/* Access elements */\nint peekFirst = deque.First.Value;  // The first element\nint peekLast = deque.Last.Value;    // The last element\n\n/* Dequeue elements */\ndeque.RemoveFirst();  // The first element dequeued\ndeque.RemoveLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.Count;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* Initialize the deque */\n// In Go, use list as a deque\ndeque := list.New()\n\n/* Enqueue elements */\ndeque.PushBack(2)      // Add to the tail\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // Add to the head\ndeque.PushFront(1)\n\n/* Access elements */\nfront := deque.Front() // The first element\nrear := deque.Back()   // The last element\n\n/* Dequeue elements */\ndeque.Remove(front)    // The first element dequeued\ndeque.Remove(rear)     // The last element dequeued\n\n/* Get the length of the deque */\nsize := deque.Len()\n\n/* Check if the deque is empty */\nisEmpty := deque.Len() == 0\n
deque.swift
/* Initialize the deque */\n// Swift does not have a built-in deque class, so Array can be used as a deque\nvar deque: [Int] = []\n\n/* Enqueue elements */\ndeque.append(2) // Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // Add to the head\ndeque.insert(1, at: 0)\n\n/* Access elements */\nlet peekFirst = deque.first! // The first element\nlet peekLast = deque.last!   // The last element\n\n/* Dequeue elements */\n// Using Array, popFirst has a complexity of O(n)\nlet popFirst = deque.removeFirst() // The first element dequeued\nlet popLast = deque.removeLast()   // The last element dequeued\n\n/* Get the length of the deque */\nlet size = deque.count\n\n/* Check if the deque is empty */\nlet isEmpty = deque.isEmpty\n
deque.js
/* Initialize the deque */\n// JavaScript does not have a built-in deque, so Array is used as a deque\nconst deque = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst = deque[0]; // The first element\nconst peekLast = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront = deque.shift(); // The first element dequeued\nconst popBack = deque.pop();    // The last element dequeued\n\n/* Get the length of the deque */\nconst size = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty = size === 0;\n
deque.ts
/* Initialize the deque */\n// TypeScript does not have a built-in deque, so Array is used as a deque\nconst deque: number[] = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst: number = deque[0]; // The first element\nconst peekLast: number = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront: number = deque.shift() as number; // The first element dequeued\nconst popBack: number = deque.pop() as number;    // The last element dequeued\n\n/* Get the length of the deque */\nconst size: number = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* Initialize the deque */\n// In Dart, Queue is defined as a deque\nQueue<int> deque = Queue<int>();\n\n/* Enqueue elements */\ndeque.addLast(2);  // Add to the tail\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // Add to the head\ndeque.addFirst(1);\n\n/* Access elements */\nint peekFirst = deque.first; // The first element\nint peekLast = deque.last;   // The last element\n\n/* Dequeue elements */\nint popFirst = deque.removeFirst(); // The first element dequeued\nint popLast = deque.removeLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.length;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* Initialize the deque */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(2);  // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nif let Some(front) = deque.front() { // The first element\n}\nif let Some(rear) = deque.back() {   // The last element\n}\n\n/* Dequeue elements */\nif let Some(pop_front) = deque.pop_front() { // The first element dequeued\n}\nif let Some(pop_rear) = deque.pop_back() {   // The last element dequeued\n}\n\n/* Get the length of the deque */\nlet size = deque.len();\n\n/* Check if the deque is empty */\nlet is_empty = deque.is_empty();\n
deque.c
// C does not provide a built-in deque\n
deque.kt
\n
deque.zig
\n
Visualizing Code

https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E9%98%9F%0A%20%20%20%20deq.append%282%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E5%B0%BE%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E9%A6%96%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%AE%BF%E9%97%AE%E5%85%83%E7%B4%A0%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%20front%20%3D%22,%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%20rear%20%3D%22,%20rear%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_front%20%3D%22,%20pop_front%29%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_rear%20%3D%22,%20pop_rear%29%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E7%9A%84%E9%95%BF%E5%BA%A6%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E9%95%BF%E5%BA%A6%20size%20%3D%22,%20size%29%0A%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%20%3D%22,%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_stack_and_queue/deque/#532-implementing-a-double-ended-queue","title":"5.3.2 \u00a0 Implementing a double-ended queue *","text":"

The implementation of a double-ended queue is similar to that of a regular queue, it can be based on either a linked list or an array as the underlying data structure.

"},{"location":"chapter_stack_and_queue/deque/#1-implementation-based-on-doubly-linked-list","title":"1. \u00a0 Implementation based on doubly linked list","text":"

Recall from the previous section that we used a regular singly linked list to implement a queue, as it conveniently allows for deleting from the head (corresponding to the dequeue operation) and adding new elements after the tail (corresponding to the enqueue operation).

For a double-ended queue, both the head and the tail can perform enqueue and dequeue operations. In other words, a double-ended queue needs to implement operations in the opposite direction as well. For this, we use a \"doubly linked list\" as the underlying data structure of the double-ended queue.

As shown in the Figure 5-8 , we treat the head and tail nodes of the doubly linked list as the front and rear of the double-ended queue, respectively, and implement the functionality to add and remove nodes at both ends.

LinkedListDequepushLast()pushFirst()popLast()popFirst()

Figure 5-8 \u00a0 Implementing Double-Ended Queue with Doubly Linked List for Enqueue and Dequeue Operations

The implementation code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2-implementation-based-on-array","title":"2. \u00a0 Implementation based on array","text":"

As shown in the Figure 5-9 , similar to implementing a queue with an array, we can also use a circular array to implement a double-ended queue.

ArrayDequepushLast()pushFirst()popLast()popFirst()

Figure 5-9 \u00a0 Implementing Double-Ended Queue with Array for Enqueue and Dequeue Operations

The implementation only needs to add methods for \"front enqueue\" and \"rear dequeue\":

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533-applications-of-double-ended-queue","title":"5.3.3 \u00a0 Applications of double-ended queue","text":"

The double-ended queue combines the logic of both stacks and queues, thus, it can implement all their respective use cases while offering greater flexibility.

We know that software's \"undo\" feature is typically implemented using a stack: the system pushes each change operation onto the stack and then pops to implement undoing. However, considering the limitations of system resources, software often restricts the number of undo steps (for example, only allowing the last 50 steps). When the stack length exceeds 50, the software needs to perform a deletion operation at the bottom of the stack (the front of the queue). But a regular stack cannot perform this function, where a double-ended queue becomes necessary. Note that the core logic of \"undo\" still follows the Last-In-First-Out principle of a stack, but a double-ended queue can more flexibly implement some additional logic.

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 Queue","text":"

\"Queue\" is a linear data structure that follows the First-In-First-Out (FIFO) rule. As the name suggests, a queue simulates the phenomenon of lining up, where newcomers join the queue at the rear, and the person at the front leaves the queue first.

As shown in the Figure 5-4 , we call the front of the queue the \"head\" and the back the \"tail.\" The operation of adding elements to the rear of the queue is termed \"enqueue,\" and the operation of removing elements from the front is termed \"dequeue.\"

Figure 5-4 \u00a0 Queue's first-in-first-out rule

"},{"location":"chapter_stack_and_queue/queue/#521-common-operations-on-queue","title":"5.2.1 \u00a0 Common operations on queue","text":"

The common operations on a queue are shown in the Table 5-2 . Note that method names may vary across different programming languages. Here, we use the same naming convention as that used for stacks.

Table 5-2 \u00a0 Efficiency of queue operations

Method Name Description Time Complexity push() Enqueue an element, add it to the tail \\(O(1)\\) pop() Dequeue the head element \\(O(1)\\) peek() Access the head element \\(O(1)\\)

We can directly use the ready-made queue classes in programming languages:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig queue.py
from collections import deque\n\n# Initialize the queue\n# In Python, we generally use the deque class as a queue\n# Although queue.Queue() is a pure queue class, it's not very user-friendly, so it's not recommended\nque: deque[int] = deque()\n\n# Enqueue elements\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# Access the first element\nfront: int = que[0]\n\n# Dequeue an element\npop: int = que.popleft()\n\n# Get the length of the queue\nsize: int = len(que)\n\n# Check if the queue is empty\nis_empty: bool = len(que) == 0\n
queue.cpp
/* Initialize the queue */\nqueue<int> queue;\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element*/\nint front = queue.front();\n\n/* Dequeue an element */\nqueue.pop();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nbool empty = queue.empty();\n
queue.java
/* Initialize the queue */\nQueue<Integer> queue = new LinkedList<>();\n\n/* Enqueue elements */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* Access the first element */\nint peek = queue.peek();\n\n/* Dequeue an element */\nint pop = queue.poll();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* Initialize the queue */\nQueue<int> queue = new();\n\n/* Enqueue elements */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* Access the first element */\nint peek = queue.Peek();\n\n/* Dequeue an element */\nint pop = queue.Dequeue();\n\n/* Get the length of the queue */\nint size = queue.Count;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* Initialize the queue */\n// In Go, use list as a queue\nqueue := list.New()\n\n/* Enqueue elements */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* Access the first element */\npeek := queue.Front()\n\n/* Dequeue an element */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* Get the length of the queue */\nsize := queue.Len()\n\n/* Check if the queue is empty */\nisEmpty := queue.Len() == 0\n
queue.swift
/* Initialize the queue */\n// Swift does not have a built-in queue class, so Array can be used as a queue\nvar queue: [Int] = []\n\n/* Enqueue elements */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* Access the first element */\nlet peek = queue.first!\n\n/* Dequeue an element */\n// Since it's an array, removeFirst has a complexity of O(n)\nlet pool = queue.removeFirst()\n\n/* Get the length of the queue */\nlet size = queue.count\n\n/* Check if the queue is empty */\nlet isEmpty = queue.isEmpty\n
queue.js
/* Initialize the queue */\n// JavaScript does not have a built-in queue, so Array can be used as a queue\nconst queue = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
queue.ts
/* Initialize the queue */\n// TypeScript does not have a built-in queue, so Array can be used as a queue \nconst queue: number[] = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
queue.dart
/* Initialize the queue */\n// In Dart, the Queue class is a double-ended queue but can be used as a queue\nQueue<int> queue = Queue();\n\n/* Enqueue elements */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* Access the first element */\nint peek = queue.first;\n\n/* Dequeue an element */\nint pop = queue.removeFirst();\n\n/* Get the length of the queue */\nint size = queue.length;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* Initialize the double-ended queue */\n// In Rust, use a double-ended queue as a regular queue\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* Access the first element */\nif let Some(front) = deque.front() {\n}\n\n/* Dequeue an element */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* Get the length of the queue */\nlet size = deque.len();\n\n/* Check if the queue is empty */\nlet is_empty = deque.is_empty();\n
queue.c
// C does not provide a built-in queue\n
queue.kt
\n
queue.zig
\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/queue/#522-implementing-a-queue","title":"5.2.2 \u00a0 Implementing a queue","text":"

To implement a queue, we need a data structure that allows adding elements at one end and removing them at the other. Both linked lists and arrays meet this requirement.

"},{"location":"chapter_stack_and_queue/queue/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

As shown in the Figure 5-5 , we can consider the \"head node\" and \"tail node\" of a linked list as the \"front\" and \"rear\" of the queue, respectively. It is stipulated that nodes can only be added at the rear and removed at the front.

LinkedListQueuepush()pop()

Figure 5-5 \u00a0 Implementing Queue with Linked List for Enqueue and Dequeue Operations

Below is the code for implementing a queue using a linked list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/queue/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

Deleting the first element in an array has a time complexity of \\(O(n)\\), which would make the dequeue operation inefficient. However, this problem can be cleverly avoided as follows.

We use a variable front to indicate the index of the front element and maintain a variable size to record the queue's length. Define rear = front + size, which points to the position immediately following the tail element.

With this design, the effective interval of elements in the array is [front, rear - 1]. The implementation methods for various operations are shown in the Figure 5-6 .

  • Enqueue operation: Assign the input element to the rear index and increase size by 1.
  • Dequeue operation: Simply increase front by 1 and decrease size by 1.

Both enqueue and dequeue operations only require a single operation, each with a time complexity of \\(O(1)\\).

ArrayQueuepush()pop()

Figure 5-6 \u00a0 Implementing Queue with Array for Enqueue and Dequeue Operations

You might notice a problem: as enqueue and dequeue operations are continuously performed, both front and rear move to the right and will eventually reach the end of the array and can't move further. To resolve this, we can treat the array as a \"circular array\" where connecting the end of the array back to its beginning.

In a circular array, front or rear needs to loop back to the start of the array upon reaching the end. This cyclical pattern can be achieved with a \"modulo operation\" as shown in the code below:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

The above implementation of the queue still has its limitations: its length is fixed. However, this issue is not difficult to resolve. We can replace the array with a dynamic array that can expand itself if needed. Interested readers can try to implement this themselves.

The comparison of the two implementations is consistent with that of the stack and is not repeated here.

"},{"location":"chapter_stack_and_queue/queue/#523-typical-applications-of-queue","title":"5.2.3 \u00a0 Typical applications of queue","text":"
  • Amazon orders: After shoppers place orders, these orders join a queue, and the system processes them in order. During events like Singles' Day, a massive number of orders are generated in a short time, making high concurrency a key challenge for engineers.
  • Various to-do lists: Any scenario requiring a \"first-come, first-served\" functionality, such as a printer's task queue or a restaurant's food delivery queue, can effectively maintain the order of processing with a queue.
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 Stack","text":"

A \"Stack\" is a linear data structure that follows the principle of Last-In-First-Out (LIFO).

We can compare a stack to a pile of plates on a table. To access the bottom plate, one must first remove the plates on top. By replacing the plates with various types of elements (such as integers, characters, objects, etc.), we obtain the data structure known as a stack.

As shown in the Figure 5-1 , we refer to the top of the pile of elements as the \"top of the stack\" and the bottom as the \"bottom of the stack.\" The operation of adding elements to the top of the stack is called \"push,\" and the operation of removing the top element is called \"pop.\"

Figure 5-1 \u00a0 Stack's last-in-first-out rule

"},{"location":"chapter_stack_and_queue/stack/#511-common-operations-on-stack","title":"5.1.1 \u00a0 Common operations on stack","text":"

The common operations on a stack are shown in the Table 5-1 . The specific method names depend on the programming language used. Here, we use push(), pop(), and peek() as examples.

Table 5-1 \u00a0 Efficiency of stack operations

Method Description Time Complexity push() Push an element onto the stack (add to the top) \\(O(1)\\) pop() Pop the top element from the stack \\(O(1)\\) peek() Access the top element of the stack \\(O(1)\\)

Typically, we can directly use the stack class built into the programming language. However, some languages may not specifically provide a stack class. In these cases, we can use the language's \"array\" or \"linked list\" as a stack and ignore operations that are not related to stack logic in the program.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig stack.py
# Initialize the stack\n# Python does not have a built-in stack class, so a list can be used as a stack\nstack: list[int] = []\n\n# Push elements onto the stack\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# Access the top element of the stack\npeek: int = stack[-1]\n\n# Pop an element from the stack\npop: int = stack.pop()\n\n# Get the length of the stack\nsize: int = len(stack)\n\n# Check if the stack is empty\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* Initialize the stack */\nstack<int> stack;\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint top = stack.top();\n\n/* Pop an element from the stack */\nstack.pop(); // No return value\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nbool empty = stack.empty();\n
stack.java
/* Initialize the stack */\nStack<Integer> stack = new Stack<>();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint peek = stack.peek();\n\n/* Pop an element from the stack */\nint pop = stack.pop();\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* Initialize the stack */\nStack<int> stack = new();\n\n/* Push elements onto the stack */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* Access the top element of the stack */\nint peek = stack.Peek();\n\n/* Pop an element from the stack */\nint pop = stack.Pop();\n\n/* Get the length of the stack */\nint size = stack.Count;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* Initialize the stack */\n// In Go, it is recommended to use a Slice as a stack\nvar stack []int\n\n/* Push elements onto the stack */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* Access the top element of the stack */\npeek := stack[len(stack)-1]\n\n/* Pop an element from the stack */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* Get the length of the stack */\nsize := len(stack)\n\n/* Check if the stack is empty */\nisEmpty := len(stack) == 0\n
stack.swift
/* Initialize the stack */\n// Swift does not have a built-in stack class, so Array can be used as a stack\nvar stack: [Int] = []\n\n/* Push elements onto the stack */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* Access the top element of the stack */\nlet peek = stack.last!\n\n/* Pop an element from the stack */\nlet pop = stack.removeLast()\n\n/* Get the length of the stack */\nlet size = stack.count\n\n/* Check if the stack is empty */\nlet isEmpty = stack.isEmpty\n
stack.js
/* Initialize the stack */\n// JavaScript does not have a built-in stack class, so Array can be used as a stack\nconst stack = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length-1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
stack.ts
/* Initialize the stack */\n// TypeScript does not have a built-in stack class, so Array can be used as a stack\nconst stack: number[] = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length - 1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
stack.dart
/* Initialize the stack */\n// Dart does not have a built-in stack class, so List can be used as a stack\nList<int> stack = [];\n\n/* Push elements onto the stack */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* Access the top element of the stack */\nint peek = stack.last;\n\n/* Pop an element from the stack */\nint pop = stack.removeLast();\n\n/* Get the length of the stack */\nint size = stack.length;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* Initialize the stack */\n// Use Vec as a stack\nlet mut stack: Vec<i32> = Vec::new();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nlet top = stack.last().unwrap();\n\n/* Pop an element from the stack */\nlet pop = stack.pop().unwrap();\n\n/* Get the length of the stack */\nlet size = stack.len();\n\n/* Check if the stack is empty */\nlet is_empty = stack.is_empty();\n
stack.c
// C does not provide a built-in stack\n
stack.kt
\n
stack.zig
\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#512-implementing-a-stack","title":"5.1.2 \u00a0 Implementing a stack","text":"

To gain a deeper understanding of how a stack operates, let's try implementing a stack class ourselves.

A stack follows the principle of Last-In-First-Out, which means we can only add or remove elements at the top of the stack. However, both arrays and linked lists allow adding and removing elements at any position, therefore a stack can be seen as a restricted array or linked list. In other words, we can \"shield\" certain irrelevant operations of an array or linked list, aligning their external behavior with the characteristics of a stack.

"},{"location":"chapter_stack_and_queue/stack/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

When implementing a stack using a linked list, we can consider the head node of the list as the top of the stack and the tail node as the bottom of the stack.

As shown in the Figure 5-2 , for the push operation, we simply insert elements at the head of the linked list. This method of node insertion is known as \"head insertion.\" For the pop operation, we just need to remove the head node from the list.

LinkedListStackpush()pop()

Figure 5-2 \u00a0 Implementing Stack with Linked List for Push and Pop Operations

Below is an example code for implementing a stack based on a linked list:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

When implementing a stack using an array, we can consider the end of the array as the top of the stack. As shown in the Figure 5-3 , push and pop operations correspond to adding and removing elements at the end of the array, respectively, both with a time complexity of \\(O(1)\\).

ArrayStackpush()pop()

Figure 5-3 \u00a0 Implementing Stack with Array for Push and Pop Operations

Since the elements to be pushed onto the stack may continuously increase, we can use a dynamic array, thus avoiding the need to handle array expansion ourselves. Here is an example code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_stack_and_queue/stack/#513-comparison-of-the-two-implementations","title":"5.1.3 \u00a0 Comparison of the two implementations","text":"

Supported Operations

Both implementations support all the operations defined in a stack. The array implementation additionally supports random access, but this is beyond the scope of a stack definition and is generally not used.

Time Efficiency

In the array-based implementation, both push and pop operations occur in pre-allocated contiguous memory, which has good cache locality and therefore higher efficiency. However, if the push operation exceeds the array capacity, it triggers a resizing mechanism, making the time complexity of that push operation \\(O(n)\\).

In the linked list implementation, list expansion is very flexible, and there is no efficiency decrease issue as in array expansion. However, the push operation requires initializing a node object and modifying pointers, so its efficiency is relatively lower. If the elements being pushed are already node objects, then the initialization step can be skipped, improving efficiency.

Thus, when the elements for push and pop operations are basic data types like int or double, we can draw the following conclusions:

  • The array-based stack implementation's efficiency decreases during expansion, but since expansion is a low-frequency operation, its average efficiency is higher.
  • The linked list-based stack implementation provides more stable efficiency performance.

Space Efficiency

When initializing a list, the system allocates an \"initial capacity,\" which might exceed the actual need; moreover, the expansion mechanism usually increases capacity by a specific factor (like doubling), which may also exceed the actual need. Therefore, the array-based stack might waste some space.

However, since linked list nodes require extra space for storing pointers, the space occupied by linked list nodes is relatively larger.

In summary, we cannot simply determine which implementation is more memory-efficient. It requires analysis based on specific circumstances.

"},{"location":"chapter_stack_and_queue/stack/#514-typical-applications-of-stack","title":"5.1.4 \u00a0 Typical applications of stack","text":"
  • Back and forward in browsers, undo and redo in software. Every time we open a new webpage, the browser pushes the previous page onto the stack, allowing us to go back to the previous page through the back operation, which is essentially a pop operation. To support both back and forward, two stacks are needed to work together.
  • Memory management in programs. Each time a function is called, the system adds a stack frame at the top of the stack to record the function's context information. In recursive functions, the downward recursion phase keeps pushing onto the stack, while the upward backtracking phase keeps popping from the stack.
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 Summary","text":""},{"location":"chapter_stack_and_queue/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • Stack is a data structure that follows the Last-In-First-Out (LIFO) principle and can be implemented using arrays or linked lists.
  • In terms of time efficiency, the array implementation of the stack has a higher average efficiency. However, during expansion, the time complexity for a single push operation can degrade to \\(O(n)\\). In contrast, the linked list implementation of a stack offers more stable efficiency.
  • Regarding space efficiency, the array implementation of the stack may lead to a certain degree of space wastage. However, it's important to note that the memory space occupied by nodes in a linked list is generally larger than that for elements in an array.
  • A queue is a data structure that follows the First-In-First-Out (FIFO) principle, and it can also be implemented using arrays or linked lists. The conclusions regarding time and space efficiency for queues are similar to those for stacks.
  • A double-ended queue (deque) is a more flexible type of queue that allows adding and removing elements at both ends.
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: Is the browser's forward and backward functionality implemented with a doubly linked list?

A browser's forward and backward navigation is essentially a manifestation of the \"stack\" concept. When a user visits a new page, the page is added to the top of the stack; when they click the back button, the page is popped from the top of the stack. A double-ended queue (deque) can conveniently implement some additional operations, as mentioned in the \"Double-Ended Queue\" section.

Q: After popping from a stack, is it necessary to free the memory of the popped node?

If the popped node will still be used later, it's not necessary to free its memory. In languages like Java and Python that have automatic garbage collection, manual memory release is not necessary; in C and C++, manual memory release is required.

Q: A double-ended queue seems like two stacks joined together. What are its uses?

A double-ended queue, which is a combination of a stack and a queue or two stacks joined together, exhibits both stack and queue logic. Thus, it can implement all applications of stacks and queues while offering more flexibility.

Q: How exactly are undo and redo implemented?

Undo and redo operations are implemented using two stacks: Stack A for undo and Stack B for redo.

  1. Each time a user performs an operation, it is pushed onto Stack A, and Stack B is cleared.
  2. When the user executes an \"undo\", the most recent operation is popped from Stack A and pushed onto Stack B.
  3. When the user executes a \"redo\", the most recent operation is popped from Stack B and pushed back onto Stack A.
"},{"location":"chapter_tree/","title":"Chapter 7. \u00a0 Tree","text":"

Abstract

The towering tree, vibrant with it's deep roots and lush leaves, branches spreading wide.

It vividly illustrates the concept of divide-and-conquer in data.

"},{"location":"chapter_tree/#chapter-contents","title":"Chapter contents","text":"
  • 7.1 \u00a0 Binary tree
  • 7.2 \u00a0 Binary tree Traversal
  • 7.3 \u00a0 Array Representation of tree
  • 7.4 \u00a0 Binary Search tree
  • 7.5 \u00a0 AVL tree *
  • 7.6 \u00a0 Summary
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 Array representation of binary trees","text":"

Under the linked list representation, the storage unit of a binary tree is a node TreeNode, with nodes connected by pointers. The basic operations of binary trees under the linked list representation were introduced in the previous section.

So, can we use an array to represent a binary tree? The answer is yes.

"},{"location":"chapter_tree/array_representation_of_tree/#731-representing-perfect-binary-trees","title":"7.3.1 \u00a0 Representing perfect binary trees","text":"

Let's analyze a simple case first. Given a perfect binary tree, we store all nodes in an array according to the order of level-order traversal, where each node corresponds to a unique array index.

Based on the characteristics of level-order traversal, we can deduce a \"mapping formula\" between the index of a parent node and its children: If a node's index is \\(i\\), then the index of its left child is \\(2i + 1\\) and the right child is \\(2i + 2\\). The Figure 7-12 shows the mapping relationship between the indices of various nodes.

Figure 7-12 \u00a0 Array representation of a perfect binary tree

The mapping formula plays a role similar to the node references (pointers) in linked lists. Given any node in the array, we can access its left (right) child node using the mapping formula.

"},{"location":"chapter_tree/array_representation_of_tree/#732-representing-any-binary-tree","title":"7.3.2 \u00a0 Representing any binary tree","text":"

Perfect binary trees are a special case; there are often many None values in the middle levels of a binary tree. Since the sequence of level-order traversal does not include these None values, we cannot solely rely on this sequence to deduce the number and distribution of None values. This means that multiple binary tree structures can match the same level-order traversal sequence.

As shown in the Figure 7-13 , given a non-perfect binary tree, the above method of array representation fails.

Figure 7-13 \u00a0 Level-order traversal sequence corresponds to multiple binary tree possibilities

To solve this problem, we can consider explicitly writing out all None values in the level-order traversal sequence. As shown in the following figure, after this treatment, the level-order traversal sequence can uniquely represent a binary tree. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# Array representation of a binary tree\n# Using None to represent empty slots\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* Array representation of a binary tree */\n// Using the maximum integer value INT_MAX to mark empty slots\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* Array representation of a binary tree */\n// Using the Integer wrapper class allows for using null to mark empty slots\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using an any type slice, allowing for nil to mark empty slots\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* Array representation of a binary tree */\n// Using optional Int (Int?) allows for using nil to mark empty slots\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* Array representation of a binary tree */\n// Using None to mark empty slots\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* Array representation of a binary tree */\n// Using the maximum int value to mark empty slots, therefore, node values must not be INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* Array representation of a binary tree */\n// Using null to represent empty slots\nval tree = mutableListOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
\n
\n

Figure 7-14 \u00a0 Array representation of any type of binary tree

It's worth noting that complete binary trees are very suitable for array representation. Recalling the definition of a complete binary tree, None appears only at the bottom level and towards the right, meaning all None values definitely appear at the end of the level-order traversal sequence.

This means that when using an array to represent a complete binary tree, it's possible to omit storing all None values, which is very convenient. The Figure 7-15 gives an example.

Figure 7-15 \u00a0 Array representation of a complete binary tree

The following code implements a binary tree based on array representation, including the following operations:

  • Given a node, obtain its value, left (right) child node, and parent node.
  • Obtain the preorder, inorder, postorder, and level-order traversal sequences.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/array_representation_of_tree/#733-advantages-and-limitations","title":"7.3.3 \u00a0 Advantages and limitations","text":"

The array representation of binary trees has the following advantages:

  • Arrays are stored in contiguous memory spaces, which is cache-friendly and allows for faster access and traversal.
  • It does not require storing pointers, which saves space.
  • It allows random access to nodes.

However, the array representation also has some limitations:

  • Array storage requires contiguous memory space, so it is not suitable for storing trees with a large amount of data.
  • Adding or deleting nodes requires array insertion and deletion operations, which are less efficient.
  • When there are many None values in the binary tree, the proportion of node data contained in the array is low, leading to lower space utilization.
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL tree *","text":"

In the \"Binary Search Tree\" section, we mentioned that after multiple insertions and removals, a binary search tree might degrade to a linked list. In such cases, the time complexity of all operations degrades from \\(O(\\log n)\\) to \\(O(n)\\).

As shown in the Figure 7-24 , after two node removal operations, this binary search tree will degrade into a linked list.

Figure 7-24 \u00a0 Degradation of an AVL tree after removing nodes

For example, in the perfect binary tree shown in the Figure 7-25 , after inserting two nodes, the tree will lean heavily to the left, and the time complexity of search operations will also degrade.

Figure 7-25 \u00a0 Degradation of an AVL tree after inserting nodes

In 1962, G. M. Adelson-Velsky and E. M. Landis proposed the \"AVL Tree\" in their paper \"An algorithm for the organization of information\". The paper detailed a series of operations to ensure that after continuously adding and removing nodes, the AVL tree would not degrade, thus maintaining the time complexity of various operations at \\(O(\\log n)\\) level. In other words, in scenarios where frequent additions, removals, searches, and modifications are needed, the AVL tree can always maintain efficient data operation performance, which has great application value.

"},{"location":"chapter_tree/avl_tree/#751-common-terminology-in-avl-trees","title":"7.5.1 \u00a0 Common terminology in AVL trees","text":"

An AVL tree is both a binary search tree and a balanced binary tree, satisfying all properties of these two types of binary trees, hence it is a \"balanced binary search tree\".

"},{"location":"chapter_tree/avl_tree/#1-node-height","title":"1. \u00a0 Node height","text":"

Since the operations related to AVL trees require obtaining node heights, we need to add a height variable to the node class:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # Node value\n        self.height: int = 0                # Node height\n        self.left: TreeNode | None = None   # Left child reference\n        self.right: TreeNode | None = None  # Right child reference\n
/* AVL tree node */\nstruct TreeNode {\n    int val{};          // Node value\n    int height = 0;     // Node height\n    TreeNode *left{};   // Left child\n    TreeNode *right{};  // Right child\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL tree node */\nclass TreeNode {\n    public int val;        // Node value\n    public int height;     // Node height\n    public TreeNode left;  // Left child\n    public TreeNode right; // Right child\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public int height;      // Node height\n    public TreeNode? left;  // Left child reference\n    public TreeNode? right; // Right child reference\n}\n
/* AVL tree node */\ntype TreeNode struct {\n    Val    int       // Node value\n    Height int       // Node height\n    Left   *TreeNode // Left child reference\n    Right  *TreeNode // Right child reference\n}\n
/* AVL tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var height: Int // Node height\n    var left: TreeNode? // Left child\n    var right: TreeNode? // Right child\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n    val; // Node value\n    height; // Node height\n    left; // Left child pointer\n    right; // Right child pointer\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n    val: number;            // Node value\n    height: number;         // Node height\n    left: TreeNode | null;  // Left child pointer\n    right: TreeNode | null; // Right child pointer\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height; \n        this.left = left === undefined ? null : left; \n        this.right = right === undefined ? null : right; \n    }\n}\n
/* AVL tree node */\nclass TreeNode {\n  int val;         // Node value\n  int height;      // Node height\n  TreeNode? left;  // Left child\n  TreeNode? right; // Right child\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    height: i32,                            // Node height\n    left: Option<Rc<RefCell<TreeNode>>>,    // Left child\n    right: Option<Rc<RefCell<TreeNode>>>,   // Right child\n}\n\nimpl TreeNode {\n    /* Constructor */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL tree node */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* Constructor */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val height: Int = 0          // Node height\n    val left: TreeNode? = null   // Left child\n    val right: TreeNode? = null  // Right child\n}\n
\n
\n

The \"node height\" refers to the distance from that node to its farthest leaf node, i.e., the number of \"edges\" passed. It is important to note that the height of a leaf node is \\(0\\), and the height of a null node is \\(-1\\). We will create two utility functions for getting and updating the height of a node:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-node-balance-factor","title":"2. \u00a0 Node balance factor","text":"

The \"balance factor\" of a node is defined as the height of the node's left subtree minus the height of its right subtree, with the balance factor of a null node defined as \\(0\\). We will also encapsulate the functionality of obtaining the node balance factor into a function for easy use later on:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

Let the balance factor be \\(f\\), then the balance factor of any node in an AVL tree satisfies \\(-1 \\le f \\le 1\\).

"},{"location":"chapter_tree/avl_tree/#752-rotations-in-avl-trees","title":"7.5.2 \u00a0 Rotations in AVL trees","text":"

The characteristic feature of an AVL tree is the \"rotation\" operation, which can restore balance to an unbalanced node without affecting the in-order traversal sequence of the binary tree. In other words, the rotation operation can maintain the property of a \"binary search tree\" while also turning the tree back into a \"balanced binary tree\".

We call nodes with an absolute balance factor \\(> 1\\) \"unbalanced nodes\". Depending on the type of imbalance, there are four kinds of rotations: right rotation, left rotation, right-left rotation, and left-right rotation. Below, we detail these rotation operations.

"},{"location":"chapter_tree/avl_tree/#1-right-rotation","title":"1. \u00a0 Right rotation","text":"

As shown in the Figure 7-26 , the first unbalanced node from the bottom up in the binary tree is \"node 3\". Focusing on the subtree with this unbalanced node as the root, denoted as node, and its left child as child, perform a \"right rotation\". After the right rotation, the subtree is balanced again while still maintaining the properties of a binary search tree.

<1><2><3><4>

Figure 7-26 \u00a0 Steps of right rotation

As shown in the Figure 7-27 , when the child node has a right child (denoted as grand_child), a step needs to be added in the right rotation: set grand_child as the left child of node.

Figure 7-27 \u00a0 Right rotation with grand_child

\"Right rotation\" is a figurative term; in practice, it is achieved by modifying node pointers, as shown in the following code:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-left-rotation","title":"2. \u00a0 Left rotation","text":"

Correspondingly, if considering the \"mirror\" of the above unbalanced binary tree, the \"left rotation\" operation shown in the Figure 7-28 needs to be performed.

Figure 7-28 \u00a0 Left rotation operation

Similarly, as shown in the Figure 7-29 , when the child node has a left child (denoted as grand_child), a step needs to be added in the left rotation: set grand_child as the right child of node.

Figure 7-29 \u00a0 Left rotation with grand_child

It can be observed that the right and left rotation operations are logically symmetrical, and they solve two symmetrical types of imbalance. Based on symmetry, by replacing all left with right, and all right with left in the implementation code of right rotation, we can get the implementation code for left rotation:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3-right-left-rotation","title":"3. \u00a0 Right-left rotation","text":"

For the unbalanced node 3 shown in the Figure 7-30 , using either left or right rotation alone cannot restore balance to the subtree. In this case, a \"left rotation\" needs to be performed on child first, followed by a \"right rotation\" on node.

Figure 7-30 \u00a0 Right-left rotation

"},{"location":"chapter_tree/avl_tree/#4-left-right-rotation","title":"4. \u00a0 Left-right rotation","text":"

As shown in the Figure 7-31 , for the mirror case of the above unbalanced binary tree, a \"right rotation\" needs to be performed on child first, followed by a \"left rotation\" on node.

Figure 7-31 \u00a0 Left-right rotation

"},{"location":"chapter_tree/avl_tree/#5-choice-of-rotation","title":"5. \u00a0 Choice of rotation","text":"

The four kinds of imbalances shown in the Figure 7-32 correspond to the cases described above, respectively requiring right rotation, left-right rotation, right-left rotation, and left rotation.

Figure 7-32 \u00a0 The four rotation cases of AVL tree

As shown in the Table 7-3 , we determine which of the above cases an unbalanced node belongs to by judging the sign of the balance factor of the unbalanced node and its higher-side child's balance factor.

Table 7-3 \u00a0 Conditions for Choosing Among the Four Rotation Cases

Balance factor of unbalanced node Balance factor of child node Rotation method to use \\(> 1\\) (Left-leaning tree) \\(\\geq 0\\) Right rotation \\(> 1\\) (Left-leaning tree) \\(<0\\) Left rotation then right rotation \\(< -1\\) (Right-leaning tree) \\(\\leq 0\\) Left rotation \\(< -1\\) (Right-leaning tree) \\(>0\\) Right rotation then left rotation

For convenience, we encapsulate the rotation operations into a function. With this function, we can perform rotations on various kinds of imbalances, restoring balance to unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-common-operations-in-avl-trees","title":"7.5.3 \u00a0 Common operations in AVL trees","text":""},{"location":"chapter_tree/avl_tree/#1-node-insertion","title":"1. \u00a0 Node insertion","text":"

The node insertion operation in AVL trees is similar to that in binary search trees. The only difference is that after inserting a node in an AVL tree, a series of unbalanced nodes may appear along the path from that node to the root node. Therefore, we need to start from this node and perform rotation operations upwards to restore balance to all unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2-node-removal","title":"2. \u00a0 Node removal","text":"

Similarly, based on the method of removing nodes in binary search trees, rotation operations need to be performed from the bottom up to restore balance to all unbalanced nodes. The code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3-node-search","title":"3. \u00a0 Node search","text":"

The node search operation in AVL trees is consistent with that in binary search trees and will not be detailed here.

"},{"location":"chapter_tree/avl_tree/#754-typical-applications-of-avl-trees","title":"7.5.4 \u00a0 Typical applications of AVL trees","text":"
  • Organizing and storing large amounts of data, suitable for scenarios with high-frequency searches and low-frequency intertions and removals.
  • Used to build index systems in databases.
  • Red-black trees are also a common type of balanced binary search tree. Compared to AVL trees, red-black trees have more relaxed balancing conditions, require fewer rotations for node insertion and removal, and have a higher average efficiency for node addition and removal operations.
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 Binary search tree","text":"

As shown in the Figure 7-16 , a \"binary search tree\" satisfies the following conditions.

  1. For the root node, the value of all nodes in the left subtree < the value of the root node < the value of all nodes in the right subtree.
  2. The left and right subtrees of any node are also binary search trees, i.e., they satisfy condition 1. as well.

Figure 7-16 \u00a0 Binary search tree

"},{"location":"chapter_tree/binary_search_tree/#741-operations-on-a-binary-search-tree","title":"7.4.1 \u00a0 Operations on a binary search tree","text":"

We encapsulate the binary search tree as a class BinarySearchTree and declare a member variable root, pointing to the tree's root node.

"},{"location":"chapter_tree/binary_search_tree/#1-searching-for-a-node","title":"1. \u00a0 Searching for a node","text":"

Given a target node value num, one can search according to the properties of the binary search tree. As shown in the Figure 7-17 , we declare a node cur and start from the binary tree's root node root, looping to compare the size relationship between the node value cur.val and num.

  • If cur.val < num, it means the target node is in cur's right subtree, thus execute cur = cur.right.
  • If cur.val > num, it means the target node is in cur's left subtree, thus execute cur = cur.left.
  • If cur.val = num, it means the target node is found, exit the loop and return the node.
<1><2><3><4>

Figure 7-17 \u00a0 Example of searching for a node in a binary search tree

The search operation in a binary search tree works on the same principle as the binary search algorithm, eliminating half of the possibilities in each round. The number of loops is at most the height of the binary tree. When the binary tree is balanced, it uses \\(O(\\log n)\\) time. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_search_tree/#2-inserting-a-node","title":"2. \u00a0 Inserting a node","text":"

Given an element num to be inserted, to maintain the property of the binary search tree \"left subtree < root node < right subtree,\" the insertion operation proceeds as shown in the Figure 7-18 .

  1. Finding the insertion position: Similar to the search operation, start from the root node and loop downwards according to the size relationship between the current node value and num until passing through the leaf node (traversing to None) then exit the loop.
  2. Insert the node at that position: Initialize the node num and place it where None was.

Figure 7-18 \u00a0 Inserting a node into a binary search tree

In the code implementation, note the following two points.

  • The binary search tree does not allow duplicate nodes; otherwise, it will violate its definition. Therefore, if the node to be inserted already exists in the tree, the insertion is not performed, and it directly returns.
  • To perform the insertion operation, we need to use the node pre to save the node from the last loop. This way, when traversing to None, we can get its parent node, thus completing the node insertion operation.
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
Code Visualization

Full Screen >

Similar to searching for a node, inserting a node uses \\(O(\\log n)\\) time.

"},{"location":"chapter_tree/binary_search_tree/#3-removing-a-node","title":"3. \u00a0 Removing a node","text":"

First, find the target node in the binary tree, then remove it. Similar to inserting a node, we need to ensure that after the removal operation is completed, the property of the binary search tree \"left subtree < root node < right subtree\" is still satisfied. Therefore, based on the number of child nodes of the target node, we divide it into 0, 1, and 2 cases, performing the corresponding node removal operations.

As shown in the Figure 7-19 , when the degree of the node to be removed is \\(0\\), it means the node is a leaf node, and it can be directly removed.

Figure 7-19 \u00a0 Removing a node in a binary search tree (degree 0)

As shown in the Figure 7-20 , when the degree of the node to be removed is \\(1\\), replacing the node to be removed with its child node is sufficient.

Figure 7-20 \u00a0 Removing a node in a binary search tree (degree 1)

When the degree of the node to be removed is \\(2\\), we cannot remove it directly, but need to use a node to replace it. To maintain the property of the binary search tree \"left subtree < root node < right subtree,\" this node can be either the smallest node of the right subtree or the largest node of the left subtree.

Assuming we choose the smallest node of the right subtree (the next node in in-order traversal), then the removal operation proceeds as shown in the Figure 7-21 .

  1. Find the next node in the \"in-order traversal sequence\" of the node to be removed, denoted as tmp.
  2. Replace the value of the node to be removed with tmp's value, and recursively remove the node tmp in the tree.
<1><2><3><4>

Figure 7-21 \u00a0 Removing a node in a binary search tree (degree 2)

The operation of removing a node also uses \\(O(\\log n)\\) time, where finding the node to be removed requires \\(O(\\log n)\\) time, and obtaining the in-order traversal successor node requires \\(O(\\log n)\\) time. Example code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_search_tree/#4-in-order-traversal-is-ordered","title":"4. \u00a0 In-order traversal is ordered","text":"

As shown in the Figure 7-22 , the in-order traversal of a binary tree follows the \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\" traversal order, and a binary search tree satisfies the size relationship \"left child node < root node < right child node\".

This means that in-order traversal in a binary search tree always traverses the next smallest node first, thus deriving an important property: The in-order traversal sequence of a binary search tree is ascending.

Using the ascending property of in-order traversal, obtaining ordered data in a binary search tree requires only \\(O(n)\\) time, without the need for additional sorting operations, which is very efficient.

Figure 7-22 \u00a0 In-order traversal sequence of a binary search tree

"},{"location":"chapter_tree/binary_search_tree/#742-efficiency-of-binary-search-trees","title":"7.4.2 \u00a0 Efficiency of binary search trees","text":"

Given a set of data, we consider using an array or a binary search tree for storage. Observing the Table 7-2 , the operations on a binary search tree all have logarithmic time complexity, which is stable and efficient. Only in scenarios of high-frequency addition and low-frequency search and removal, arrays are more efficient than binary search trees.

Table 7-2 \u00a0 Efficiency comparison between arrays and search trees

Unsorted array Binary search tree Search element \\(O(n)\\) \\(O(\\log n)\\) Insert element \\(O(1)\\) \\(O(\\log n)\\) Remove element \\(O(n)\\) \\(O(\\log n)\\)

In ideal conditions, the binary search tree is \"balanced,\" thus any node can be found within \\(\\log n\\) loops.

However, continuously inserting and removing nodes in a binary search tree may lead to the binary tree degenerating into a chain list as shown in the Figure 7-23 , at which point the time complexity of various operations also degrades to \\(O(n)\\).

Figure 7-23 \u00a0 Degradation of a binary search tree

"},{"location":"chapter_tree/binary_search_tree/#743-common-applications-of-binary-search-trees","title":"7.4.3 \u00a0 Common applications of binary search trees","text":"
  • Used as multi-level indexes in systems to implement efficient search, insertion, and removal operations.
  • Serves as the underlying data structure for certain search algorithms.
  • Used to store data streams to maintain their ordered state.
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 Binary tree","text":"

A \"binary tree\" is a non-linear data structure that represents the ancestral and descendent relationships, embodying the \"divide and conquer\" logic. Similar to a linked list, the basic unit of a binary tree is a node, each containing a value, a reference to the left child node, and a reference to the right child node.

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"Binary tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.left: TreeNode | None = None  # Reference to left child node\n        self.right: TreeNode | None = None # Reference to right child node\n
/* Binary tree node */\nstruct TreeNode {\n    int val;          // Node value\n    TreeNode *left;   // Pointer to left child node\n    TreeNode *right;  // Pointer to right child node\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* Binary tree node */\nclass TreeNode {\n    int val;         // Node value\n    TreeNode left;   // Reference to left child node\n    TreeNode right;  // Reference to right child node\n    TreeNode(int x) { val = x; }\n}\n
/* Binary tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public TreeNode? left;  // Reference to left child node\n    public TreeNode? right; // Reference to right child node\n}\n
/* Binary tree node */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // Pointer to left child node\n        Right: nil, // Pointer to right child node\n        Val:   v,   // Node value\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var left: TreeNode? // Reference to left child node\n    var right: TreeNode? // Reference to right child node\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    val; // Node value\n    left; // Pointer to left child node\n    right; // Pointer to right child node\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // Node value\n        this.left = left === undefined ? null : left; // Reference to left child node\n        this.right = right === undefined ? null : right; // Reference to right child node\n    }\n}\n
/* Binary tree node */\nclass TreeNode {\n  int val;         // Node value\n  TreeNode? left;  // Reference to left child node\n  TreeNode? right; // Reference to right child node\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Binary tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    left: Option<Rc<RefCell<TreeNode>>>,    // Reference to left child node\n    right: Option<Rc<RefCell<TreeNode>>>,   // Reference to right child node\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* Binary tree node */\ntypedef struct TreeNode {\n    int val;                // Node value\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // Pointer to left child node\n    struct TreeNode *right; // Pointer to right child node\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* Binary tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val left: TreeNode? = null   // Reference to left child node\n    val right: TreeNode? = null  // Reference to right child node\n}\n
\n
\n

Each node has two references (pointers), pointing to the \"left-child node\" and \"right-child node,\" respectively. This node is called the \"parent node\" of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes under it the \"left subtree\" of this node. Similarly, the \"right subtree\" can be defined.

In a binary tree, except for leaf nodes, all other nodes contain child nodes and non-empty subtrees. As shown in the Figure 7-1 , if \"Node 2\" is considered as the parent node, then its left and right child nodes are \"Node 4\" and \"Node 5,\" respectively. The left subtree is \"the tree formed by Node 4 and all nodes under it,\" and the right subtree is \"the tree formed by Node 5 and all nodes under it.\"

Figure 7-1 \u00a0 Parent Node, child Node, subtree

"},{"location":"chapter_tree/binary_tree/#711-common-terminology-of-binary-trees","title":"7.1.1 \u00a0 Common terminology of binary trees","text":"

The commonly used terminology of binary trees is shown in the following figure.

  • \"Root node\": The node at the top level of the binary tree, which has no parent node.
  • \"Leaf node\": A node with no children, both of its pointers point to None.
  • \"Edge\": The line segment connecting two nodes, i.e., node reference (pointer).
  • The \"level\" of a node: Incrementing from top to bottom, with the root node's level being 1.
  • The \"degree\" of a node: The number of a node's children. In a binary tree, the degree can be 0, 1, or 2.
  • The \"height\" of a binary tree: The number of edges passed from the root node to the farthest leaf node.
  • The \"depth\" of a node: The number of edges passed from the root node to the node.
  • The \"height\" of a node: The number of edges from the farthest leaf node to the node.

Figure 7-2 \u00a0 Common Terminology of Binary Trees

Tip

Please note that we usually define \"height\" and \"depth\" as \"the number of edges passed,\" but some problems or textbooks may define them as \"the number of nodes passed.\" In this case, both height and depth need to be incremented by 1.

"},{"location":"chapter_tree/binary_tree/#712-basic-operations-of-binary-trees","title":"7.1.2 \u00a0 Basic operations of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-initializing-a-binary-tree","title":"1. \u00a0 Initializing a binary tree","text":"

Similar to a linked list, initialize nodes first, then construct references (pointers).

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# Initializing a binary tree\n# Initializing nodes\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// Initializing nodes\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* Initializing a binary tree */\n// Initializing nodes\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// Linking references (pointers) between nodes\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// Initializing nodes\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* Initializing a binary tree */\n// Initializing nodes\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* Initializing a binary tree */\n// Initializing nodes\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// Initializing nodes\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// Linking references (pointers) between nodes\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* Initializing a binary tree */\n// Initializing nodes\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// Initializing nodes\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
\n
binary_tree.zig
\n
Code visualization

https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

"},{"location":"chapter_tree/binary_tree/#2-inserting-and-removing-nodes","title":"2. \u00a0 Inserting and removing nodes","text":"

Similar to a linked list, inserting and removing nodes in a binary tree can be achieved by modifying pointers. The Figure 7-3 provides an example.

Figure 7-3 \u00a0 Inserting and removing nodes in a binary tree

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# Inserting and removing nodes\np = TreeNode(0)\n# Inserting node P between n1 -> n2\nn1.left = p\np.left = n2\n# Removing node P\nn1.left = n2\n
binary_tree.cpp
/* Inserting and removing nodes */\nTreeNode* P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.cs
/* Inserting and removing nodes */\nTreeNode P = new(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.go
/* Inserting and removing nodes */\n// Inserting node P between n1 and n2\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// Removing node P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
binary_tree.js
/* Inserting and removing nodes */\nlet P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.ts
/* Inserting and removing nodes */\nconst P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.dart
/* Inserting and removing nodes */\nTreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// Inserting node P between n1 and n2\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// Removing node P\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* Inserting and removing nodes */\nTreeNode *P = newTreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
binary_tree.rb
\n
binary_tree.zig
\n
Code visualization

https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%E6%8F%92%E5%85%A5%E4%B8%8E%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%E5%9C%A8%20n1%20-%3E%20n2%20%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

Tip

It's important to note that inserting nodes may change the original logical structure of the binary tree, while removing nodes usually means removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a set of operations to achieve meaningful actions.

"},{"location":"chapter_tree/binary_tree/#713-common-types-of-binary-trees","title":"7.1.3 \u00a0 Common types of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-perfect-binary-tree","title":"1. \u00a0 Perfect binary tree","text":"

As shown in the Figure 7-4 , in a \"perfect binary tree,\" all levels of nodes are fully filled. In a perfect binary tree, the degree of leaf nodes is \\(0\\), and the degree of all other nodes is \\(2\\); if the tree's height is \\(h\\), then the total number of nodes is \\(2^{h+1} - 1\\), showing a standard exponential relationship, reflecting the common phenomenon of cell division in nature.

Tip

Please note that in the Chinese community, a perfect binary tree is often referred to as a \"full binary tree.\"

Figure 7-4 \u00a0 Perfect binary tree

"},{"location":"chapter_tree/binary_tree/#2-complete-binary-tree","title":"2. \u00a0 Complete binary tree","text":"

As shown in the Figure 7-5 , a \"complete binary tree\" has only the bottom level nodes not fully filled, and the bottom level nodes are filled as far left as possible.

Figure 7-5 \u00a0 Complete binary tree

"},{"location":"chapter_tree/binary_tree/#3-full-binary-tree","title":"3. \u00a0 Full binary tree","text":"

As shown in the Figure 7-6 , a \"full binary tree\" has all nodes except leaf nodes having two children.

Figure 7-6 \u00a0 Full binary tree

"},{"location":"chapter_tree/binary_tree/#4-balanced-binary-tree","title":"4. \u00a0 Balanced binary tree","text":"

As shown in the Figure 7-7 , in a \"balanced binary tree,\" the absolute difference in height between the left and right subtrees of any node does not exceed 1.

Figure 7-7 \u00a0 Balanced binary tree

"},{"location":"chapter_tree/binary_tree/#714-degeneration-of-binary-trees","title":"7.1.4 \u00a0 Degeneration of binary trees","text":"

The Figure 7-8 shows the ideal and degenerate structures of binary trees. When every level of a binary tree is filled, it reaches the \"perfect binary tree\"; when all nodes are biased towards one side, the binary tree degenerates into a \"linked list\".

  • The perfect binary tree is the ideal situation, fully leveraging the \"divide and conquer\" advantage of binary trees.
  • A linked list is another extreme, where operations become linear, degrading the time complexity to \\(O(n)\\).

Figure 7-8 \u00a0 The Best and Worst Structures of Binary Trees

As shown in the Table 7-1 , in the best and worst structures, the number of leaf nodes, total number of nodes, and height of the binary tree reach their maximum or minimum values.

Table 7-1 \u00a0 The Best and Worst Structures of Binary Trees

Perfect binary tree Linked list Number of nodes at level \\(i\\) \\(2^{i-1}\\) \\(1\\) Number of leaf nodes in a tree with height \\(h\\) \\(2^h\\) \\(1\\) Total number of nodes in a tree with height \\(h\\) \\(2^{h+1} - 1\\) \\(h + 1\\) Height of a tree with \\(n\\) total nodes \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 Binary tree traversal","text":"

From the perspective of physical structure, a tree is a data structure based on linked lists, hence its traversal method involves accessing nodes one by one through pointers. However, a tree is a non-linear data structure, which makes traversing a tree more complex than traversing a linked list, requiring the assistance of search algorithms to achieve.

Common traversal methods for binary trees include level-order traversal, preorder traversal, inorder traversal, and postorder traversal, among others.

"},{"location":"chapter_tree/binary_tree_traversal/#721-level-order-traversal","title":"7.2.1 \u00a0 Level-order traversal","text":"

As shown in the Figure 7-9 , \"level-order traversal\" traverses the binary tree from top to bottom, layer by layer, and accesses nodes in each layer in a left-to-right order.

Level-order traversal essentially belongs to \"breadth-first traversal\", also known as \"breadth-first search (BFS)\", which embodies a \"circumferentially outward expanding\" layer-by-layer traversal method.

Figure 7-9 \u00a0 Level-order traversal of a binary tree

"},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation","title":"1. \u00a0 Code implementation","text":"

Breadth-first traversal is usually implemented with the help of a \"queue\". The queue follows the \"first in, first out\" rule, while breadth-first traversal follows the \"layer-by-layer progression\" rule, the underlying ideas of the two are consistent. The implementation code is as follows:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
binary_tree_bfs.cpp
/* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
Code Visualization

Full Screen >

"},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"
  • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time, where \\(n\\) is the number of nodes.
  • Space complexity is \\(O(n)\\): In the worst case, i.e., a full binary tree, before traversing to the lowest level, the queue can contain at most \\((n + 1) / 2\\) nodes at the same time, occupying \\(O(n)\\) space.
"},{"location":"chapter_tree/binary_tree_traversal/#722-preorder-inorder-and-postorder-traversal","title":"7.2.2 \u00a0 Preorder, inorder, and postorder traversal","text":"

Correspondingly, preorder, inorder, and postorder traversal all belong to \"depth-first traversal\", also known as \"depth-first search (DFS)\", which embodies a \"proceed to the end first, then backtrack and continue\" traversal method.

The Figure 7-10 shows the working principle of performing a depth-first traversal on a binary tree. Depth-first traversal is like walking around the perimeter of the entire binary tree, encountering three positions at each node, corresponding to preorder traversal, inorder traversal, and postorder traversal.

Figure 7-10 \u00a0 Preorder, inorder, and postorder traversal of a binary search tree

"},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation_1","title":"1. \u00a0 Code implementation","text":"

Depth-first search is usually implemented based on recursion:

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
Code Visualization

Full Screen >

Tip

Depth-first search can also be implemented based on iteration, interested readers can study this on their own.

The Figure 7-11 shows the recursive process of preorder traversal of a binary tree, which can be divided into two opposite parts: \"recursion\" and \"return\".

  1. \"Recursion\" means starting a new method, the program accesses the next node in this process.
  2. \"Return\" means the function returns, indicating the current node has been fully accessed.
<1><2><3><4><5><6><7><8><9><10><11>

Figure 7-11 \u00a0 The recursive process of preorder traversal

"},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"
  • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time.
  • Space complexity is \\(O(n)\\): In the worst case, i.e., the tree degrades into a linked list, the recursion depth reaches \\(n\\), the system occupies \\(O(n)\\) stack frame space.
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 Summary","text":""},{"location":"chapter_tree/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
  • A binary tree is a non-linear data structure that reflects the \"divide and conquer\" logic of splitting one into two. Each binary tree node contains a value and two pointers, which point to its left and right child nodes, respectively.
  • For a node in a binary tree, the tree formed by its left (right) child node and all nodes under it is called the node's left (right) subtree.
  • Related terminology of binary trees includes root node, leaf node, level, degree, edge, height, and depth, among others.
  • The operations of initializing a binary tree, inserting nodes, and removing nodes are similar to those of linked list operations.
  • Common types of binary trees include perfect binary trees, complete binary trees, full binary trees, and balanced binary trees. The perfect binary tree represents the ideal state, while the linked list is the worst state after degradation.
  • A binary tree can be represented using an array by arranging the node values and empty slots in a level-order traversal sequence and implementing pointers based on the index mapping relationship between parent nodes and child nodes.
  • The level-order traversal of a binary tree is a breadth-first search method, which reflects a layer-by-layer traversal manner of \"expanding circle by circle.\" It is usually implemented using a queue.
  • Pre-order, in-order, and post-order traversals are all depth-first search methods, reflecting the traversal manner of \"going to the end first, then backtracking to continue.\" They are usually implemented using recursion.
  • A binary search tree is an efficient data structure for element searching, with the time complexity of search, insert, and remove operations all being \\(O(\\log n)\\). When a binary search tree degrades into a linked list, these time complexities deteriorate to \\(O(n)\\).
  • An AVL tree, also known as a balanced binary search tree, ensures that the tree remains balanced after continuous node insertions and removals through rotation operations.
  • Rotation operations in an AVL tree include right rotation, left rotation, right-then-left rotation, and left-then-right rotation. After inserting or removing nodes, an AVL tree performs rotation operations from bottom to top to rebalance the tree.
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q: For a binary tree with only one node, are both the height of the tree and the depth of the root node \\(0\\)?

Yes, because height and depth are typically defined as \"the number of edges passed.\"

Q: The insertion and removal in a binary tree are generally completed by a set of operations. What does \"a set of operations\" refer to here? Can it be understood as the release of resources of the child nodes?

Taking the binary search tree as an example, the operation of removing a node needs to be handled in three different scenarios, each requiring multiple steps of node operations.

Q: Why are there three sequences: pre-order, in-order, and post-order for DFS traversal of a binary tree, and what are their uses?

Similar to sequential and reverse traversal of arrays, pre-order, in-order, and post-order traversals are three methods of traversing a binary tree, allowing us to obtain a traversal result in a specific order. For example, in a binary search tree, since the node sizes satisfy left child node value < root node value < right child node value, we can obtain an ordered node sequence by traversing the tree in the \"left \u2192 root \u2192 right\" priority.

Q: In a right rotation operation that deals with the relationship between the imbalance nodes node, child, grand_child, isn't the connection between node and its parent node and the original link of node lost after the right rotation?

We need to view this problem from a recursive perspective. The right_rotate(root) operation passes the root node of the subtree and eventually returns the root node of the rotated subtree with return child. The connection between the subtree's root node and its parent node is established after this function returns, which is outside the scope of the right rotation operation's maintenance.

Q: In C++, functions are divided into private and public sections. What considerations are there for this? Why are the height() function and the updateHeight() function placed in public and private, respectively?

It depends on the scope of the method's use. If a method is only used within the class, then it is designed to be private. For example, it makes no sense for users to call updateHeight() on their own, as it is just a step in the insertion or removal operations. However, height() is for accessing node height, similar to vector.size(), thus it is set to public for use.

Q: How do you build a binary search tree from a set of input data? Is the choice of root node very important?

Yes, the method for building the tree is provided in the build_tree() method in the binary search tree code. As for the choice of the root node, we usually sort the input data and then select the middle element as the root node, recursively building the left and right subtrees. This approach maximizes the balance of the tree.

Q: In Java, do you always have to use the equals() method for string comparison?

In Java, for primitive data types, == is used to compare whether the values of two variables are equal. For reference types, the working principles of the two symbols are different.

  • ==: Used to compare whether two variables point to the same object, i.e., whether their positions in memory are the same.
  • equals(): Used to compare whether the values of two objects are equal.

Therefore, to compare values, we should use equals(). However, strings initialized with String a = \"hi\"; String b = \"hi\"; are stored in the string constant pool and point to the same object, so a == b can also be used to compare the contents of two strings.

Q: Before reaching the bottom level, is the number of nodes in the queue \\(2^h\\) in breadth-first traversal?

Yes, for example, a full binary tree with height \\(h = 2\\) has a total of \\(n = 7\\) nodes, then the bottom level has \\(4 = 2^h = (n + 1) / 2\\) nodes.

"}]} \ No newline at end of file diff --git a/en/sitemap.xml.gz b/en/sitemap.xml.gz index 96ec1d178574e2aea2ab103a27ac650448701737..b9b8a3bb7ae7734af57ca29fcfe1c9a442662416 100644 GIT binary patch delta 15 Wcmcc1a+ifozMF%ia>GWpa3%mLLIk`3 delta 15 Wcmcc1a+ifozMF$1ByJ;HI1>OS$^=CK diff --git a/search/search_index.json b/search/search_index.json index 6c3527931..56cbb2f42 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"chapter_appendix/","title":"\u7b2c 16 \u7ae0 \u00a0 \u9644\u5f55","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5
  • 16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c
  • 16.3 \u00a0 \u672f\u8bed\u8868
"},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

\u7531\u4e8e\u7b14\u8005\u80fd\u529b\u6709\u9650\uff0c\u4e66\u4e2d\u96be\u514d\u5b58\u5728\u4e00\u4e9b\u9057\u6f0f\u548c\u9519\u8bef\uff0c\u8bf7\u60a8\u8c05\u89e3\u3002\u5982\u679c\u60a8\u53d1\u73b0\u4e86\u7b14\u8bef\u3001\u94fe\u63a5\u5931\u6548\u3001\u5185\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u4e49\u3001\u89e3\u91ca\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7ed3\u6784\u4e0d\u5408\u7406\u7b49\u95ee\u9898\uff0c\u8bf7\u534f\u52a9\u6211\u4eec\u8fdb\u884c\u4fee\u6b63\uff0c\u4ee5\u7ed9\u8bfb\u8005\u63d0\u4f9b\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002

\u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c06\u5728\u672c\u4e66\u4ed3\u5e93\u3001\u7f51\u9875\u7248\u548c PDF \u7248\u7684\u4e3b\u9875\u4e0a\u8fdb\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\u3002

\u5f00\u6e90\u7684\u9b45\u529b

\u7eb8\u8d28\u56fe\u4e66\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u8f83\u4e45\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

\u800c\u5728\u672c\u5f00\u6e90\u4e66\u4e2d\uff0c\u5185\u5bb9\u66f4\u8fed\u7684\u65f6\u95f4\u88ab\u7f29\u77ed\u81f3\u6570\u65e5\u751a\u81f3\u51e0\u4e2a\u5c0f\u65f6\u3002

"},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

\u5982\u56fe 16-3 \u6240\u793a\uff0c\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7f16\u8f91\u56fe\u6807\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\u3002

  1. \u70b9\u51fb\u201c\u7f16\u8f91\u56fe\u6807\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\u3002
  2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u68c0\u67e5\u5185\u5bb9\u7684\u6b63\u786e\u6027\uff0c\u5e76\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\u3002
  3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\u3002\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

\u56fe 16-3 \u00a0 \u9875\u9762\u7f16\u8f91\u6309\u952e

\u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

"},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5185\u5bb9\u521b\u4f5c","text":"

\u5982\u679c\u60a8\u6709\u5174\u8da3\u53c2\u4e0e\u6b64\u5f00\u6e90\u9879\u76ee\uff0c\u5305\u62ec\u5c06\u4ee3\u7801\u7ffb\u8bd1\u6210\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u3001\u6269\u5c55\u6587\u7ae0\u5185\u5bb9\u7b49\uff0c\u90a3\u4e48\u9700\u8981\u5b9e\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

  1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4e66\u7684\u4ee3\u7801\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\u3002
  2. \u8fdb\u5165\u60a8\u7684 Fork \u4ed3\u5e93\u7f51\u9875\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c06\u4ed3\u5e93\u514b\u9686\u81f3\u672c\u5730\u3002
  3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u8fdb\u884c\u5b8c\u6574\u6d4b\u8bd5\uff0c\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\u3002
  4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\u3002
  5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002
"},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

\u5728 hello-algo \u6839\u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u4ee5\u4e0b Docker \u811a\u672c\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8bbf\u95ee\u672c\u9879\u76ee\uff1a

docker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\uff1a

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88c5 IDE","text":"

\u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u3001\u8f7b\u91cf\u7684 VS Code \u4f5c\u4e3a\u672c\u5730\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\u3002\u8bbf\u95ee VS Code \u5b98\u7f51\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u76f8\u5e94\u7248\u672c\u7684 VS Code \u8fdb\u884c\u4e0b\u8f7d\u548c\u5b89\u88c5\u3002

\u56fe 16-1 \u00a0 \u4ece\u5b98\u7f51\u4e0b\u8f7d VS Code

VS Code \u62e5\u6709\u5f3a\u5927\u7684\u6269\u5c55\u5305\u751f\u6001\u7cfb\u7edf\uff0c\u652f\u6301\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u7684\u8fd0\u884c\u548c\u8c03\u8bd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5b89\u88c5\u201cPython Extension Pack\u201d\u6269\u5c55\u5305\u4e4b\u540e\uff0c\u5373\u53ef\u8fdb\u884c Python \u4ee3\u7801\u8c03\u8bd5\u3002\u5b89\u88c5\u6b65\u9aa4\u5982\u56fe 16-2 \u6240\u793a\u3002

\u56fe 16-2 \u00a0 \u5b89\u88c5 VS Code \u6269\u5c55\u5305

"},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88c5\u8bed\u8a00\u73af\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88c5 Python Extension Pack \u3002
  3. \uff08\u53ef\u9009\uff09\u5728\u547d\u4ee4\u884c\u8f93\u5165 pip install black \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u73af\u5883","text":"
  1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e26 Clang \uff0c\u65e0\u987b\u5b89\u88c5\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88c5 C/C++ Extension Pack \u3002
  3. \uff08\u53ef\u9009\uff09\u6253\u5f00 Settings \u9875\u9762\uff0c\u641c\u7d22 Clang_format_fallback Style \u4ee3\u7801\u683c\u5f0f\u5316\u9009\u9879\uff0c\u8bbe\u7f6e\u4e3a { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
"},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 8.0 \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88c5 C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
  3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88c5\u6559\u7a0b\uff09\u3002
"},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
  3. \u6309\u5feb\u6377\u952e Ctrl + Shift + P \u547c\u51fa\u547d\u4ee4\u680f\uff0c\u8f93\u5165 go \uff0c\u9009\u62e9 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9009\u5e76\u5b89\u88c5\u5373\u53ef\u3002
"},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code \u3002
"},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Node.js \u3002
  2. \uff08\u53ef\u9009\uff09\u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u73af\u5883","text":"
  1. \u540c JavaScript \u73af\u5883\u5b89\u88c5\u6b65\u9aa4\u3002
  2. \u5b89\u88c5 TypeScript Execute (tsx) \u3002
  3. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88c5 Pretty TypeScript Errors \u3002
"},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Dart \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88c5 Dart \u3002
"},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer \u3002
"},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u672f\u8bed\u8868","text":"

\u8868 16-1 \u5217\u51fa\u4e86\u4e66\u4e2d\u51fa\u73b0\u7684\u91cd\u8981\u672f\u8bed\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u3002

  • \u5efa\u8bae\u8bb0\u4f4f\u540d\u8bcd\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u9605\u8bfb\u82f1\u6587\u6587\u732e\u3002
  • \u90e8\u5206\u540d\u8bcd\u5728\u7b80\u4f53\u4e2d\u6587\u548c\u7e41\u4f53\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

\u8868 16-1 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8bcd

English \u7b80\u4f53\u4e2d\u6587 \u7e41\u4f53\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 hash set \u54c8\u5e0c\u96c6\u5408 \u96dc\u6e4a\u96c6\u5408 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868","text":"

Abstract

\u6570\u636e\u7ed3\u6784\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5b9e\u7684\u7816\u5899\u3002

\u6570\u7ec4\u7684\u7816\u5757\u6574\u9f50\u6392\u5217\uff0c\u9010\u4e2a\u7d27\u8d34\u3002\u94fe\u8868\u7684\u7816\u5757\u5206\u6563\u5404\u5904\uff0c\u8fde\u63a5\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u4e8e\u7816\u7f1d\u4e4b\u95f4\u3002

"},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 4.1 \u00a0 \u6570\u7ec4
  • 4.2 \u00a0 \u94fe\u8868
  • 4.3 \u00a0 \u5217\u8868
  • 4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *
  • 4.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u6570\u7ec4","text":"

\u6570\u7ec4\uff08array\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u6211\u4eec\u5c06\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u4f4d\u7f6e\u79f0\u4e3a\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u56fe 4-1 \u5c55\u793a\u4e86\u6570\u7ec4\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5b58\u50a8\u65b9\u5f0f\u3002

\u56fe 4-1 \u00a0 \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u6570\u7ec4","text":"

\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u7528\u6570\u7ec4\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u65e0\u521d\u59cb\u503c\u3001\u7ed9\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4f1a\u5c06\u6570\u7ec4\u5143\u7d20\u521d\u59cb\u5316\u4e3a \\(0\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
# \u521d\u59cb\u5316\u6570\u7ec4\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
array.cpp
/* \u521d\u59cb\u5316\u6570\u7ec4 */\n// \u5b58\u50a8\u5728\u6808\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5b58\u50a8\u5728\u5806\u4e0a\uff08\u9700\u8981\u624b\u52a8\u91ca\u653e\u7a7a\u95f4\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[5]int\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[]int\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Go \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u6570\u7ec4\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
array.rb
# \u521d\u59cb\u5316\u6570\u7ec4\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
array.zig
// \u521d\u59cb\u5316\u6570\u7ec4\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

\u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u56fe 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u8be5\u5143\u7d20\u3002

\u56fe 4-2 \u00a0 \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

\u89c2\u5bdf\u56fe 4-2 \uff0c\u6211\u4eec\u53d1\u73b0\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u4e3a \\(0\\) \uff0c\u8fd9\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\u4f1a\u66f4\u81ea\u7136\u3002\u4f46\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u662f\u5185\u5b58\u5730\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u4e3a \\(0\\) \u662f\u5408\u7406\u7684\u3002

\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

\u6570\u7ec4\u5143\u7d20\u5728\u5185\u5b58\u4e2d\u662f\u201c\u7d27\u6328\u7740\u7684\u201d\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u7a7a\u95f4\u518d\u5b58\u653e\u4efb\u4f55\u6570\u636e\u3002\u5982\u56fe 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u5219\u9700\u8981\u5c06\u8be5\u5143\u7d20\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u4e4b\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

\u56fe 4-3 \u00a0 \u6570\u7ec4\u63d2\u5165\u5143\u7d20\u793a\u4f8b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u4f1a\u5bfc\u81f4\u6570\u7ec4\u5c3e\u90e8\u5143\u7d20\u201c\u4e22\u5931\u201d\u3002\u6211\u4eec\u5c06\u8fd9\u4e2a\u95ee\u9898\u7684\u89e3\u51b3\u65b9\u6848\u7559\u5728\u201c\u5217\u8868\u201d\u7ae0\u8282\u4e2d\u8ba8\u8bba\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u5220\u9664\u5143\u7d20","text":"

\u540c\u7406\uff0c\u5982\u56fe 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u5220\u9664\u7d22\u5f15 \\(i\\) \u5904\u7684\u5143\u7d20\uff0c\u5219\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\u3002

\u56fe 4-4 \u00a0 \u6570\u7ec4\u5220\u9664\u5143\u7d20\u793a\u4f8b

\u8bf7\u6ce8\u610f\uff0c\u5220\u9664\u5143\u7d20\u5b8c\u6210\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u987b\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u7684\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\uff1a\u6570\u7ec4\u7684\u63d2\u5165\u548c\u5220\u9664\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\u3002
  • \u4e22\u5931\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u540e\uff0c\u8d85\u51fa\u6570\u7ec4\u957f\u5ea6\u8303\u56f4\u7684\u5143\u7d20\u4f1a\u4e22\u5931\u3002
  • \u5185\u5b58\u6d6a\u8d39\uff1a\u6211\u4eec\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e2a\u6bd4\u8f83\u957f\u7684\u6570\u7ec4\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u8fd9\u6837\u5728\u63d2\u5165\u6570\u636e\u65f6\uff0c\u4e22\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u65e0\u610f\u4e49\u201d\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
"},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u904d\u5386\u6570\u7ec4","text":"

\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e2\u53ef\u4ee5\u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u627e\u5143\u7d20","text":"

\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u9700\u8981\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u5224\u65ad\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5219\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

\u56e0\u4e3a\u6570\u7ec4\u662f\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u627e\u64cd\u4f5c\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u67e5\u627e\u201d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u6269\u5bb9\u6570\u7ec4","text":"

\u5728\u590d\u6742\u7684\u7cfb\u7edf\u73af\u5883\u4e2d\uff0c\u7a0b\u5e8f\u96be\u4ee5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u4ece\u800c\u65e0\u6cd5\u5b89\u5168\u5730\u6269\u5c55\u6570\u7ec4\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u4e0d\u53ef\u53d8\u7684\u3002

\u5982\u679c\u6211\u4eec\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u590d\u5236\u5230\u65b0\u6570\u7ec4\u3002\u8fd9\u662f\u4e00\u4e2a \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u8017\u65f6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
array.cpp
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.java
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.go
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.swift
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.js
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.ts
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.dart
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
array.rs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
array.c
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.kt
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.rb
### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
array.zig
// \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u6570\u7ec4\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u4e14\u5143\u7d20\u7c7b\u578b\u76f8\u540c\u3002\u8fd9\u79cd\u505a\u6cd5\u5305\u542b\u4e30\u5bcc\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u7cfb\u7edf\u53ef\u4ee5\u5229\u7528\u8fd9\u4e9b\u4fe1\u606f\u6765\u4f18\u5316\u6570\u636e\u7ed3\u6784\u7684\u64cd\u4f5c\u6548\u7387\u3002

  • \u7a7a\u95f4\u6548\u7387\u9ad8\uff1a\u6570\u7ec4\u4e3a\u6570\u636e\u5206\u914d\u4e86\u8fde\u7eed\u7684\u5185\u5b58\u5757\uff0c\u65e0\u987b\u989d\u5916\u7684\u7ed3\u6784\u5f00\u9500\u3002
  • \u652f\u6301\u968f\u673a\u8bbf\u95ee\uff1a\u6570\u7ec4\u5141\u8bb8\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u4efb\u4f55\u5143\u7d20\u3002
  • \u7f13\u5b58\u5c40\u90e8\u6027\uff1a\u5f53\u8bbf\u95ee\u6570\u7ec4\u5143\u7d20\u65f6\uff0c\u8ba1\u7b97\u673a\u4e0d\u4ec5\u4f1a\u52a0\u8f7d\u5b83\uff0c\u8fd8\u4f1a\u7f13\u5b58\u5176\u5468\u56f4\u7684\u5176\u4ed6\u6570\u636e\uff0c\u4ece\u800c\u501f\u52a9\u9ad8\u901f\u7f13\u5b58\u6765\u63d0\u5347\u540e\u7eed\u64cd\u4f5c\u7684\u6267\u884c\u901f\u5ea6\u3002

\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u662f\u4e00\u628a\u53cc\u5203\u5251\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

  • \u63d2\u5165\u4e0e\u5220\u9664\u6548\u7387\u4f4e\uff1a\u5f53\u6570\u7ec4\u4e2d\u5143\u7d20\u8f83\u591a\u65f6\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52a8\u5927\u91cf\u7684\u5143\u7d20\u3002
  • \u957f\u5ea6\u4e0d\u53ef\u53d8\uff1a\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u6269\u5bb9\u6570\u7ec4\u9700\u8981\u5c06\u6240\u6709\u6570\u636e\u590d\u5236\u5230\u65b0\u6570\u7ec4\uff0c\u5f00\u9500\u5f88\u5927\u3002
  • \u7a7a\u95f4\u6d6a\u8d39\uff1a\u5982\u679c\u6570\u7ec4\u5206\u914d\u7684\u5927\u5c0f\u8d85\u8fc7\u5b9e\u9645\u6240\u9700\uff0c\u90a3\u4e48\u591a\u4f59\u7684\u7a7a\u95f4\u5c31\u88ab\u6d6a\u8d39\u4e86\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

\u6570\u7ec4\u662f\u4e00\u79cd\u57fa\u7840\u4e14\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\uff0c\u65e2\u9891\u7e41\u5e94\u7528\u5728\u5404\u7c7b\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u4e8e\u5b9e\u73b0\u5404\u79cd\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002

  • \u968f\u673a\u8bbf\u95ee\uff1a\u5982\u679c\u6211\u4eec\u60f3\u968f\u673a\u62bd\u53d6\u4e00\u4e9b\u6837\u672c\uff0c\u90a3\u4e48\u53ef\u4ee5\u7528\u6570\u7ec4\u5b58\u50a8\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u968f\u673a\u5e8f\u5217\uff0c\u6839\u636e\u7d22\u5f15\u5b9e\u73b0\u968f\u673a\u62bd\u6837\u3002
  • \u6392\u5e8f\u548c\u641c\u7d22\uff1a\u6570\u7ec4\u662f\u6392\u5e8f\u548c\u641c\u7d22\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u4e8c\u5206\u67e5\u627e\u7b49\u90fd\u4e3b\u8981\u5728\u6570\u7ec4\u4e0a\u8fdb\u884c\u3002
  • \u67e5\u627e\u8868\uff1a\u5f53\u9700\u8981\u5feb\u901f\u67e5\u627e\u4e00\u4e2a\u5143\u7d20\u6216\u5176\u5bf9\u5e94\u5173\u7cfb\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u4f5c\u4e3a\u67e5\u627e\u8868\u3002\u5047\u5982\u6211\u4eec\u60f3\u5b9e\u73b0\u5b57\u7b26\u5230 ASCII \u7801\u7684\u6620\u5c04\uff0c\u5219\u53ef\u4ee5\u5c06\u5b57\u7b26\u7684 ASCII \u7801\u503c\u4f5c\u4e3a\u7d22\u5f15\uff0c\u5bf9\u5e94\u7684\u5143\u7d20\u5b58\u653e\u5728\u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u4f4d\u7f6e\u3002
  • \u673a\u5668\u5b66\u4e60\uff1a\u795e\u7ecf\u7f51\u7edc\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9635\u3001\u5f20\u91cf\u4e4b\u95f4\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\uff0c\u8fd9\u4e9b\u6570\u636e\u90fd\u662f\u4ee5\u6570\u7ec4\u7684\u5f62\u5f0f\u6784\u5efa\u7684\u3002\u6570\u7ec4\u662f\u795e\u7ecf\u7f51\u7edc\u7f16\u7a0b\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff1a\u6570\u7ec4\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002\u4f8b\u5982\uff0c\u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\u3002
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u94fe\u8868","text":"

\u5185\u5b58\u7a7a\u95f4\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u516c\u5171\u8d44\u6e90\uff0c\u5728\u4e00\u4e2a\u590d\u6742\u7684\u7cfb\u7edf\u8fd0\u884c\u73af\u5883\u4e0b\uff0c\u7a7a\u95f2\u7684\u5185\u5b58\u7a7a\u95f4\u53ef\u80fd\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u6211\u4eec\u77e5\u9053\uff0c\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6570\u7ec4\u975e\u5e38\u5927\u65f6\uff0c\u5185\u5b58\u53ef\u80fd\u65e0\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u6b64\u65f6\u94fe\u8868\u7684\u7075\u6d3b\u6027\u4f18\u52bf\u5c31\u4f53\u73b0\u51fa\u6765\u4e86\u3002

\u94fe\u8868\uff08linked list\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u901a\u8fc7\u201c\u5f15\u7528\u201d\u76f8\u8fde\u63a5\u3002\u5f15\u7528\u8bb0\u5f55\u4e86\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u901a\u8fc7\u5b83\u53ef\u4ee5\u4ece\u5f53\u524d\u8282\u70b9\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002

\u94fe\u8868\u7684\u8bbe\u8ba1\u4f7f\u5f97\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

\u56fe 4-5 \u00a0 \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

\u89c2\u5bdf\u56fe 4-5 \uff0c\u94fe\u8868\u7684\u7ec4\u6210\u5355\u4f4d\u662f\u8282\u70b9\uff08node\uff09\u5bf9\u8c61\u3002\u6bcf\u4e2a\u8282\u70b9\u90fd\u5305\u542b\u4e24\u9879\u6570\u636e\uff1a\u8282\u70b9\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u201c\u5f15\u7528\u201d\u3002

  • \u94fe\u8868\u7684\u9996\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5934\u8282\u70b9\u201d\uff0c\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5c3e\u8282\u70b9\u201d\u3002
  • \u5c3e\u8282\u70b9\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u522b\u88ab\u8bb0\u4e3a null\u3001nullptr \u548c None \u3002
  • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u9488\u7684\u8bed\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u5e94\u88ab\u66ff\u6362\u4e3a\u201c\u6307\u9488\u201d\u3002

\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u94fe\u8868\u8282\u70b9 ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u4e00\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u6570\u636e\u91cf\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u8282\u70b9\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  //\u6784\u9020\u51fd\u6570\n    int val = x;         // \u8282\u70b9\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\n    Val  int       // \u8282\u70b9\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u6784\u9020\u51fd\u6570\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u94fe\u8868\u8282\u70b9\u7c7b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u8282\u70b9\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\n}\n
# \u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val  # \u8282\u70b9\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
// \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u94fe\u8868","text":"

\u5efa\u7acb\u94fe\u8868\u5206\u4e3a\u4e24\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u7b2c\u4e8c\u6b65\u662f\u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\u5173\u7cfb\u3002\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u901a\u8fc7\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
# \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rb
# \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.zig
// \u521d\u59cb\u5316\u94fe\u8868\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6570\u7ec4\u6574\u4f53\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u6bd4\u5982\u6570\u7ec4 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u72ec\u7acb\u7684\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\u7684\u3002\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u6bd4\u5982\u4ee5\u4e0a\u4ee3\u7801\u4e2d\u7684\u94fe\u8868\u53ef\u8bb0\u4f5c\u94fe\u8868 n0 \u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u8282\u70b9\u975e\u5e38\u5bb9\u6613\u3002\u5982\u56fe 4-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u5728\u76f8\u90bb\u7684\u4e24\u4e2a\u8282\u70b9 n0 \u548c n1 \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u5219\u53ea\u9700\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u6570\u7ec4\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u6548\u7387\u8f83\u4f4e\u3002

\u56fe 4-6 \u00a0 \u94fe\u8868\u63d2\u5165\u8282\u70b9\u793a\u4f8b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u5982\u56fe 4-7 \u6240\u793a\uff0c\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u3002

\u8bf7\u6ce8\u610f\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a\u904d\u5386\u6b64\u94fe\u8868\u5df2\u7ecf\u65e0\u6cd5\u8bbf\u95ee\u5230 P \uff0c\u8fd9\u610f\u5473\u7740 P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u8be5\u94fe\u8868\u4e86\u3002

\u56fe 4-7 \u00a0 \u94fe\u8868\u5220\u9664\u8282\u70b9

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
linked_list.kt
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8bbf\u95ee\u8282\u70b9","text":"

\u5728\u94fe\u8868\u4e2d\u8bbf\u95ee\u8282\u70b9\u7684\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u4e00\u8282\u6240\u8ff0\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u7a0b\u5e8f\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8bbf\u95ee\u94fe\u8868\u7684\u7b2c \\(i\\) \u4e2a\u8282\u70b9\u9700\u8981\u5faa\u73af \\(i - 1\\) \u8f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

\u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u5176\u4e2d\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8be5\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u8fc7\u7a0b\u4e5f\u5c5e\u4e8e\u7ebf\u6027\u67e5\u627e\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u6570\u7ec4 vs. \u94fe\u8868","text":"

\u8868 4-1 \u603b\u7ed3\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u7684\u5404\u9879\u7279\u70b9\u5e76\u5bf9\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u4e8e\u5b83\u4eec\u91c7\u7528\u4e24\u79cd\u76f8\u53cd\u7684\u5b58\u50a8\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u79cd\u6027\u8d28\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73b0\u5bf9\u7acb\u7684\u7279\u70b9\u3002

\u8868 4-1 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u6548\u7387\u5bf9\u6bd4

\u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u5206\u6563\u5185\u5b58\u7a7a\u95f4 \u5bb9\u91cf\u6269\u5c55 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u53ef\u7075\u6d3b\u6269\u5c55 \u5185\u5b58\u6548\u7387 \u5143\u7d20\u5360\u7528\u5185\u5b58\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8d39\u7a7a\u95f4 \u5143\u7d20\u5360\u7528\u5185\u5b58\u591a \u8bbf\u95ee\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

\u5982\u56fe 4-8 \u6240\u793a\uff0c\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u4e09\u79cd\u3002

  • \u5355\u5411\u94fe\u8868\uff1a\u5373\u524d\u9762\u4ecb\u7ecd\u7684\u666e\u901a\u94fe\u8868\u3002\u5355\u5411\u94fe\u8868\u7684\u8282\u70b9\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\u4e24\u9879\u6570\u636e\u3002\u6211\u4eec\u5c06\u9996\u4e2a\u8282\u70b9\u79f0\u4e3a\u5934\u8282\u70b9\uff0c\u5c06\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411\u7a7a None \u3002
  • \u73af\u5f62\u94fe\u8868\uff1a\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5219\u5f97\u5230\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\u3002\u5728\u73af\u5f62\u94fe\u8868\u4e2d\uff0c\u4efb\u610f\u8282\u70b9\u90fd\u53ef\u4ee5\u89c6\u4f5c\u5934\u8282\u70b9\u3002
  • \u53cc\u5411\u94fe\u8868\uff1a\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u5f15\u7528\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u4e2a\u8282\u70b9\uff09\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u76f8\u8f83\u4e8e\u5355\u5411\u94fe\u8868\uff0c\u53cc\u5411\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u4e24\u4e2a\u65b9\u5411\u904d\u5386\u94fe\u8868\uff0c\u4f46\u76f8\u5e94\u5730\u4e5f\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    ListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  // \u6784\u9020\u51fd\u6570\n    int val = x;    // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\n    Val  int             // \u8282\u70b9\u503c\n    Next *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u6784\u9020\u51fd\u6570\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\u578b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u8282\u70b9\u503c\n    val next: ListNode? = null  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
# \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :next   # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

\u56fe 4-8 \u00a0 \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u94fe\u8868\u5178\u578b\u5e94\u7528","text":"

\u5355\u5411\u94fe\u8868\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u548c\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002

  • \u6808\u4e0e\u961f\u5217\uff1a\u5f53\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u90fd\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\u65f6\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u540e\u51fa\uff0c\u5bf9\u5e94\u6808\uff1b\u5f53\u63d2\u5165\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\uff0c\u5220\u9664\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u53e6\u4e00\u7aef\u8fdb\u884c\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u5148\u51fa\uff0c\u5bf9\u5e94\u961f\u5217\u3002
  • \u54c8\u5e0c\u8868\uff1a\u94fe\u5f0f\u5730\u5740\u662f\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8be5\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u51b2\u7a81\u7684\u5143\u7d20\u90fd\u4f1a\u88ab\u653e\u5230\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002
  • \u56fe\uff1a\u90bb\u63a5\u8868\u662f\u8868\u793a\u56fe\u7684\u4e00\u79cd\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u90fd\u4e0e\u4e00\u4e2a\u94fe\u8868\u76f8\u5173\u8054\uff0c\u94fe\u8868\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u4ee3\u8868\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u5176\u4ed6\u9876\u70b9\u3002

\u53cc\u5411\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5feb\u901f\u67e5\u627e\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u573a\u666f\u3002

  • \u9ad8\u7ea7\u6570\u636e\u7ed3\u6784\uff1a\u6bd4\u5982\u5728\u7ea2\u9ed1\u6811\u3001B \u6811\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5728\u8282\u70b9\u4e2d\u4fdd\u5b58\u4e00\u4e2a\u6307\u5411\u7236\u8282\u70b9\u7684\u5f15\u7528\u6765\u5b9e\u73b0\uff0c\u7c7b\u4f3c\u4e8e\u53cc\u5411\u94fe\u8868\u3002
  • \u6d4f\u89c8\u5668\u5386\u53f2\uff1a\u5728\u7f51\u9875\u6d4f\u89c8\u5668\u4e2d\uff0c\u5f53\u7528\u6237\u70b9\u51fb\u524d\u8fdb\u6216\u540e\u9000\u6309\u94ae\u65f6\uff0c\u6d4f\u89c8\u5668\u9700\u8981\u77e5\u9053\u7528\u6237\u8bbf\u95ee\u8fc7\u7684\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u7f51\u9875\u3002\u53cc\u5411\u94fe\u8868\u7684\u7279\u6027\u4f7f\u5f97\u8fd9\u79cd\u64cd\u4f5c\u53d8\u5f97\u7b80\u5355\u3002
  • LRU \u7b97\u6cd5\uff1a\u5728\u7f13\u5b58\u6dd8\u6c70\uff08LRU\uff09\u7b97\u6cd5\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u3002\u8fd9\u65f6\u5019\u4f7f\u7528\u53cc\u5411\u94fe\u8868\u5c31\u975e\u5e38\u5408\u9002\u3002

\u73af\u5f62\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5468\u671f\u6027\u64cd\u4f5c\u7684\u573a\u666f\uff0c\u6bd4\u5982\u64cd\u4f5c\u7cfb\u7edf\u7684\u8d44\u6e90\u8c03\u5ea6\u3002

  • \u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\uff1a\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\u662f\u4e00\u79cd\u5e38\u89c1\u7684 CPU \u8c03\u5ea6\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5bf9\u4e00\u7ec4\u8fdb\u7a0b\u8fdb\u884c\u5faa\u73af\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u88ab\u8d4b\u4e88\u4e00\u4e2a\u65f6\u95f4\u7247\uff0c\u5f53\u65f6\u95f4\u7247\u7528\u5b8c\u65f6\uff0cCPU \u5c06\u5207\u6362\u5230\u4e0b\u4e00\u4e2a\u8fdb\u7a0b\u3002\u8fd9\u79cd\u5faa\u73af\u64cd\u4f5c\u53ef\u4ee5\u901a\u8fc7\u73af\u5f62\u94fe\u8868\u6765\u5b9e\u73b0\u3002
  • \u6570\u636e\u7f13\u51b2\u533a\uff1a\u5728\u67d0\u4e9b\u6570\u636e\u7f13\u51b2\u533a\u7684\u5b9e\u73b0\u4e2d\uff0c\u4e5f\u53ef\u80fd\u4f1a\u4f7f\u7528\u73af\u5f62\u94fe\u8868\u3002\u6bd4\u5982\u5728\u97f3\u9891\u3001\u89c6\u9891\u64ad\u653e\u5668\u4e2d\uff0c\u6570\u636e\u6d41\u53ef\u80fd\u4f1a\u88ab\u5206\u6210\u591a\u4e2a\u7f13\u51b2\u5757\u5e76\u653e\u5165\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\uff0c\u4ee5\u4fbf\u5b9e\u73b0\u65e0\u7f1d\u64ad\u653e\u3002
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u5217\u8868","text":"

\u5217\u8868\uff08list\uff09\u662f\u4e00\u4e2a\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8bbf\u95ee\u3001\u4fee\u6539\u3001\u6dfb\u52a0\u3001\u5220\u9664\u548c\u904d\u5386\u7b49\u64cd\u4f5c\uff0c\u65e0\u987b\u4f7f\u7528\u8005\u8003\u8651\u5bb9\u91cf\u9650\u5236\u7684\u95ee\u9898\u3002\u5217\u8868\u53ef\u4ee5\u57fa\u4e8e\u94fe\u8868\u6216\u6570\u7ec4\u5b9e\u73b0\u3002

  • \u94fe\u8868\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u5217\u8868\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\u64cd\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u7075\u6d3b\u52a8\u6001\u6269\u5bb9\u3002
  • \u6570\u7ec4\u4e5f\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\uff0c\u4f46\u7531\u4e8e\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u4e2a\u5177\u6709\u957f\u5ea6\u9650\u5236\u7684\u5217\u8868\u3002

\u5f53\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u5217\u8868\u65f6\uff0c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6027\u8d28\u4f1a\u5bfc\u81f4\u5217\u8868\u7684\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u65e0\u6cd5\u4e8b\u5148\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u4ece\u800c\u96be\u4ee5\u9009\u62e9\u5408\u9002\u7684\u5217\u8868\u957f\u5ea6\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u5219\u5f88\u53ef\u80fd\u65e0\u6cd5\u6ee1\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff08dynamic array\uff09\u6765\u5b9e\u73b0\u5217\u8868\u3002\u5b83\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u5404\u9879\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u52a8\u6001\u6269\u5bb9\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u6807\u51c6\u5e93\u63d0\u4f9b\u7684\u5217\u8868\u662f\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u6765\u7684\u8ba8\u8bba\u4e2d\uff0c\u6211\u4eec\u5c06\u628a\u201c\u5217\u8868\u201d\u548c\u201c\u52a8\u6001\u6570\u7ec4\u201d\u89c6\u4e3a\u7b49\u540c\u7684\u6982\u5ff5\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u5217\u8868","text":"

\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u8fd9\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u65e0\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u6570\u7ec4\u7684\u5143\u7d20\u7c7b\u578b\u9700\u4e3a int[] \u7684\u5305\u88c5\u7c7b Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
list.rb
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u5217\u8868\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

\u5217\u8868\u672c\u8d28\u4e0a\u662f\u6570\u7ec4\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u8bbf\u95ee\u5143\u7d20\nnum: int = nums[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cpp
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.java
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cs
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list_test.go
/* \u8bbf\u95ee\u5143\u7d20 */\nnum := nums[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.swift
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num = nums[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.js
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.ts
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.dart
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.rs
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u8bbf\u95ee\u5143\u7d20 */\nval num = nums[1]       // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.rb
# \u8bbf\u95ee\u5143\u7d20\nnum = nums[1] # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.zig
// \u8bbf\u95ee\u5143\u7d20\nvar num = nums.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u5143\u7d20","text":"

\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5730\u6dfb\u52a0\u4e0e\u5220\u9664\u5143\u7d20\u3002\u5728\u5217\u8868\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u4e0e\u6570\u7ec4\u76f8\u540c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6e05\u7a7a\u5217\u8868\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.java
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cs
/* \u6e05\u7a7a\u5217\u8868 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u5217\u8868 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.swift
/* \u6e05\u7a7a\u5217\u8868 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.ts
/* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.dart
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.rs
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);    // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.rb
# \u6e05\u7a7a\u5217\u8868\nnums.clear\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.delete_at(3) # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u5217\u8868\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n// \u5220\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u904d\u5386\u5217\u8868","text":"

\u4e0e\u6570\u7ec4\u4e00\u6837\uff0c\u5217\u8868\u53ef\u4ee5\u6839\u636e\u7d22\u5f15\u904d\u5386\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u5404\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\nfor num in nums:\n    count += num\n
list.cpp
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
list.rb
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
list.zig
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u5217\u8868","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 nums1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.cpp
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.cs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list_test.go
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.swift
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.js
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.ts
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.dart
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.rs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.rb
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
list.zig
// \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u5217\u8868","text":"

\u5b8c\u6210\u5217\u8868\u6392\u5e8f\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u6570\u7ec4\u7c7b\u7b97\u6cd5\u9898\u4e2d\u7ecf\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u548c\u201c\u53cc\u6307\u9488\u201d\u7b97\u6cd5\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6392\u5e8f\u5217\u8868\nnums.sort()  # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u5217\u8868 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.java
/* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(nums);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cs
/* \u6392\u5e8f\u5217\u8868 */\nnums.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list_test.go
/* \u6392\u5e8f\u5217\u8868 */\nsort.Ints(nums)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.ts
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.dart
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.rs
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.rb
# \u6392\u5e8f\u5217\u8868\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.zig
// \u6392\u5e8f\u5217\u8868\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u5217\u8868\u5b9e\u73b0","text":"

\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u4e86\u5217\u8868\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u6bd4\u8f83\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u6269\u5bb9\u500d\u6570\u7b49\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u6e90\u7801\u8fdb\u884c\u5b66\u4e60\u3002

\u4e3a\u4e86\u52a0\u6df1\u5bf9\u5217\u8868\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5c1d\u8bd5\u5b9e\u73b0\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u4e2a\u91cd\u70b9\u8bbe\u8ba1\u3002

  • \u521d\u59cb\u5bb9\u91cf\uff1a\u9009\u53d6\u4e00\u4e2a\u5408\u7406\u7684\u6570\u7ec4\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u9009\u62e9 10 \u4f5c\u4e3a\u521d\u59cb\u5bb9\u91cf\u3002
  • \u6570\u91cf\u8bb0\u5f55\uff1a\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf size \uff0c\u7528\u4e8e\u8bb0\u5f55\u5217\u8868\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff0c\u5e76\u968f\u7740\u5143\u7d20\u63d2\u5165\u548c\u5220\u9664\u5b9e\u65f6\u66f4\u65b0\u3002\u6839\u636e\u6b64\u53d8\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u4f4d\u5217\u8868\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65ad\u662f\u5426\u9700\u8981\u6269\u5bb9\u3002
  • \u6269\u5bb9\u673a\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u65f6\u5217\u8868\u5bb9\u91cf\u5df2\u6ee1\uff0c\u5219\u9700\u8981\u8fdb\u884c\u6269\u5bb9\u3002\u5148\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u518d\u5c06\u5f53\u524d\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52a8\u81f3\u65b0\u6570\u7ec4\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u89c4\u5b9a\u6bcf\u6b21\u5c06\u6570\u7ec4\u6269\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *","text":"

\u5728\u672c\u7ae0\u7684\u524d\u4e24\u8282\u4e2d\uff0c\u6211\u4eec\u63a2\u8ba8\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u8fd9\u4e24\u79cd\u57fa\u7840\u4e14\u91cd\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b83\u4eec\u5206\u522b\u4ee3\u8868\u4e86\u201c\u8fde\u7eed\u5b58\u50a8\u201d\u548c\u201c\u5206\u6563\u5b58\u50a8\u201d\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u3002

\u5b9e\u9645\u4e0a\uff0c\u7269\u7406\u7ed3\u6784\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u51b3\u5b9a\u4e86\u7a0b\u5e8f\u5bf9\u5185\u5b58\u548c\u7f13\u5b58\u7684\u4f7f\u7528\u6548\u7387\uff0c\u8fdb\u800c\u5f71\u54cd\u7b97\u6cd5\u7a0b\u5e8f\u7684\u6574\u4f53\u6027\u80fd\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u8bbe\u5907","text":"

\u8ba1\u7b97\u673a\u4e2d\u5305\u62ec\u4e09\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u8bbe\u5907\uff1a\u786c\u76d8\uff08hard disk\uff09\u3001\u5185\u5b58\uff08random-access memory, RAM\uff09\u3001\u7f13\u5b58\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u4eec\u5728\u8ba1\u7b97\u673a\u7cfb\u7edf\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6027\u80fd\u7279\u70b9\u3002

\u8868 4-2 \u00a0 \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u8bbe\u5907

\u786c\u76d8 \u5185\u5b58 \u7f13\u5b58 \u7528\u9014 \u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5305\u62ec\u64cd\u4f5c\u7cfb\u7edf\u3001\u7a0b\u5e8f\u3001\u6587\u4ef6\u7b49 \u4e34\u65f6\u5b58\u50a8\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u548c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e \u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u51cf\u5c11 CPU \u8bbf\u95ee\u5185\u5b58\u7684\u6b21\u6570 \u6613\u5931\u6027 \u65ad\u7535\u540e\u6570\u636e\u4e0d\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u5bb9\u91cf \u8f83\u5927\uff0cTB \u7ea7\u522b \u8f83\u5c0f\uff0cGB \u7ea7\u522b \u975e\u5e38\u5c0f\uff0cMB \u7ea7\u522b \u901f\u5ea6 \u8f83\u6162\uff0c\u51e0\u767e\u5230\u51e0\u5343 MB/s \u8f83\u5feb\uff0c\u51e0\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u51e0\u5341\u5230\u51e0\u767e GB/s \u4ef7\u683c \u8f83\u4fbf\u5b9c\uff0c\u51e0\u6bdb\u5230\u51e0\u5143 / GB \u8f83\u8d35\uff0c\u51e0\u5341\u5230\u51e0\u767e\u5143 / GB \u975e\u5e38\u8d35\uff0c\u968f CPU \u6253\u5305\u8ba1\u4ef7

\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf\u60f3\u8c61\u4e3a\u56fe 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7ed3\u6784\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9876\u7aef\u7684\u5b58\u50a8\u8bbe\u5907\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u8fd9\u79cd\u591a\u5c42\u7ea7\u7684\u8bbe\u8ba1\u5e76\u975e\u5076\u7136\uff0c\u800c\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u5bb6\u548c\u5de5\u7a0b\u5e08\u4eec\u7ecf\u8fc7\u6df1\u601d\u719f\u8651\u7684\u7ed3\u679c\u3002

  • \u786c\u76d8\u96be\u4ee5\u88ab\u5185\u5b58\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u5185\u5b58\u4e2d\u7684\u6570\u636e\u5728\u65ad\u7535\u540e\u4f1a\u4e22\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9002\u5408\u957f\u671f\u5b58\u50a8\u6570\u636e\uff1b\u5176\u6b21\uff0c\u5185\u5b58\u7684\u6210\u672c\u662f\u786c\u76d8\u7684\u51e0\u5341\u500d\uff0c\u8fd9\u4f7f\u5f97\u5b83\u96be\u4ee5\u5728\u6d88\u8d39\u8005\u5e02\u573a\u666e\u53ca\u3002
  • \u7f13\u5b58\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96be\u4ee5\u517c\u5f97\u3002\u968f\u7740 L1\u3001L2\u3001L3 \u7f13\u5b58\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u4f1a\u53d8\u5927\uff0c\u4e0e CPU \u6838\u5fc3\u4e4b\u95f4\u7684\u7269\u7406\u8ddd\u79bb\u4f1a\u53d8\u8fdc\uff0c\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u4f20\u8f93\u65f6\u95f4\u589e\u52a0\uff0c\u5143\u7d20\u8bbf\u95ee\u5ef6\u8fdf\u53d8\u9ad8\u3002\u5728\u5f53\u524d\u6280\u672f\u4e0b\uff0c\u591a\u5c42\u7ea7\u7684\u7f13\u5b58\u7ed3\u6784\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u95f4\u7684\u6700\u4f73\u5e73\u8861\u70b9\u3002

\u56fe 4-9 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf

Tip

\u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u5c42\u6b21\u7ed3\u6784\u4f53\u73b0\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u95f4\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5b9e\u9645\u4e0a\uff0c\u8fd9\u79cd\u6743\u8861\u666e\u904d\u5b58\u5728\u4e8e\u6240\u6709\u5de5\u4e1a\u9886\u57df\uff0c\u5b83\u8981\u6c42\u6211\u4eec\u5728\u4e0d\u540c\u7684\u4f18\u52bf\u548c\u9650\u5236\u4e4b\u95f4\u627e\u5230\u6700\u4f73\u5e73\u8861\u70b9\u3002

\u603b\u7684\u6765\u8bf4\uff0c\u786c\u76d8\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u5927\u91cf\u6570\u636e\uff0c\u5185\u5b58\u7528\u4e8e\u4e34\u65f6\u5b58\u50a8\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\uff0c\u800c\u7f13\u5b58\u5219\u7528\u4e8e\u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5e8f\u8fd0\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u534f\u4f5c\uff0c\u786e\u4fdd\u8ba1\u7b97\u673a\u7cfb\u7edf\u9ad8\u6548\u8fd0\u884c\u3002

\u5982\u56fe 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4f1a\u4ece\u786c\u76d8\u4e2d\u88ab\u8bfb\u53d6\u5230\u5185\u5b58\u4e2d\uff0c\u4f9b CPU \u8ba1\u7b97\u4f7f\u7528\u3002\u7f13\u5b58\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u901a\u8fc7\u667a\u80fd\u5730\u4ece\u5185\u5b58\u52a0\u8f7d\u6570\u636e\uff0c\u7ed9 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u6570\u636e\u8bfb\u53d6\uff0c\u4ece\u800c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\uff0c\u51cf\u5c11\u5bf9\u8f83\u6162\u7684\u5185\u5b58\u7684\u4f9d\u8d56\u3002

\u56fe 4-10 \u00a0 \u786c\u76d8\u3001\u5185\u5b58\u548c\u7f13\u5b58\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u901a

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u5185\u5b58\u6548\u7387","text":"

\u5728\u5185\u5b58\u7a7a\u95f4\u5229\u7528\u65b9\u9762\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5404\u81ea\u5177\u6709\u4f18\u52bf\u548c\u5c40\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u5185\u5b58\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u5757\u5185\u5b58\u4e0d\u80fd\u88ab\u591a\u4e2a\u7a0b\u5e8f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u4eec\u5e0c\u671b\u6570\u636e\u7ed3\u6784\u80fd\u591f\u5c3d\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u95f4\u3002\u6570\u7ec4\u7684\u5143\u7d20\u7d27\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u94fe\u8868\u8282\u70b9\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u56e0\u6b64\u7a7a\u95f4\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u6570\u7ec4\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u591f\u7684\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u5185\u5b58\u6d6a\u8d39\uff0c\u6570\u7ec4\u6269\u5bb9\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u94fe\u8868\u4ee5\u201c\u8282\u70b9\u201d\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a8\u6001\u5185\u5b58\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u968f\u7740\u53cd\u590d\u7533\u8bf7\u4e0e\u91ca\u653e\u5185\u5b58\uff0c\u7a7a\u95f2\u5185\u5b58\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u4f1a\u8d8a\u6765\u8d8a\u9ad8\uff0c\u4ece\u800c\u5bfc\u81f4\u5185\u5b58\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u6570\u7ec4\u7531\u4e8e\u5176\u8fde\u7eed\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u76f8\u5bf9\u4e0d\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u94fe\u8868\u7684\u5143\u7d20\u662f\u5206\u6563\u5b58\u50a8\u7684\uff0c\u5728\u9891\u7e41\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u7f13\u5b58\u6548\u7387","text":"

\u7f13\u5b58\u867d\u7136\u5728\u7a7a\u95f4\u5bb9\u91cf\u4e0a\u8fdc\u5c0f\u4e8e\u5185\u5b58\uff0c\u4f46\u5b83\u6bd4\u5185\u5b58\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5e8f\u6267\u884c\u901f\u5ea6\u4e0a\u8d77\u7740\u81f3\u5173\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u4e8e\u7f13\u5b58\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5b58\u50a8\u4e00\u5c0f\u90e8\u5206\u9891\u7e41\u8bbf\u95ee\u7684\u6570\u636e\uff0c\u56e0\u6b64\u5f53 CPU \u5c1d\u8bd5\u8bbf\u95ee\u7684\u6570\u636e\u4e0d\u5728\u7f13\u5b58\u4e2d\u65f6\uff0c\u5c31\u4f1a\u53d1\u751f\u7f13\u5b58\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u65f6 CPU \u4e0d\u5f97\u4e0d\u4ece\u901f\u5ea6\u8f83\u6162\u7684\u5185\u5b58\u4e2d\u52a0\u8f7d\u6240\u9700\u6570\u636e\u3002

\u663e\u7136\uff0c\u201c\u7f13\u5b58\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8bfb\u5199\u6570\u636e\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5e8f\u6027\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u4eec\u5c06 CPU \u4ece\u7f13\u5b58\u4e2d\u6210\u529f\u83b7\u53d6\u6570\u636e\u7684\u6bd4\u4f8b\u79f0\u4e3a\u7f13\u5b58\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u8fd9\u4e2a\u6307\u6807\u901a\u5e38\u7528\u6765\u8861\u91cf\u7f13\u5b58\u6548\u7387\u3002

\u4e3a\u4e86\u5c3d\u53ef\u80fd\u8fbe\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u7f13\u5b58\u4f1a\u91c7\u53d6\u4ee5\u4e0b\u6570\u636e\u52a0\u8f7d\u673a\u5236\u3002

  • \u7f13\u5b58\u884c\uff1a\u7f13\u5b58\u4e0d\u662f\u5355\u4e2a\u5b57\u8282\u5730\u5b58\u50a8\u4e0e\u52a0\u8f7d\u6570\u636e\uff0c\u800c\u662f\u4ee5\u7f13\u5b58\u884c\u4e3a\u5355\u4f4d\u3002\u76f8\u6bd4\u4e8e\u5355\u4e2a\u5b57\u8282\u7684\u4f20\u8f93\uff0c\u7f13\u5b58\u884c\u7684\u4f20\u8f93\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
  • \u9884\u53d6\u673a\u5236\uff1a\u5904\u7406\u5668\u4f1a\u5c1d\u8bd5\u9884\u6d4b\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\uff08\u4f8b\u5982\u987a\u5e8f\u8bbf\u95ee\u3001\u56fa\u5b9a\u6b65\u957f\u8df3\u8dc3\u8bbf\u95ee\u7b49\uff09\uff0c\u5e76\u6839\u636e\u7279\u5b9a\u6a21\u5f0f\u5c06\u6570\u636e\u52a0\u8f7d\u81f3\u7f13\u5b58\u4e4b\u4e2d\uff0c\u4ece\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
  • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u9644\u8fd1\u7684\u6570\u636e\u53ef\u80fd\u8fd1\u671f\u4e5f\u4f1a\u88ab\u8bbf\u95ee\u3002\u56e0\u6b64\uff0c\u7f13\u5b58\u5728\u52a0\u8f7d\u67d0\u4e00\u6570\u636e\u65f6\uff0c\u4e5f\u4f1a\u52a0\u8f7d\u5176\u9644\u8fd1\u7684\u6570\u636e\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
  • \u65f6\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u5728\u4e0d\u4e45\u7684\u5c06\u6765\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8bbf\u95ee\u3002\u7f13\u5b58\u5229\u7528\u8fd9\u4e00\u539f\u7406\uff0c\u901a\u8fc7\u4fdd\u7559\u6700\u8fd1\u8bbf\u95ee\u8fc7\u7684\u6570\u636e\u6765\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

\u5b9e\u9645\u4e0a\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5bf9\u7f13\u5b58\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

  • \u5360\u7528\u7a7a\u95f4\uff1a\u94fe\u8868\u5143\u7d20\u6bd4\u6570\u7ec4\u5143\u7d20\u5360\u7528\u7a7a\u95f4\u66f4\u591a\uff0c\u5bfc\u81f4\u7f13\u5b58\u4e2d\u5bb9\u7eb3\u7684\u6709\u6548\u6570\u636e\u91cf\u66f4\u5c11\u3002
  • \u7f13\u5b58\u884c\uff1a\u94fe\u8868\u6570\u636e\u5206\u6563\u5728\u5185\u5b58\u5404\u5904\uff0c\u800c\u7f13\u5b58\u662f\u201c\u6309\u884c\u52a0\u8f7d\u201d\u7684\uff0c\u56e0\u6b64\u52a0\u8f7d\u5230\u65e0\u6548\u6570\u636e\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
  • \u9884\u53d6\u673a\u5236\uff1a\u6570\u7ec4\u6bd4\u94fe\u8868\u7684\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9884\u6d4b\u6027\u201d\uff0c\u5373\u7cfb\u7edf\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c06\u88ab\u52a0\u8f7d\u7684\u6570\u636e\u3002
  • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u6570\u7ec4\u88ab\u5b58\u50a8\u5728\u96c6\u4e2d\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u88ab\u52a0\u8f7d\u6570\u636e\u9644\u8fd1\u7684\u6570\u636e\u66f4\u6709\u53ef\u80fd\u5373\u5c06\u88ab\u8bbf\u95ee\u3002

\u603b\u4f53\u800c\u8a00\uff0c\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u4f18\u4e8e\u94fe\u8868\u3002\u8fd9\u4f7f\u5f97\u5728\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u5f80\u5f80\u66f4\u53d7\u6b22\u8fce\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u7f13\u5b58\u6548\u7387\u5e76\u4e0d\u610f\u5473\u7740\u6570\u7ec4\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u4f18\u4e8e\u94fe\u8868\u3002\u5b9e\u9645\u5e94\u7528\u4e2d\u9009\u62e9\u54ea\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u6765\u51b3\u5b9a\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5b9e\u73b0\u201c\u6808\u201d\u6570\u636e\u7ed3\u6784\uff08\u4e0b\u4e00\u7ae0\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\uff09\uff0c\u4f46\u5b83\u4eec\u9002\u7528\u4e8e\u4e0d\u540c\u573a\u666f\u3002

  • \u5728\u505a\u7b97\u6cd5\u9898\u65f6\uff0c\u6211\u4eec\u4f1a\u503e\u5411\u4e8e\u9009\u62e9\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u968f\u673a\u8bbf\u95ee\u7684\u80fd\u529b\uff0c\u4ee3\u4ef7\u4ec5\u662f\u9700\u8981\u9884\u5148\u4e3a\u6570\u7ec4\u5206\u914d\u4e00\u5b9a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
  • \u5982\u679c\u6570\u636e\u91cf\u975e\u5e38\u5927\u3001\u52a8\u6001\u6027\u5f88\u9ad8\u3001\u6808\u7684\u9884\u671f\u5927\u5c0f\u96be\u4ee5\u4f30\u8ba1\uff0c\u90a3\u4e48\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u66f4\u52a0\u5408\u9002\u3002\u94fe\u8868\u80fd\u591f\u5c06\u5927\u91cf\u6570\u636e\u5206\u6563\u5b58\u50a8\u4e8e\u5185\u5b58\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u5e76\u4e14\u907f\u514d\u4e86\u6570\u7ec4\u6269\u5bb9\u4ea7\u751f\u7684\u989d\u5916\u5f00\u9500\u3002
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u4e24\u79cd\u5b58\u50a8\u65b9\u5f0f\uff1a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\u3002\u4e24\u8005\u7684\u7279\u70b9\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u6027\u3002
  • \u6570\u7ec4\u652f\u6301\u968f\u673a\u8bbf\u95ee\u3001\u5360\u7528\u5185\u5b58\u8f83\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002
  • \u94fe\u8868\u901a\u8fc7\u66f4\u6539\u5f15\u7528\uff08\u6307\u9488\uff09\u5b9e\u73b0\u9ad8\u6548\u7684\u8282\u70b9\u63d2\u5165\u4e0e\u5220\u9664\uff0c\u4e14\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\uff1b\u4f46\u8282\u70b9\u8bbf\u95ee\u6548\u7387\u4f4e\u3001\u5360\u7528\u5185\u5b58\u8f83\u591a\u3002\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u5355\u5411\u94fe\u8868\u3001\u73af\u5f62\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
  • \u5217\u8868\u662f\u4e00\u79cd\u652f\u6301\u589e\u5220\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u3002\u5b83\u4fdd\u7559\u4e86\u6570\u7ec4\u7684\u4f18\u52bf\uff0c\u540c\u65f6\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\u3002
  • \u5217\u8868\u7684\u51fa\u73b0\u5927\u5e45\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
  • \u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u6570\u7ec4\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u5185\u5b58\u7a7a\u95f4\u6548\u7387\uff0c\u800c\u94fe\u8868\u5219\u5728\u5185\u5b58\u4f7f\u7528\u4e0a\u66f4\u52a0\u7075\u6d3b\u3002
  • \u7f13\u5b58\u901a\u8fc7\u7f13\u5b58\u884c\u3001\u9884\u53d6\u673a\u5236\u4ee5\u53ca\u7a7a\u95f4\u5c40\u90e8\u6027\u548c\u65f6\u95f4\u5c40\u90e8\u6027\u7b49\u6570\u636e\u52a0\u8f7d\u673a\u5236\uff0c\u4e3a CPU \u63d0\u4f9b\u5feb\u901f\u6570\u636e\u8bbf\u95ee\uff0c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\u3002
  • \u7531\u4e8e\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u94fe\u8868\u66f4\u9ad8\u6548\u3002\u5728\u9009\u62e9\u6570\u636e\u7ed3\u6784\u65f6\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u548c\u573a\u666f\u505a\u51fa\u6070\u5f53\u9009\u62e9\u3002
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5806\u4e0a\u7684\u6570\u7ec4\u90fd\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u6570\u636e\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u6808\u548c\u5806\u5177\u6709\u5404\u81ea\u7684\u7279\u70b9\uff0c\u4ece\u800c\u5bfc\u81f4\u4ee5\u4e0b\u4e0d\u540c\u70b9\u3002

  1. \u5206\u914d\u548c\u91ca\u653e\u6548\u7387\uff1a\u6808\u662f\u4e00\u5757\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff1b\u800c\u5806\u5185\u5b58\u76f8\u5bf9\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u52a8\u6001\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u4e0a\u7684\u5206\u914d\u548c\u91ca\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u6808\u4e0a\u7684\u6162\u3002
  2. \u5927\u5c0f\u9650\u5236\uff1a\u6808\u5185\u5b58\u76f8\u5bf9\u8f83\u5c0f\uff0c\u5806\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\u3002\u56e0\u6b64\u5806\u66f4\u52a0\u9002\u5408\u5b58\u50a8\u5927\u578b\u6570\u7ec4\u3002
  3. \u7075\u6d3b\u6027\uff1a\u6808\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\uff0c\u800c\u5806\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u786e\u5b9a\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u6570\u7ec4\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u76f8\u540c\u7c7b\u578b\u5462\uff1f

\u94fe\u8868\u7531\u8282\u70b9\u7ec4\u6210\uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u5f15\u7528\uff08\u6307\u9488\uff09\u8fde\u63a5\uff0c\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

\u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 \u5b57\u8282 \u548c 8 \u5b57\u8282 \uff0c\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd\u201c\u5143\u7d20\u957f\u5ea6\u201d\u3002

# \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

Q\uff1a\u5220\u9664\u8282\u70b9 P \u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a None \u5462\uff1f

\u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u8282\u70b9\u904d\u5386\u5230\u5c3e\u8282\u70b9\u5df2\u7ecf\u4e0d\u4f1a\u9047\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u8282\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u8282\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8be5\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u3002

\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff08\u505a\u9898\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65ad\u5f00\u6ca1\u6709\u5173\u7cfb\uff0c\u53ea\u8981\u4fdd\u8bc1\u7a0b\u5e8f\u7684\u903b\u8f91\u662f\u6b63\u786e\u7684\u5c31\u884c\u3002\u4ece\u6807\u51c6\u5e93\u7684\u89d2\u5ea6\u770b\uff0c\u65ad\u5f00\u66f4\u52a0\u5b89\u5168\u3001\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65ad\u5f00\uff0c\u5047\u8bbe\u88ab\u5220\u9664\u8282\u70b9\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u4e48\u5b83\u4f1a\u5f71\u54cd\u540e\u7ee7\u8282\u70b9\u7684\u5185\u5b58\u56de\u6536\u3002

Q\uff1a\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

\u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u8282\u70b9\u3001\u5c3e\u8282\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

Q\uff1a\u56fe\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u8282\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u8282\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

\u8be5\u793a\u610f\u56fe\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

  • \u4e0d\u540c\u7c7b\u578b\u7684\u8282\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u5b9e\u4f8b\u5bf9\u8c61\u7b49\u3002
  • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

Q\uff1a\u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

\u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

Q\uff1a\u201c\u5217\u8868\u7684\u51fa\u73b0\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u540e\uff0c\u8fd9 3 \u4e2a\u5143\u7d20\u7684\u5730\u5740\u662f\u76f8\u8fde\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u4f1a\u53d1\u73b0\u5b83\u4eec\u6bcf\u4e2a\u5143\u7d20\u7684 id \u5e76\u4e0d\u662f\u8fde\u7eed\u7684\uff0c\u800c\u662f\u5206\u522b\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u8fd9\u4e9b\u5143\u7d20\u7684\u5730\u5740\u4e0d\u8fde\u7eed\uff0c\u90a3\u4e48 m \u8fd8\u662f\u6570\u7ec4\u5417\uff1f

\u5047\u5982\u628a\u5217\u8868\u5143\u7d20\u6362\u6210\u94fe\u8868\u8282\u70b9 n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u8fd9 5 \u4e2a\u8282\u70b9\u5bf9\u8c61\u4e5f\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002\u7136\u800c\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5217\u8868\u7d22\u5f15\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u8282\u70b9\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u8bbf\u95ee\u5230\u5bf9\u5e94\u7684\u8282\u70b9\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5b58\u50a8\u7684\u662f\u8282\u70b9\u7684\u5f15\u7528\uff0c\u800c\u975e\u8282\u70b9\u672c\u8eab\u3002

\u4e0e\u8bb8\u591a\u8bed\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6570\u5b57\u4e5f\u88ab\u5305\u88c5\u4e3a\u5bf9\u8c61\uff0c\u5217\u8868\u4e2d\u5b58\u50a8\u7684\u4e0d\u662f\u6570\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5bf9\u6570\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0\u4e24\u4e2a\u6570\u7ec4\u4e2d\u7684\u76f8\u540c\u6570\u5b57\u62e5\u6709\u540c\u4e00\u4e2a id \uff0c\u5e76\u4e14\u8fd9\u4e9b\u6570\u5b57\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

Q\uff1aC++ STL \u91cc\u9762\u7684 std::list \u5df2\u7ecf\u5b9e\u73b0\u4e86\u53cc\u5411\u94fe\u8868\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u7b97\u6cd5\u4e66\u4e0a\u4e0d\u600e\u4e48\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u4e3a\u6709\u4ec0\u4e48\u5c40\u9650\u6027\u5462\uff1f

\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u5f80\u5f80\u66f4\u9752\u7750\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u65f6\u624d\u4f7f\u7528\u94fe\u8868\uff0c\u4e3b\u8981\u6709\u4e24\u4e2a\u539f\u56e0\u3002

  • \u7a7a\u95f4\u5f00\u9500\uff1a\u7531\u4e8e\u6bcf\u4e2a\u5143\u7d20\u9700\u8981\u4e24\u4e2a\u989d\u5916\u7684\u6307\u9488\uff08\u4e00\u4e2a\u7528\u4e8e\u524d\u4e00\u4e2a\u5143\u7d20\uff0c\u4e00\u4e2a\u7528\u4e8e\u540e\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u5360\u7528\u7a7a\u95f4\u3002
  • \u7f13\u5b58\u4e0d\u53cb\u597d\uff1a\u7531\u4e8e\u6570\u636e\u4e0d\u662f\u8fde\u7eed\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5bf9\u7f13\u5b58\u7684\u5229\u7528\u7387\u8f83\u4f4e\u3002\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cstd::vector \u7684\u6027\u80fd\u4f1a\u66f4\u597d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u94fe\u8868\u7684\u60c5\u51b5\u4e3b\u8981\u662f\u4e8c\u53c9\u6811\u548c\u56fe\u3002\u6808\u548c\u961f\u5217\u5f80\u5f80\u4f1a\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u94fe\u8868\u3002

Q\uff1a\u521d\u59cb\u5316\u5217\u8868 res = [0] * self.size() \u64cd\u4f5c\uff0c\u4f1a\u5bfc\u81f4 res \u7684\u6bcf\u4e2a\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u5730\u5740\u5417\uff1f

\u4e0d\u4f1a\u3002\u4f46\u4e8c\u7ef4\u6570\u7ec4\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7ef4\u5217\u8868 res = [[0] * self.size()] \uff0c\u5219\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u4e2a\u5217\u8868 [0] \u3002

"},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

Abstract

\u6211\u4eec\u5982\u540c\u8ff7\u5bab\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u8fdb\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u4f1a\u9047\u5230\u56f0\u96be\u3002

\u56de\u6eaf\u7684\u529b\u91cf\u8ba9\u6211\u4eec\u80fd\u591f\u91cd\u65b0\u5f00\u59cb\uff0c\u4e0d\u65ad\u5c1d\u8bd5\uff0c\u6700\u7ec8\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

"},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5
  • 13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898
  • 13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898
  • 13.4 \u00a0 N \u7687\u540e\u95ee\u9898
  • 13.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

\u56de\u6eaf\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u79cd\u901a\u8fc7\u7a77\u4e3e\u6765\u89e3\u51b3\u95ee\u9898\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u4ece\u4e00\u4e2a\u521d\u59cb\u72b6\u6001\u51fa\u53d1\uff0c\u66b4\u529b\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5f53\u9047\u5230\u6b63\u786e\u7684\u89e3\u5219\u5c06\u5176\u8bb0\u5f55\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5c1d\u8bd5\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u90fd\u65e0\u6cd5\u627e\u5230\u89e3\u4e3a\u6b62\u3002

\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5229\u7528\u524d\u5e8f\u904d\u5386\u6784\u9020\u4e00\u4e2a\u56de\u6eaf\u95ee\u9898\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u9898\u4e00

\u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

\u5bf9\u4e8e\u6b64\u9898\uff0c\u6211\u4eec\u524d\u5e8f\u904d\u5386\u8fd9\u68f5\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002\u76f8\u5173\u8fc7\u7a0b\u5b9e\u73b0\u5982\u56fe 13-1 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
preorder_traversal_i_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
preorder_traversal_i_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
preorder_traversal_i_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
preorder_traversal_i_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
preorder_traversal_i_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
preorder_traversal_i_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
preorder_traversal_i_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_i_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-1 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

"},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000","text":"

\u4e4b\u6240\u4ee5\u79f0\u4e4b\u4e3a\u56de\u6eaf\u7b97\u6cd5\uff0c\u662f\u56e0\u4e3a\u8be5\u7b97\u6cd5\u5728\u641c\u7d22\u89e3\u7a7a\u95f4\u65f6\u4f1a\u91c7\u7528\u201c\u5c1d\u8bd5\u201d\u4e0e\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u5f53\u7b97\u6cd5\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u9047\u5230\u67d0\u4e2a\u72b6\u6001\u65e0\u6cd5\u7ee7\u7eed\u524d\u8fdb\u6216\u65e0\u6cd5\u5f97\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u65f6\uff0c\u5b83\u4f1a\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u5c1d\u8bd5\u5176\u4ed6\u53ef\u80fd\u7684\u9009\u62e9\u3002

\u5bf9\u4e8e\u4f8b\u9898\u4e00\uff0c\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5c1d\u8bd5\u201d\uff0c\u800c\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u8fd4\u56de\u7236\u8282\u70b9\u7684 return \u5219\u8868\u793a\u201c\u56de\u9000\u201d\u3002

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u56de\u9000\u5e76\u4e0d\u4ec5\u4ec5\u5305\u62ec\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u4f8b\u9898\u4e8c

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\u3002

\u5728\u4f8b\u9898\u4e00\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u5217\u8868 path \u8bb0\u5f55\u8bbf\u95ee\u8fc7\u7684\u8282\u70b9\u8def\u5f84\u3002\u5f53\u8bbf\u95ee\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u590d\u5236 path \u5e76\u6dfb\u52a0\u8fdb\u7ed3\u679c\u5217\u8868 res \u3002\u904d\u5386\u5b8c\u6210\u540e\uff0cres \u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_ii_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_ii_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_ii_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_ii_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_ii_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_ii_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_ii_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_ii_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_ii_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_ii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_ii_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u6bcf\u6b21\u201c\u5c1d\u8bd5\u201d\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u5c06\u5f53\u524d\u8282\u70b9\u6dfb\u52a0\u8fdb path \u6765\u8bb0\u5f55\u8def\u5f84\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u4eec\u9700\u8981\u5c06\u8be5\u8282\u70b9\u4ece path \u4e2d\u5f39\u51fa\uff0c\u4ee5\u6062\u590d\u672c\u6b21\u5c1d\u8bd5\u4e4b\u524d\u7684\u72b6\u6001\u3002

\u89c2\u5bdf\u56fe 13-2 \u6240\u793a\u7684\u8fc7\u7a0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5c1d\u8bd5\u548c\u56de\u9000\u7406\u89e3\u4e3a\u201c\u524d\u8fdb\u201d\u4e0e\u201c\u64a4\u9500\u201d\uff0c\u4e24\u4e2a\u64cd\u4f5c\u4e92\u4e3a\u9006\u5411\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 13-2 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000

"},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

\u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

\u4f8b\u9898\u4e09

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u5e76\u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u3002

\u4e3a\u4e86\u6ee1\u8db3\u4ee5\u4e0a\u7ea6\u675f\u6761\u4ef6\uff0c\u6211\u4eec\u9700\u8981\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\uff0c\u5219\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_iii_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_iii_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_iii_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_iii_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_iii_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_iii_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_iii_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_iii_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_iii_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_iii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_iii_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u201c\u526a\u679d\u201d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5982\u56fe 13-3 \u6240\u793a\uff0c\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u641c\u7d22\u5206\u652f\uff0c\u907f\u514d\u8bb8\u591a\u65e0\u610f\u4e49\u7684\u5c1d\u8bd5\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u641c\u7d22\u6548\u7387\u3002

\u56fe 13-3 \u00a0 \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u4ee3\u7801","text":"

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c1d\u8bd5\u5c06\u56de\u6eaf\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\uff0c\u63d0\u5347\u4ee3\u7801\u7684\u901a\u7528\u6027\u3002

\u5728\u4ee5\u4e0b\u6846\u67b6\u4ee3\u7801\u4e2d\uff0cstate \u8868\u793a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
\n
\n

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u57fa\u4e8e\u6846\u67b6\u4ee3\u7801\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u72b6\u6001 state \u4e3a\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u4e3a\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8bb0\u5f55\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u590d\u72b6\u6001\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
preorder_traversal_iii_template.cpp
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.java
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.cs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.go
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.swift
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.js
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.ts
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.dart
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
preorder_traversal_iii_template.rs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
preorder_traversal_iii_template.c
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution()) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution();\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice();\n        }\n    }\n}\n
preorder_traversal_iii_template.kt
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.rb
[class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\n
preorder_traversal_iii_template.zig
[class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6839\u636e\u9898\u610f\uff0c\u6211\u4eec\u5728\u627e\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u540e\u5e94\u8be5\u7ee7\u7eed\u641c\u7d22\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u8bb0\u5f55\u89e3\u4e4b\u540e\u7684 return \u8bed\u53e5\u5220\u9664\u3002\u56fe 13-4 \u5bf9\u6bd4\u4e86\u4fdd\u7559\u6216\u5220\u9664 return \u8bed\u53e5\u7684\u641c\u7d22\u8fc7\u7a0b\u3002

\u56fe 13-4 \u00a0 \u4fdd\u7559\u4e0e\u5220\u9664 return \u7684\u641c\u7d22\u8fc7\u7a0b\u5bf9\u6bd4

\u76f8\u6bd4\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u4ee3\u7801\u5b9e\u73b0\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u4ee3\u7801\u5b9e\u73b0\u867d\u7136\u663e\u5f97\u5570\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u56de\u6eaf\u95ee\u9898\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u672f\u8bed","text":"

\u4e3a\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u7b97\u6cd5\u95ee\u9898\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e0b\u56de\u6eaf\u7b97\u6cd5\u4e2d\u5e38\u7528\u672f\u8bed\u7684\u542b\u4e49\uff0c\u5e76\u5bf9\u7167\u4f8b\u9898\u4e09\u7ed9\u51fa\u5bf9\u5e94\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

\u8868 13-1 \u00a0 \u5e38\u89c1\u7684\u56de\u6eaf\u7b97\u6cd5\u672f\u8bed

\u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u4e2a\u6216\u591a\u4e2a \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u6240\u6709\u8def\u5f84 \u7ea6\u675f\u6761\u4ef6\uff08constraint\uff09 \u7ea6\u675f\u6761\u4ef6\u662f\u95ee\u9898\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u6761\u4ef6\uff0c\u901a\u5e38\u7528\u4e8e\u526a\u679d \u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u8282\u70b9 \\(3\\) \u72b6\u6001\uff08state\uff09 \u72b6\u6001\u8868\u793a\u95ee\u9898\u5728\u67d0\u4e00\u65f6\u523b\u7684\u60c5\u51b5\uff0c\u5305\u62ec\u5df2\u7ecf\u505a\u51fa\u7684\u9009\u62e9 \u5f53\u524d\u5df2\u8bbf\u95ee\u7684\u8282\u70b9\u8def\u5f84\uff0c\u5373 path \u8282\u70b9\u5217\u8868 \u5c1d\u8bd5\uff08attempt\uff09 \u5c1d\u8bd5\u662f\u6839\u636e\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\uff0c\u68c0\u67e5\u662f\u5426\u4e3a\u89e3 \u9012\u5f52\u8bbf\u95ee\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\uff0c\u5c06\u8282\u70b9\u6dfb\u52a0\u8fdb path \uff0c\u5224\u65ad\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u72b6\u6001\u65f6\uff0c\u64a4\u9500\u524d\u9762\u505a\u51fa\u7684\u9009\u62e9\uff0c\u56de\u5230\u4e0a\u4e00\u4e2a\u72b6\u6001 \u5f53\u8d8a\u8fc7\u53f6\u8282\u70b9\u3001\u7ed3\u675f\u8282\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u636e\u95ee\u9898\u7279\u6027\u548c\u7ea6\u675f\u6761\u4ef6\u907f\u514d\u65e0\u610f\u4e49\u7684\u641c\u7d22\u8def\u5f84\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u7d22\u6548\u7387 \u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22

Tip

\u95ee\u9898\u3001\u89e3\u3001\u72b6\u6001\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u4e0a\u662f\u4e00\u79cd\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u7b97\u6cd5\uff0c\u5b83\u5c1d\u8bd5\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u76f4\u5230\u627e\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u5728\u4e8e\u80fd\u591f\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

\u7136\u800c\uff0c\u5728\u5904\u7406\u5927\u89c4\u6a21\u6216\u8005\u590d\u6742\u95ee\u9898\u65f6\uff0c\u56de\u6eaf\u7b97\u6cd5\u7684\u8fd0\u884c\u6548\u7387\u53ef\u80fd\u96be\u4ee5\u63a5\u53d7\u3002

  • \u65f6\u95f4\uff1a\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u904d\u5386\u72b6\u6001\u7a7a\u95f4\u7684\u6240\u6709\u53ef\u80fd\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u6307\u6570\u9636\u6216\u9636\u4e58\u9636\u3002
  • \u7a7a\u95f4\uff1a\u5728\u9012\u5f52\u8c03\u7528\u4e2d\u9700\u8981\u4fdd\u5b58\u5f53\u524d\u7684\u72b6\u6001\uff08\u4f8b\u5982\u8def\u5f84\u3001\u7528\u4e8e\u526a\u679d\u7684\u8f85\u52a9\u53d8\u91cf\u7b49\uff09\uff0c\u5f53\u6df1\u5ea6\u5f88\u5927\u65f6\uff0c\u7a7a\u95f4\u9700\u6c42\u53ef\u80fd\u4f1a\u53d8\u5f97\u5f88\u5927\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u7684\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u3002\u5bf9\u4e8e\u8fd9\u4e9b\u95ee\u9898\uff0c\u7531\u4e8e\u65e0\u6cd5\u9884\u6d4b\u54ea\u4e9b\u9009\u62e9\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u4eec\u5fc5\u987b\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u8fdb\u884c\u904d\u5386\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5173\u952e\u662f\u5982\u4f55\u4f18\u5316\u6548\u7387\uff0c\u5e38\u89c1\u7684\u6548\u7387\u4f18\u5316\u65b9\u6cd5\u6709\u4e24\u79cd\u3002

  • \u526a\u679d\uff1a\u907f\u514d\u641c\u7d22\u90a3\u4e9b\u80af\u5b9a\u4e0d\u4f1a\u4ea7\u751f\u89e3\u7684\u8def\u5f84\uff0c\u4ece\u800c\u8282\u7701\u65f6\u95f4\u548c\u7a7a\u95f4\u3002
  • \u542f\u53d1\u5f0f\u641c\u7d22\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8ba1\u503c\uff0c\u4ece\u800c\u4f18\u5148\u641c\u7d22\u6700\u6709\u53ef\u80fd\u4ea7\u751f\u6709\u6548\u89e3\u7684\u8def\u5f84\u3002
"},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u9898","text":"

\u56de\u6eaf\u7b97\u6cd5\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u641c\u7d22\u95ee\u9898\u3001\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u548c\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u3002

\u641c\u7d22\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u89e3\u51b3\u65b9\u6848\u3002

  • \u5168\u6392\u5217\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7ec4\u5408\u3002
  • \u5b50\u96c6\u548c\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\u548c\u4e00\u4e2a\u76ee\u6807\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u4e3a\u76ee\u6807\u548c\u7684\u5b50\u96c6\u3002
  • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u6839\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\uff0c\u4e14\u4e0d\u80fd\u5c06\u5927\u5706\u76d8\u653e\u5728\u5c0f\u5706\u76d8\u4e0a\u3002

\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u6240\u6709\u7ea6\u675f\u6761\u4ef6\u7684\u89e3\u3002

  • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76d8\u4e0a\u653e\u7f6e \\(n\\) \u4e2a\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u4eec\u4e92\u4e0d\u653b\u51fb\u3002
  • \u6570\u72ec\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7f51\u683c\u4e2d\u586b\u5165\u6570\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u4e2a \\(3 \\times 3\\) \u5b50\u7f51\u683c\u4e2d\u7684\u6570\u5b57\u4e0d\u91cd\u590d\u3002
  • \u56fe\u7740\u8272\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u7528\u6700\u5c11\u7684\u989c\u8272\u7ed9\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u7740\u8272\uff0c\u4f7f\u5f97\u76f8\u90bb\u9876\u70b9\u989c\u8272\u4e0d\u540c\u3002

\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u4e00\u4e2a\u7ec4\u5408\u7a7a\u95f4\u4e2d\u627e\u5230\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\u7684\u6700\u4f18\u89e3\u3002

  • 0-1 \u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u80cc\u5305\uff0c\u6bcf\u4e2a\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u4ef7\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5185\uff0c\u9009\u62e9\u7269\u54c1\u4f7f\u5f97\u603b\u4ef7\u503c\u6700\u5927\u3002
  • \u65c5\u884c\u5546\u95ee\u9898\uff1a\u5728\u4e00\u4e2a\u56fe\u4e2d\uff0c\u4ece\u4e00\u4e2a\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u6240\u6709\u5176\u4ed6\u70b9\u6070\u597d\u4e00\u6b21\u540e\u8fd4\u56de\u8d77\u70b9\uff0c\u6c42\u6700\u77ed\u8def\u5f84\u3002
  • \u6700\u5927\u56e2\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u56fe\uff0c\u5373\u5b50\u56fe\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u90fd\u6709\u8fb9\u76f8\u8fde\u3002

\u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u4f18\u89e3\u51b3\u65b9\u6848\u3002

  • 0-1 \u80cc\u5305\u95ee\u9898\u901a\u5e38\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\uff0c\u4ee5\u8fbe\u5230\u66f4\u9ad8\u7684\u65f6\u95f4\u6548\u7387\u3002
  • \u65c5\u884c\u5546\u662f\u4e00\u4e2a\u8457\u540d\u7684 NP-Hard \u95ee\u9898\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u9057\u4f20\u7b97\u6cd5\u548c\u8681\u7fa4\u7b97\u6cd5\u7b49\u3002
  • \u6700\u5927\u56e2\u95ee\u9898\u662f\u56fe\u8bba\u4e2d\u7684\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\uff0c\u53ef\u7528\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u542f\u53d1\u5f0f\u7b97\u6cd5\u6765\u89e3\u51b3\u3002
"},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u95ee\u9898","text":"

Question

\u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u540c\u5904\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u6761\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

\u5982\u56fe 13-15 \u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

\u56fe 13-15 \u00a0 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

\u56fe 13-16 \u5c55\u793a\u4e86\u672c\u9898\u7684\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u6761\u5bf9\u89d2\u7ebf\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u6b21\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

\u56fe 13-16 \u00a0 n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

"},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

\u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002

\u56fe 13-17 \u6240\u793a\u4e3a \\(4\\) \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u753b\u5e45\u9650\u5236\uff0c\u56fe 13-17 \u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u4e2a\u641c\u7d22\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u8fdb\u884c\u4e86\u526a\u679d\u3002

\u56fe 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

"},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u4e0e\u5bf9\u89d2\u7ebf\u526a\u679d","text":"

\u4e3a\u4e86\u6ee1\u8db3\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u8fdb\u884c\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

\u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\((row, col)\\) \uff0c\u9009\u5b9a\u77e9\u9635\u4e2d\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u4e3a\u6052\u5b9a\u503c\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5219\u5b83\u4eec\u4e00\u5b9a\u5904\u5728\u540c\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002\u5229\u7528\u8be5\u89c4\u5f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u56fe 13-18 \u6240\u793a\u7684\u6570\u7ec4 diags1 \u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

\u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u540c\u6837\u4e5f\u53ef\u4ee5\u501f\u52a9\u6570\u7ec4 diags2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

\u56fe 13-18 \u00a0 \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

"},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u8bf7\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635\u4e2d \\(row - col\\) \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u8303\u56f4\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7684\u6570\u91cf\u90fd\u4e3a \\(2n - 1\\) \uff0c\u5373\u6570\u7ec4 diags1 \u548c diags2 \u7684\u957f\u5ea6\u90fd\u4e3a \\(2n - 1\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u904d\u5386\u6240\u6709\u5217\n    for col in range(n):\n        # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
n_queens.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
n_queens.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
n_queens.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
n_queens.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
n_queens.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
n_queens.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
n_queens.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
n_queens.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u4e2a\u9009\u62e9\uff0c\u4f7f\u7528 \\(O(n!)\\) \u65f6\u95f4\u3002\u5f53\u8bb0\u5f55\u89e3\u65f6\uff0c\u9700\u8981\u590d\u5236\u77e9\u9635 state \u5e76\u6dfb\u52a0\u8fdb res \uff0c\u590d\u5236\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n! \\cdot n^2)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u6570\u7ec4 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0c\u6570\u7ec4 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

\u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u8868 13-2 \u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u636e\uff0c\u5305\u62ec\u8f93\u5165\u6570\u7ec4\u548c\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

\u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

\u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u65e0\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \uff0c\u518d\u9009\u62e9 \\(3\\) \uff0c\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

\u4ece\u56de\u6eaf\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u8bf7\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u5e94\u8be5\u662f\u552f\u4e00\u7684\u3002

\u5982\u56fe 13-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

\u56fe 13-5 \u00a0 \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

"},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u590d\u9009\u62e9\u526a\u679d","text":"

\u4e3a\u4e86\u5b9e\u73b0\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u6211\u4eec\u8003\u8651\u5f15\u5165\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\uff0c\u5e76\u57fa\u4e8e\u5b83\u5b9e\u73b0\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

  • \u5728\u505a\u51fa\u9009\u62e9 choice[i] \u540e\uff0c\u6211\u4eec\u5c31\u5c06 selected[i] \u8d4b\u503c\u4e3a \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9009\u62e9\u3002
  • \u904d\u5386\u9009\u62e9\u5217\u8868 choices \u65f6\uff0c\u8df3\u8fc7\u6240\u6709\u5df2\u88ab\u9009\u62e9\u7684\u8282\u70b9\uff0c\u5373\u526a\u679d\u3002

\u5982\u56fe 13-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

\u56fe 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

\u89c2\u5bdf\u56fe 13-6 \u53d1\u73b0\uff0c\u8be5\u526a\u679d\u64cd\u4f5c\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u51cf\u5c0f\u81f3 \\(O(n!)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u6574\u4f53\u4ee3\u7801\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if not selected[i]:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_i.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_i.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_i.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_i.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_i.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_i.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    if (!selected[i]) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_i.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_i.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_i.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
permutations_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u8651\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u5143\u7d20 \\(1\\) \uff0c\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a \\(1\\) \u8bb0\u4e3a \\(\\hat{1}\\) \u3002

\u5982\u56fe 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u590d\u7684\u3002

\u56fe 13-7 \u00a0 \u91cd\u590d\u6392\u5217

\u90a3\u4e48\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u6ca1\u6709\u5fc5\u8981\uff0c\u5e94\u5f53\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

"},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u89c2\u5bdf\u56fe 13-8 \uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u4e4b\u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u5e94\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u4fdd\u8bc1\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002

\u56fe 13-8 \u00a0 \u91cd\u590d\u6392\u5217\u526a\u679d

"},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_ii.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_ii.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_ii.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_ii.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_ii.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_ii.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_ii.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_ii.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated[choice] = true; // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_ii.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
permutations_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u4e24\u79cd\u526a\u679d\u5bf9\u6bd4","text":"

\u8bf7\u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u7528\u4e8e\u526a\u679d\uff0c\u4f46\u4e24\u8005\u7684\u76ee\u6807\u4e0d\u540c\u3002

  • \u91cd\u590d\u9009\u62e9\u526a\u679d\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
  • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u6bcf\u4e2a\u8c03\u7528\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u672c\u8f6e\u904d\u5386\uff08for \u5faa\u73af\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002

\u56fe 13-9 \u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

\u56fe 13-9 \u00a0 \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

"},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u65e0\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ef\u4ee5\u88ab\u9009\u53d6\u591a\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

\u4f8b\u5982\uff0c\u8f93\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6807\u6574\u6570 \\(9\\) \uff0c\u89e3\u4e3a \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

  • \u8f93\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u91cd\u590d\u9009\u53d6\u3002
  • \u5b50\u96c6\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u4e2a\u5b50\u96c6\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c2\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

\u7c7b\u4f3c\u4e8e\u5168\u6392\u5217\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\uff0c\u5e76\u5728\u9009\u62e9\u8fc7\u7a0b\u4e2d\u5b9e\u65f6\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u5f53\u5143\u7d20\u548c\u7b49\u4e8e target \u65f6\uff0c\u5c31\u5c06\u5b50\u96c6\u8bb0\u5f55\u81f3\u7ed3\u679c\u5217\u8868\u3002

\u800c\u4e0e\u5168\u6392\u5217\u95ee\u9898\u4e0d\u540c\u7684\u662f\uff0c\u672c\u9898\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u9009\u53d6\uff0c\u56e0\u6b64\u65e0\u987b\u501f\u52a9 selected \u5e03\u5c14\u5217\u8868\u6765\u8bb0\u5f55\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u53ef\u4ee5\u5bf9\u5168\u6392\u5217\u4ee3\u7801\u8fdb\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u9898\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
subset_sum_i_naive.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i_naive.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
subset_sum_i_naive.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
subset_sum_i_naive.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
subset_sum_i_naive.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6570\u91cf\u4e3a0\n    backtrack(target, 0, nums, numsSize);\n}\n
subset_sum_i_naive.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
subset_sum_i_naive.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
subset_sum_i_naive.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5411\u4ee5\u4e0a\u4ee3\u7801\u8f93\u5165\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u8f93\u51fa\u7ed3\u679c\u4e3a \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u867d\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u4e3a \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u590d\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

\u8fd9\u662f\u56e0\u4e3a\u641c\u7d22\u8fc7\u7a0b\u662f\u533a\u5206\u9009\u62e9\u987a\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u533a\u5206\u9009\u62e9\u987a\u5e8f\u3002\u5982\u56fe 13-10 \u6240\u793a\uff0c\u5148\u9009 \\(4\\) \u540e\u9009 \\(5\\) \u4e0e\u5148\u9009 \\(5\\) \u540e\u9009 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5bf9\u5e94\u540c\u4e00\u4e2a\u5b50\u96c6\u3002

\u56fe 13-10 \u00a0 \u5b50\u96c6\u641c\u7d22\u4e0e\u8d8a\u754c\u526a\u679d

\u4e3a\u4e86\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u601d\u8def\u662f\u5bf9\u7ed3\u679c\u5217\u8868\u8fdb\u884c\u53bb\u91cd\u3002\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u4e24\u65b9\u9762\u539f\u56e0\u3002

  • \u5f53\u6570\u7ec4\u5143\u7d20\u8f83\u591a\uff0c\u5c24\u5176\u662f\u5f53 target \u8f83\u5927\u65f6\uff0c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u4ea7\u751f\u5927\u91cf\u7684\u91cd\u590d\u5b50\u96c6\u3002
  • \u6bd4\u8f83\u5b50\u96c6\uff08\u6570\u7ec4\uff09\u7684\u5f02\u540c\u975e\u5e38\u8017\u65f6\uff0c\u9700\u8981\u5148\u6392\u5e8f\u6570\u7ec4\uff0c\u518d\u6bd4\u8f83\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5143\u7d20\u7684\u5f02\u540c\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u590d\u5b50\u96c6\u526a\u679d","text":"

\u6211\u4eec\u8003\u8651\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u901a\u8fc7\u526a\u679d\u8fdb\u884c\u53bb\u91cd\u3002\u89c2\u5bdf\u56fe 13-11 \uff0c\u91cd\u590d\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u987a\u5e8f\u9009\u62e9\u6570\u7ec4\u5143\u7d20\u65f6\u4ea7\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u51b5\u3002

  1. \u5f53\u7b2c\u4e00\u8f6e\u548c\u7b2c\u4e8c\u8f6e\u5206\u522b\u9009\u62e9 \\(3\\) \u548c \\(4\\) \u65f6\uff0c\u4f1a\u751f\u6210\u5305\u542b\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8bb0\u4e3a \\([3, 4, \\dots]\\) \u3002
  2. \u4e4b\u540e\uff0c\u5f53\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(4\\) \u65f6\uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \uff0c\u56e0\u4e3a\u8be5\u9009\u62e9\u4ea7\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c42\u7684\u9009\u62e9\u90fd\u662f\u4ece\u5de6\u5230\u53f3\u88ab\u9010\u4e2a\u5c1d\u8bd5\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

  1. \u524d\u4e24\u8f6e\u9009\u62e9 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
  2. \u524d\u4e24\u8f6e\u9009\u62e9 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
  3. \u82e5\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(5\\) \uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u4e3a\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u4e0e\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

\u56fe 13-11 \u00a0 \u4e0d\u540c\u9009\u62e9\u987a\u5e8f\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

\u603b\u7ed3\u6765\u770b\uff0c\u7ed9\u5b9a\u8f93\u5165\u6570\u7ec4 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8bbe\u641c\u7d22\u8fc7\u7a0b\u4e2d\u7684\u9009\u62e9\u5e8f\u5217\u4e3a \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5219\u8be5\u9009\u62e9\u5e8f\u5217\u9700\u8981\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6ee1\u8db3\u8be5\u6761\u4ef6\u7684\u9009\u62e9\u5e8f\u5217\u90fd\u4f1a\u9020\u6210\u91cd\u590d\uff0c\u5e94\u5f53\u526a\u679d\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4e3a\u5b9e\u73b0\u8be5\u526a\u679d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u53d8\u91cf start \uff0c\u7528\u4e8e\u6307\u793a\u904d\u5386\u8d77\u59cb\u70b9\u3002\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i\\) \u5f00\u59cb\u904d\u5386\u3002\u8fd9\u6837\u505a\u5c31\u53ef\u4ee5\u8ba9\u9009\u62e9\u5e8f\u5217\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4ece\u800c\u4fdd\u8bc1\u5b50\u96c6\u552f\u4e00\u3002

\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u5bf9\u4ee3\u7801\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4e24\u9879\u4f18\u5316\u3002

  • \u5728\u5f00\u542f\u641c\u7d22\u524d\uff0c\u5148\u5c06\u6570\u7ec4 nums \u6392\u5e8f\u3002\u5728\u904d\u5386\u6240\u6709\u9009\u62e9\u65f6\uff0c\u5f53\u5b50\u96c6\u548c\u8d85\u8fc7 target \u65f6\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\uff0c\u56e0\u4e3a\u540e\u8fb9\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target \u3002
  • \u7701\u53bb\u5143\u7d20\u548c\u53d8\u91cf total \uff0c\u901a\u8fc7\u5728 target \u4e0a\u6267\u884c\u51cf\u6cd5\u6765\u7edf\u8ba1\u5143\u7d20\u548c\uff0c\u5f53 target \u7b49\u4e8e \\(0\\) \u65f6\u8bb0\u5f55\u89e3\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_i.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_i.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_i.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_i.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                           // \u904d\u5386\u8d77\u59cb\u70b9\n    backtrack(target, nums, numsSize, start);\n}\n
subset_sum_i.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
subset_sum_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-12 \u6240\u793a\u4e3a\u5c06\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u8f93\u5165\u4ee5\u4e0a\u4ee3\u7801\u540e\u7684\u6574\u4f53\u56de\u6eaf\u8fc7\u7a0b\u3002

\u56fe 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u8fc7\u7a0b

"},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u8651\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u53ef\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

\u76f8\u6bd4\u4e8e\u4e0a\u9898\uff0c\u672c\u9898\u7684\u8f93\u5165\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd9\u5f15\u5165\u4e86\u65b0\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u6570\u7ec4 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u5219\u73b0\u6709\u4ee3\u7801\u7684\u8f93\u51fa\u7ed3\u679c\u4e3a \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73b0\u4e86\u91cd\u590d\u5b50\u96c6\u3002

\u9020\u6210\u8fd9\u79cd\u91cd\u590d\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f6e\u4e2d\u88ab\u591a\u6b21\u9009\u62e9\u3002\u5728\u56fe 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f6e\u5171\u6709\u4e09\u4e2a\u9009\u62e9\uff0c\u5176\u4e2d\u4e24\u4e2a\u90fd\u4e3a \\(4\\) \uff0c\u4f1a\u4ea7\u751f\u4e24\u4e2a\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\uff0c\u4ece\u800c\u8f93\u51fa\u91cd\u590d\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f6e\u7684\u4e24\u4e2a \\(4\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002

\u56fe 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

"},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5b9e\u73b0\u65b9\u5f0f\u6bd4\u8f83\u5de7\u5999\uff1a\u7531\u4e8e\u6570\u7ec4\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u90bb\u7684\u3002\u8fd9\u610f\u5473\u7740\u5728\u67d0\u8f6e\u9009\u62e9\u4e2d\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u4e0e\u5176\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u5219\u8bf4\u660e\u5b83\u5df2\u7ecf\u88ab\u9009\u62e9\u8fc7\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u8fc7\u5f53\u524d\u5143\u7d20\u3002

\u4e0e\u6b64\u540c\u65f6\uff0c\u672c\u9898\u89c4\u5b9a\u6bcf\u4e2a\u6570\u7ec4\u5143\u7d20\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5e78\u8fd0\u7684\u662f\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5229\u7528\u53d8\u91cf start \u6765\u6ee1\u8db3\u8be5\u7ea6\u675f\uff1a\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i + 1\\) \u5f00\u59cb\u5411\u540e\u904d\u5386\u3002\u8fd9\u6837\u65e2\u80fd\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u590d\u9009\u62e9\u5143\u7d20\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_ii.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_ii.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_ii.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_ii.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_ii.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u5f00\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
subset_sum_ii.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
subset_sum_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-14 \u5c55\u793a\u4e86\u6570\u7ec4 \\([4, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u8fc7\u7a0b\uff0c\u5171\u5305\u542b\u56db\u79cd\u526a\u679d\u64cd\u4f5c\u3002\u8bf7\u4f60\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u6ce8\u91ca\u76f8\u7ed3\u5408\uff0c\u7406\u89e3\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u79cd\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

\u56fe 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u8fc7\u7a0b

"},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u662f\u7a77\u4e3e\u6cd5\uff0c\u901a\u8fc7\u5bf9\u89e3\u7a7a\u95f4\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6765\u5bfb\u627e\u7b26\u5408\u6761\u4ef6\u7684\u89e3\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u9047\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u5219\u8bb0\u5f55\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u904d\u5386\u5b8c\u6210\u540e\u7ed3\u675f\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u7684\u641c\u7d22\u8fc7\u7a0b\u5305\u62ec\u5c1d\u8bd5\u4e0e\u56de\u9000\u4e24\u4e2a\u90e8\u5206\u3002\u5b83\u901a\u8fc7\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u6765\u5c1d\u8bd5\u5404\u79cd\u9009\u62e9\uff0c\u5f53\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u60c5\u51b5\u65f6\uff0c\u5219\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002\u5c1d\u8bd5\u4e0e\u56de\u9000\u662f\u4e24\u4e2a\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
  • \u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u5b83\u4eec\u53ef\u7528\u4e8e\u5b9e\u73b0\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7ed3\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u7d22\u6548\u7387\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u4e8e\u89e3\u51b3\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u3002\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u867d\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u7b97\u6cd5\u89e3\u51b3\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
  • \u5168\u6392\u5217\u95ee\u9898\u65e8\u5728\u641c\u7d22\u7ed9\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e2a\u5143\u7d20\u662f\u5426\u88ab\u9009\u62e9\uff0c\u526a\u6389\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\u7684\u641c\u7d22\u5206\u652f\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002
  • \u5728\u5168\u6392\u5217\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff0c\u5219\u6700\u7ec8\u7ed3\u679c\u4f1a\u51fa\u73b0\u91cd\u590d\u6392\u5217\u3002\u6211\u4eec\u9700\u8981\u7ea6\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u8fd9\u901a\u5e38\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\u6765\u5b9e\u73b0\u3002
  • \u5b50\u96c6\u548c\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u7ed9\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u4e3a\u76ee\u6807\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u800c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u8f93\u51fa\u6240\u6709\u987a\u5e8f\u7684\u7ed3\u679c\uff0c\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002\u6211\u4eec\u5728\u56de\u6eaf\u524d\u5c06\u6570\u636e\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u8bbe\u7f6e\u4e00\u4e2a\u53d8\u91cf\u6765\u6307\u793a\u6bcf\u4e00\u8f6e\u7684\u904d\u5386\u8d77\u59cb\u70b9\uff0c\u4ece\u800c\u5c06\u751f\u6210\u91cd\u590d\u5b50\u96c6\u7684\u641c\u7d22\u5206\u652f\u8fdb\u884c\u526a\u679d\u3002
  • \u5bf9\u4e8e\u5b50\u96c6\u548c\u95ee\u9898\uff0c\u6570\u7ec4\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u4f1a\u4ea7\u751f\u91cd\u590d\u96c6\u5408\u3002\u6211\u4eec\u5229\u7528\u6570\u7ec4\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\uff0c\u901a\u8fc7\u5224\u65ad\u76f8\u90bb\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5b9e\u73b0\u526a\u679d\uff0c\u4ece\u800c\u786e\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u4e2d\u4e00\u6b21\u3002
  • \\(n\\) \u7687\u540e\u95ee\u9898\u65e8\u5728\u5bfb\u627e\u5c06 \\(n\\) \u4e2a\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76d8\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u4e24\u4e24\u4e4b\u95f4\u65e0\u6cd5\u653b\u51fb\u5bf9\u65b9\u3002\u8be5\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6\u6709\u884c\u7ea6\u675f\u3001\u5217\u7ea6\u675f\u3001\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002\u4e3a\u6ee1\u8db3\u884c\u7ea6\u675f\uff0c\u6211\u4eec\u91c7\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8bc1\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002
  • \u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u5904\u7406\u65b9\u5f0f\u7c7b\u4f3c\u3002\u5bf9\u4e8e\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u4ece\u800c\u6307\u793a\u9009\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5bf9\u4e8e\u5bf9\u89d2\u7ebf\u7ea6\u675f\uff0c\u6211\u4eec\u501f\u52a9\u4e24\u4e2a\u6570\u7ec4\u6765\u5206\u522b\u8bb0\u5f55\u8be5\u4e3b\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96be\u70b9\u5728\u4e8e\u627e\u5904\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5bf9\u89d2\u7ebf\u4e0a\u683c\u5b50\u6ee1\u8db3\u7684\u884c\u5217\u7d22\u5f15\u89c4\u5f8b\u3002
"},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u600e\u4e48\u7406\u89e3\u56de\u6eaf\u548c\u9012\u5f52\u7684\u5173\u7cfb\uff1f

\u603b\u7684\u6765\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u79cd\u201c\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u9012\u5f52\u66f4\u50cf\u662f\u4e00\u4e2a\u201c\u5de5\u5177\u201d\u3002

  • \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u9012\u5f52\u7684\u5e94\u7528\u573a\u666f\u4e4b\u4e00\uff0c\u662f\u9012\u5f52\u5728\u641c\u7d22\u95ee\u9898\u4e2d\u7684\u5e94\u7528\u3002
  • \u9012\u5f52\u7684\u7ed3\u6784\u4f53\u73b0\u4e86\u201c\u5b50\u95ee\u9898\u5206\u89e3\u201d\u7684\u89e3\u9898\u8303\u5f0f\uff0c\u5e38\u7528\u4e8e\u89e3\u51b3\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\uff08\u8bb0\u5fc6\u5316\u9012\u5f52\uff09\u7b49\u95ee\u9898\u3002
"},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

Abstract

\u590d\u6742\u5ea6\u5206\u6790\u72b9\u5982\u6d69\u701a\u7684\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u65f6\u7a7a\u5411\u5bfc\u3002

\u5b83\u5e26\u9886\u6211\u4eec\u5728\u65f6\u95f4\u4e0e\u7a7a\u95f4\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5bfb\u627e\u66f4\u4f18\u96c5\u7684\u89e3\u51b3\u65b9\u6848\u3002

"},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30
  • 2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52
  • 2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6
  • 2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6
  • 2.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52","text":"

\u5728\u7b97\u6cd5\u4e2d\uff0c\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u662f\u5f88\u5e38\u89c1\u7684\uff0c\u5b83\u4e0e\u590d\u6742\u5ea6\u5206\u6790\u606f\u606f\u76f8\u5173\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7ecd\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u6765\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u91cd\u590d\u6267\u884c\u4efb\u52a1\uff0c\u5373\u4e24\u79cd\u57fa\u672c\u7684\u7a0b\u5e8f\u63a7\u5236\u7ed3\u6784\uff1a\u8fed\u4ee3\u3001\u9012\u5f52\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

\u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u79cd\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u7684\u63a7\u5236\u7ed3\u6784\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5e8f\u4f1a\u5728\u6ee1\u8db3\u4e00\u5b9a\u7684\u6761\u4ef6\u4e0b\u91cd\u590d\u6267\u884c\u67d0\u6bb5\u4ee3\u7801\uff0c\u76f4\u5230\u8fd9\u4e2a\u6761\u4ef6\u4e0d\u518d\u6ee1\u8db3\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u5faa\u73af","text":"

for \u5faa\u73af\u662f\u6700\u5e38\u89c1\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9002\u5408\u5728\u9884\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6570\u65f6\u4f7f\u7528\u3002

\u4ee5\u4e0b\u51fd\u6570\u57fa\u4e8e for \u5faa\u73af\u5b9e\u73b0\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7ed3\u679c\u4f7f\u7528\u53d8\u91cf res \u8bb0\u5f55\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5bf9\u5e94\u7684\u533a\u95f4\u662f\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\uff0c\u5bf9\u5e94\u7684\u904d\u5386\u8303\u56f4\u4e3a \\(a, a + 1, \\dots, b-1\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-1 \u662f\u8be5\u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe\u3002

\u56fe 2-1 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe

\u6b64\u6c42\u548c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u6210\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u8fd9\u4e2a\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u76f8\u5173\u5185\u5bb9\u5c06\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u5faa\u73af","text":"

\u4e0e for \u5faa\u73af\u7c7b\u4f3c\uff0cwhile \u5faa\u73af\u4e5f\u662f\u4e00\u79cd\u5b9e\u73b0\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u7a0b\u5e8f\u6bcf\u8f6e\u90fd\u4f1a\u5148\u68c0\u67e5\u6761\u4ef6\uff0c\u5982\u679c\u6761\u4ef6\u4e3a\u771f\uff0c\u5219\u7ee7\u7eed\u6267\u884c\uff0c\u5426\u5219\u5c31\u7ed3\u675f\u5faa\u73af\u3002

\u4e0b\u9762\u6211\u4eec\u7528 while \u5faa\u73af\u6765\u5b9e\u73b0\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
iteration.cpp
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
iteration.zig
// while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

while \u5faa\u73af\u6bd4 for \u5faa\u73af\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u5730\u8bbe\u8ba1\u6761\u4ef6\u53d8\u91cf\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9aa4\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6761\u4ef6\u53d8\u91cf \\(i\\) \u6bcf\u8f6e\u8fdb\u884c\u4e24\u6b21\u66f4\u65b0\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u5faa\u73af\u5b9e\u73b0\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u7684\u6765\u8bf4\uff0cfor \u5faa\u73af\u7684\u4ee3\u7801\u66f4\u52a0\u7d27\u51d1\uff0cwhile \u5faa\u73af\u66f4\u52a0\u7075\u6d3b\uff0c\u4e24\u8005\u90fd\u53ef\u4ee5\u5b9e\u73b0\u8fed\u4ee3\u7ed3\u6784\u3002\u9009\u62e9\u4f7f\u7528\u54ea\u4e00\u4e2a\u5e94\u8be5\u6839\u636e\u7279\u5b9a\u95ee\u9898\u7684\u9700\u6c42\u6765\u51b3\u5b9a\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5d4c\u5957\u5faa\u73af","text":"

\u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\u5185\u5d4c\u5957\u53e6\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\uff0c\u4e0b\u9762\u4ee5 for \u5faa\u73af\u4e3a\u4f8b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-2 \u662f\u8be5\u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe\u3002

\u56fe 2-2 \u00a0 \u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe

\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u548c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u5173\u7cfb\u201d\u3002

\u6211\u4eec\u53ef\u4ee5\u7ee7\u7eed\u6dfb\u52a0\u5d4c\u5957\u5faa\u73af\uff0c\u6bcf\u4e00\u6b21\u5d4c\u5957\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7ef4\u201d\uff0c\u5c06\u4f1a\u4f7f\u65f6\u95f4\u590d\u6742\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u5173\u7cfb\u201d\u201c\u56db\u6b21\u65b9\u5173\u7cfb\u201d\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u9012\u5f52","text":"

\u9012\u5f52\uff08recursion\uff09\u662f\u4e00\u79cd\u7b97\u6cd5\u7b56\u7565\uff0c\u901a\u8fc7\u51fd\u6570\u8c03\u7528\u81ea\u8eab\u6765\u89e3\u51b3\u95ee\u9898\u3002\u5b83\u4e3b\u8981\u5305\u542b\u4e24\u4e2a\u9636\u6bb5\u3002

  1. \u9012\uff1a\u7a0b\u5e8f\u4e0d\u65ad\u6df1\u5165\u5730\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u4f20\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\uff0c\u76f4\u5230\u8fbe\u5230\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u3002
  2. \u5f52\uff1a\u89e6\u53d1\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u540e\uff0c\u7a0b\u5e8f\u4ece\u6700\u6df1\u5c42\u7684\u9012\u5f52\u51fd\u6570\u5f00\u59cb\u9010\u5c42\u8fd4\u56de\uff0c\u6c47\u805a\u6bcf\u4e00\u5c42\u7684\u7ed3\u679c\u3002

\u800c\u4ece\u5b9e\u73b0\u7684\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u4ee3\u7801\u4e3b\u8981\u5305\u542b\u4e09\u4e2a\u8981\u7d20\u3002

  1. \u7ec8\u6b62\u6761\u4ef6\uff1a\u7528\u4e8e\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u7531\u201c\u9012\u201d\u8f6c\u201c\u5f52\u201d\u3002
  2. \u9012\u5f52\u8c03\u7528\uff1a\u5bf9\u5e94\u201c\u9012\u201d\uff0c\u51fd\u6570\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u8f93\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\u3002
  3. \u8fd4\u56de\u7ed3\u679c\uff1a\u5bf9\u5e94\u201c\u5f52\u201d\uff0c\u5c06\u5f53\u524d\u9012\u5f52\u5c42\u7ea7\u7684\u7ed3\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c42\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u53ea\u9700\u8c03\u7528\u51fd\u6570 recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8ba1\u7b97\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
recursion.cpp
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.java
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.cs
/* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.go
/* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.swift
/* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.js
/* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.ts
/* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.dart
/* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
recursion.rs
/* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
recursion.c
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.kt
/* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.rb
### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
recursion.zig
// \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-3 \u5c55\u793a\u4e86\u8be5\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b\u3002

\u56fe 2-3 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b

\u867d\u7136\u4ece\u8ba1\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u4e0e\u9012\u5f52\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7ed3\u679c\uff0c\u4f46\u5b83\u4eec\u4ee3\u8868\u4e86\u4e24\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u51b3\u95ee\u9898\u7684\u8303\u5f0f\u3002

  • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u4ece\u6700\u57fa\u7840\u7684\u6b65\u9aa4\u5f00\u59cb\uff0c\u7136\u540e\u4e0d\u65ad\u91cd\u590d\u6216\u7d2f\u52a0\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u76f4\u5230\u4efb\u52a1\u5b8c\u6210\u3002
  • \u9012\u5f52\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u8fd9\u4e9b\u5b50\u95ee\u9898\u548c\u539f\u95ee\u9898\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u6765\u5c06\u5b50\u95ee\u9898\u7ee7\u7eed\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u51b5\u65f6\u505c\u6b62\uff08\u57fa\u672c\u60c5\u51b5\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

\u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u6570\u4e3a\u4f8b\uff0c\u8bbe\u95ee\u9898 \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

  • \u8fed\u4ee3\uff1a\u5728\u5faa\u73af\u4e2d\u6a21\u62df\u6c42\u548c\u8fc7\u7a0b\uff0c\u4ece \\(1\\) \u904d\u5386\u5230 \\(n\\) \uff0c\u6bcf\u8f6e\u6267\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
  • \u9012\u5f52\uff1a\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u5b50\u95ee\u9898 \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65ad\uff08\u9012\u5f52\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u51b5 \\(f(1) = 1\\) \u65f6\u7ec8\u6b62\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u8c03\u7528\u6808","text":"

\u9012\u5f52\u51fd\u6570\u6bcf\u6b21\u8c03\u7528\u81ea\u8eab\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u4e3a\u65b0\u5f00\u542f\u7684\u51fd\u6570\u5206\u914d\u5185\u5b58\uff0c\u4ee5\u5b58\u50a8\u5c40\u90e8\u53d8\u91cf\u3001\u8c03\u7528\u5730\u5740\u548c\u5176\u4ed6\u4fe1\u606f\u7b49\u3002\u8fd9\u5c06\u5bfc\u81f4\u4e24\u65b9\u9762\u7684\u7ed3\u679c\u3002

  • \u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u90fd\u5b58\u50a8\u5728\u79f0\u4e3a\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u7684\u5185\u5b58\u533a\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u6570\u8fd4\u56de\u540e\u624d\u4f1a\u88ab\u91ca\u653e\u3002\u56e0\u6b64\uff0c\u9012\u5f52\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
  • \u9012\u5f52\u8c03\u7528\u51fd\u6570\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5f00\u9500\u3002\u56e0\u6b64\u9012\u5f52\u901a\u5e38\u6bd4\u5faa\u73af\u7684\u65f6\u95f4\u6548\u7387\u66f4\u4f4e\u3002

\u5982\u56fe 2-4 \u6240\u793a\uff0c\u5728\u89e6\u53d1\u7ec8\u6b62\u6761\u4ef6\u524d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684\u9012\u5f52\u51fd\u6570\uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002

\u56fe 2-4 \u00a0 \u9012\u5f52\u8c03\u7528\u6df1\u5ea6

\u5728\u5b9e\u9645\u4e2d\uff0c\u7f16\u7a0b\u8bed\u8a00\u5141\u8bb8\u7684\u9012\u5f52\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u8fc7\u6df1\u7684\u9012\u5f52\u53ef\u80fd\u5bfc\u81f4\u6808\u6ea2\u51fa\u9519\u8bef\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u9012\u5f52","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u6570\u5728\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u6b65\u624d\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5219\u8be5\u51fd\u6570\u53ef\u4ee5\u88ab\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u4f18\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u4e0e\u8fed\u4ee3\u76f8\u5f53\u3002\u8fd9\u79cd\u60c5\u51b5\u88ab\u79f0\u4e3a\u5c3e\u9012\u5f52\uff08tail recursion\uff09\u3002

  • \u666e\u901a\u9012\u5f52\uff1a\u5f53\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u7684\u51fd\u6570\u540e\uff0c\u9700\u8981\u7ee7\u7eed\u6267\u884c\u4ee3\u7801\uff0c\u56e0\u6b64\u7cfb\u7edf\u9700\u8981\u4fdd\u5b58\u4e0a\u4e00\u5c42\u8c03\u7528\u7684\u4e0a\u4e0b\u6587\u3002
  • \u5c3e\u9012\u5f52\uff1a\u9012\u5f52\u8c03\u7528\u662f\u51fd\u6570\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u4e2a\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u540e\uff0c\u65e0\u987b\u7ee7\u7eed\u6267\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7edf\u65e0\u987b\u4fdd\u5b58\u4e0a\u4e00\u5c42\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u3002

\u4ee5\u8ba1\u7b97 \\(1 + 2 + \\dots + n\\) \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u7ed3\u679c\u53d8\u91cf res \u8bbe\u4e3a\u51fd\u6570\u53c2\u6570\uff0c\u4ece\u800c\u5b9e\u73b0\u5c3e\u9012\u5f52\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5c3e\u9012\u5f52\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u56fe 2-5 \u6240\u793a\u3002\u5bf9\u6bd4\u666e\u901a\u9012\u5f52\u548c\u5c3e\u9012\u5f52\uff0c\u4e24\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u6267\u884c\u70b9\u662f\u4e0d\u540c\u7684\u3002

  • \u666e\u901a\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u6bcf\u5c42\u8fd4\u56de\u540e\u90fd\u8981\u518d\u6267\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
  • \u5c3e\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u53ea\u9700\u5c42\u5c42\u8fd4\u56de\u3002

\u56fe 2-5 \u00a0 \u5c3e\u9012\u5f52\u8fc7\u7a0b

Tip

\u8bf7\u6ce8\u610f\uff0c\u8bb8\u591a\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u5e76\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\u3002\u4f8b\u5982\uff0cPython \u9ed8\u8ba4\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u6570\u662f\u5c3e\u9012\u5f52\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u4f1a\u9047\u5230\u6808\u6ea2\u51fa\u95ee\u9898\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u9012\u5f52\u6811","text":"

\u5f53\u5904\u7406\u4e0e\u201c\u5206\u6cbb\u201d\u76f8\u5173\u7684\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u9012\u5f52\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c2\u3001\u4ee3\u7801\u66f4\u52a0\u6613\u8bfb\u3002\u4ee5\u201c\u6590\u6ce2\u90a3\u5951\u6570\u5217\u201d\u4e3a\u4f8b\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6590\u6ce2\u90a3\u5951\u6570\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8be5\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u3002

\u8bbe\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u4e3a \\(f(n)\\) \uff0c\u6613\u5f97\u4e24\u4e2a\u7ed3\u8bba\u3002

  • \u6570\u5217\u7684\u524d\u4e24\u4e2a\u6570\u5b57\u4e3a \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
  • \u6570\u5217\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57\u662f\u524d\u4e24\u4e2a\u6570\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

\u6309\u7167\u9012\u63a8\u5173\u7cfb\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5c06\u524d\u4e24\u4e2a\u6570\u5b57\u4f5c\u4e3a\u7ec8\u6b62\u6761\u4ef6\uff0c\u4fbf\u53ef\u5199\u51fa\u9012\u5f52\u4ee3\u7801\u3002\u8c03\u7528 fib(n) \u5373\u53ef\u5f97\u5230\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
recursion.cpp
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.js
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
recursion.c
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.rb
### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
recursion.zig
// \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u6211\u4eec\u5728\u51fd\u6570\u5185\u9012\u5f52\u8c03\u7528\u4e86\u4e24\u4e2a\u51fd\u6570\uff0c\u8fd9\u610f\u5473\u7740\u4ece\u4e00\u4e2a\u8c03\u7528\u4ea7\u751f\u4e86\u4e24\u4e2a\u8c03\u7528\u5206\u652f\u3002\u5982\u56fe 2-6 \u6240\u793a\uff0c\u8fd9\u6837\u4e0d\u65ad\u9012\u5f52\u8c03\u7528\u4e0b\u53bb\uff0c\u6700\u7ec8\u5c06\u4ea7\u751f\u4e00\u68f5\u5c42\u6570\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff08recursion tree\uff09\u3002

\u56fe 2-6 \u00a0 \u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u9012\u5f52\u6811

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9012\u5f52\u4f53\u73b0\u4e86\u201c\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u5b50\u95ee\u9898\u201d\u7684\u601d\u7ef4\u8303\u5f0f\uff0c\u8fd9\u79cd\u5206\u6cbb\u7b56\u7565\u81f3\u5173\u91cd\u8981\u3002

  • \u4ece\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u7d22\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u7b49\u8bb8\u591a\u91cd\u8981\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5e94\u7528\u4e86\u8fd9\u79cd\u601d\u7ef4\u65b9\u5f0f\u3002
  • \u4ece\u6570\u636e\u7ed3\u6784\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u5929\u7136\u9002\u5408\u5904\u7406\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u76f8\u5173\u95ee\u9898\uff0c\u56e0\u4e3a\u5b83\u4eec\u975e\u5e38\u9002\u5408\u7528\u5206\u6cbb\u601d\u60f3\u8fdb\u884c\u5206\u6790\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u4e24\u8005\u5bf9\u6bd4","text":"

\u603b\u7ed3\u4ee5\u4e0a\u5185\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5b9e\u73b0\u3001\u6027\u80fd\u548c\u9002\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

\u8868 2-1 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52\u7279\u70b9\u5bf9\u6bd4

\u8fed\u4ee3 \u9012\u5f52 \u5b9e\u73b0\u65b9\u5f0f \u5faa\u73af\u7ed3\u6784 \u51fd\u6570\u8c03\u7528\u81ea\u8eab \u65f6\u95f4\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f83\u9ad8\uff0c\u65e0\u51fd\u6570\u8c03\u7528\u5f00\u9500 \u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u90fd\u4f1a\u4ea7\u751f\u5f00\u9500 \u5185\u5b58\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u5185\u5b58\u7a7a\u95f4 \u7d2f\u79ef\u51fd\u6570\u8c03\u7528\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u6808\u5e27\u7a7a\u95f4 \u9002\u7528\u95ee\u9898 \u9002\u7528\u4e8e\u7b80\u5355\u5faa\u73af\u4efb\u52a1\uff0c\u4ee3\u7801\u76f4\u89c2\u3001\u53ef\u8bfb\u6027\u597d \u9002\u7528\u4e8e\u5b50\u95ee\u9898\u5206\u89e3\uff0c\u5982\u6811\u3001\u56fe\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u4ee3\u7801\u7ed3\u6784\u7b80\u6d01\u3001\u6e05\u6670

Tip

\u5982\u679c\u611f\u89c9\u4ee5\u4e0b\u5185\u5bb9\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5728\u8bfb\u5b8c\u201c\u6808\u201d\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\u3002

\u90a3\u4e48\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5177\u6709\u4ec0\u4e48\u5185\u5728\u8054\u7cfb\u5462\uff1f\u4ee5\u4e0a\u8ff0\u9012\u5f52\u51fd\u6570\u4e3a\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u9012\u5f52\u7684\u201c\u5f52\u201d\u9636\u6bb5\u8fdb\u884c\u3002\u8fd9\u610f\u5473\u7740\u6700\u521d\u88ab\u8c03\u7528\u7684\u51fd\u6570\u5b9e\u9645\u4e0a\u662f\u6700\u540e\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u8fd9\u79cd\u5de5\u4f5c\u673a\u5236\u4e0e\u6808\u7684\u201c\u5148\u5165\u540e\u51fa\u201d\u539f\u5219\u5f02\u66f2\u540c\u5de5\u3002

\u4e8b\u5b9e\u4e0a\uff0c\u201c\u8c03\u7528\u6808\u201d\u548c\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u8fd9\u7c7b\u9012\u5f52\u672f\u8bed\u5df2\u7ecf\u6697\u793a\u4e86\u9012\u5f52\u4e0e\u6808\u4e4b\u95f4\u7684\u5bc6\u5207\u5173\u7cfb\u3002

  1. \u9012\uff1a\u5f53\u51fd\u6570\u88ab\u8c03\u7528\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5728\u201c\u8c03\u7528\u6808\u201d\u4e0a\u4e3a\u8be5\u51fd\u6570\u5206\u914d\u65b0\u7684\u6808\u5e27\uff0c\u7528\u4e8e\u5b58\u50a8\u51fd\u6570\u7684\u5c40\u90e8\u53d8\u91cf\u3001\u53c2\u6570\u3001\u8fd4\u56de\u5730\u5740\u7b49\u6570\u636e\u3002
  2. \u5f52\uff1a\u5f53\u51fd\u6570\u5b8c\u6210\u6267\u884c\u5e76\u8fd4\u56de\u65f6\uff0c\u5bf9\u5e94\u7684\u6808\u5e27\u4f1a\u88ab\u4ece\u201c\u8c03\u7528\u6808\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u590d\u4e4b\u524d\u51fd\u6570\u7684\u6267\u884c\u73af\u5883\u3002

\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u8c03\u7528\u6808\u7684\u884c\u4e3a\uff0c\u4ece\u800c\u5c06\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u5f62\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u5f53\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u540e\uff0c\u4ee3\u7801\u53d8\u5f97\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5c3d\u7ba1\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5f88\u591a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f6c\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u8fd9\u6837\u505a\uff0c\u6709\u4ee5\u4e0b\u4e24\u70b9\u539f\u56e0\u3002

  • \u8f6c\u5316\u540e\u7684\u4ee3\u7801\u53ef\u80fd\u66f4\u52a0\u96be\u4ee5\u7406\u89e3\uff0c\u53ef\u8bfb\u6027\u66f4\u5dee\u3002
  • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\u7684\u884c\u4e3a\u53ef\u80fd\u975e\u5e38\u56f0\u96be\u3002

\u603b\u4e4b\uff0c\u9009\u62e9\u8fed\u4ee3\u8fd8\u662f\u9012\u5f52\u53d6\u51b3\u4e8e\u7279\u5b9a\u95ee\u9898\u7684\u6027\u8d28\u3002\u5728\u7f16\u7a0b\u5b9e\u8df5\u4e2d\uff0c\u6743\u8861\u4e24\u8005\u7684\u4f18\u52a3\u5e76\u6839\u636e\u60c5\u5883\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u81f3\u5173\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":"

\u5728\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\u3002

  1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\uff1a\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
  2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\uff1a\u540c\u4e00\u4e2a\u95ee\u9898\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u89e3\u6cd5\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u5c3d\u53ef\u80fd\u9ad8\u6548\u7684\u7b97\u6cd5\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u4e3a\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u4e24\u4e2a\u7ef4\u5ea6\u3002

  • \u65f6\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u7684\u5927\u5c0f\u3002

\u7b80\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u8bbe\u8ba1\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u8fd9\u6837\uff0c\u6211\u4eec\u624d\u80fd\u5c06\u5404\u79cd\u7b97\u6cd5\u8fdb\u884c\u5bf9\u6bd4\uff0c\u8fdb\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

\u6548\u7387\u8bc4\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u4e3a\u4e24\u79cd\uff1a\u5b9e\u9645\u6d4b\u8bd5\u3001\u7406\u8bba\u4f30\u7b97\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5b9e\u9645\u6d4b\u8bd5","text":"

\u5047\u8bbe\u6211\u4eec\u73b0\u5728\u6709\u7b97\u6cd5 A \u548c\u7b97\u6cd5 B \uff0c\u5b83\u4eec\u90fd\u80fd\u89e3\u51b3\u540c\u4e00\u95ee\u9898\uff0c\u73b0\u5728\u9700\u8981\u5bf9\u6bd4\u8fd9\u4e24\u4e2a\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u53f0\u8ba1\u7b97\u673a\uff0c\u8fd0\u884c\u8fd9\u4e24\u4e2a\u7b97\u6cd5\uff0c\u5e76\u76d1\u63a7\u8bb0\u5f55\u5b83\u4eec\u7684\u8fd0\u884c\u65f6\u95f4\u548c\u5185\u5b58\u5360\u7528\u60c5\u51b5\u3002\u8fd9\u79cd\u8bc4\u4f30\u65b9\u5f0f\u80fd\u591f\u53cd\u6620\u771f\u5b9e\u60c5\u51b5\uff0c\u4f46\u4e5f\u5b58\u5728\u8f83\u5927\u7684\u5c40\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u96be\u4ee5\u6392\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5e72\u6270\u56e0\u7d20\u3002\u786c\u4ef6\u914d\u7f6e\u4f1a\u5f71\u54cd\u7b97\u6cd5\u7684\u6027\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u53f0\u8ba1\u7b97\u673a\u4e2d\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u53f0\u914d\u7f6e\u4e0d\u540c\u7684\u8ba1\u7b97\u673a\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6d4b\u8bd5\u7ed3\u679c\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u9700\u8981\u5728\u5404\u79cd\u673a\u5668\u4e0a\u8fdb\u884c\u6d4b\u8bd5\uff0c\u7edf\u8ba1\u5e73\u5747\u6548\u7387\uff0c\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u5f00\u5b8c\u6574\u6d4b\u8bd5\u975e\u5e38\u8017\u8d39\u8d44\u6e90\u3002\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u7684\u53d8\u5316\uff0c\u7b97\u6cd5\u4f1a\u8868\u73b0\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u5f97\u5230\u6709\u8bf4\u670d\u529b\u7684\u7ed3\u8bba\uff0c\u6211\u4eec\u9700\u8981\u6d4b\u8bd5\u5404\u79cd\u89c4\u6a21\u7684\u8f93\u5165\u6570\u636e\uff0c\u800c\u8fd9\u9700\u8981\u8017\u8d39\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8bba\u4f30\u7b97","text":"

\u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4ec5\u901a\u8fc7\u4e00\u4e9b\u8ba1\u7b97\u6765\u8bc4\u4f30\u7b97\u6cd5\u7684\u6548\u7387\u3002\u8fd9\u79cd\u4f30\u7b97\u65b9\u6cd5\u88ab\u79f0\u4e3a\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7b80\u79f0\u590d\u6742\u5ea6\u5206\u6790\u3002

\u590d\u6742\u5ea6\u5206\u6790\u80fd\u591f\u4f53\u73b0\u7b97\u6cd5\u8fd0\u884c\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e4b\u95f4\u7684\u5173\u7cfb\u3002\u5b83\u63cf\u8ff0\u4e86\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u7b97\u6cd5\u6267\u884c\u6240\u9700\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u5b9a\u4e49\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u5206\u4e3a\u4e09\u4e2a\u91cd\u70b9\u6765\u7406\u89e3\u3002

  • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u201d\u5206\u522b\u5bf9\u5e94\u65f6\u95f4\u590d\u6742\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u3002
  • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u7740\u590d\u6742\u5ea6\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u4f53\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\u3002
  • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u4e0d\u662f\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\u7684\u5177\u4f53\u503c\uff0c\u800c\u662f\u65f6\u95f4\u6216\u7a7a\u95f4\u589e\u957f\u7684\u201c\u5feb\u6162\u201d\u3002

\u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u4f53\u73b0\u5728\u4ee5\u4e0b\u4e24\u4e2a\u65b9\u9762\u3002

  • \u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002
  • \u5b83\u53ef\u4ee5\u4f53\u73b0\u4e0d\u540c\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6027\u80fd\u3002

Tip

\u5982\u679c\u4f60\u4ecd\u5bf9\u590d\u6742\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u987b\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

\u590d\u6742\u5ea6\u5206\u6790\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u628a\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6807\u5c3a\u201d\uff0c\u4f7f\u6211\u4eec\u53ef\u4ee5\u8861\u91cf\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5bf9\u6bd4\u4e0d\u540c\u7b97\u6cd5\u4e4b\u95f4\u7684\u6548\u7387\u3002

\u590d\u6742\u5ea6\u662f\u4e2a\u6570\u5b66\u6982\u5ff5\uff0c\u5bf9\u4e8e\u521d\u5b66\u8005\u53ef\u80fd\u6bd4\u8f83\u62bd\u8c61\uff0c\u5b66\u4e60\u96be\u5ea6\u76f8\u5bf9\u8f83\u9ad8\u3002\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u770b\uff0c\u590d\u6742\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9002\u5408\u4f5c\u4e3a\u6700\u5148\u4ecb\u7ecd\u7684\u5185\u5bb9\u3002\u7136\u800c\uff0c\u5f53\u6211\u4eec\u8ba8\u8bba\u67d0\u4e2a\u6570\u636e\u7ed3\u6784\u6216\u7b97\u6cd5\u7684\u7279\u70b9\u65f6\uff0c\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002

\u7efc\u4e0a\u6240\u8ff0\uff0c\u5efa\u8bae\u4f60\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u4ee5\u4fbf\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u7b97\u6cd5\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u6982\u5ff5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u5e38\u7c7b\u4f3c\uff0c\u53ea\u9700\u5c06\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u66ff\u6362\u4e3a\u201c\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u201d\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

  • \u8f93\u5165\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\u3002
  • \u6682\u5b58\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\u3002
  • \u8f93\u51fa\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\u3002

\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u7edf\u8ba1\u8303\u56f4\u662f\u201c\u6682\u5b58\u7a7a\u95f4\u201d\u52a0\u4e0a\u201c\u8f93\u51fa\u7a7a\u95f4\u201d\u3002

\u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

  • \u6682\u5b58\u6570\u636e\uff1a\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
  • \u6808\u5e27\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u8c03\u7528\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u3002\u7cfb\u7edf\u5728\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\u90fd\u4f1a\u5728\u6808\u9876\u90e8\u521b\u5efa\u4e00\u4e2a\u6808\u5e27\uff0c\u51fd\u6570\u8fd4\u56de\u540e\uff0c\u6808\u5e27\u7a7a\u95f4\u4f1a\u88ab\u91ca\u653e\u3002
  • \u6307\u4ee4\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u7f16\u8bd1\u540e\u7684\u7a0b\u5e8f\u6307\u4ee4\uff0c\u5728\u5b9e\u9645\u7edf\u8ba1\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8ba1\u3002

\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u7edf\u8ba1\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u8f93\u51fa\u6570\u636e\u4e09\u90e8\u5206\uff0c\u5982\u56fe 2-15 \u6240\u793a\u3002

\u56fe 2-15 \u00a0 \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class Node:\n    \"\"\"\u7c7b\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u8282\u70b9\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\n    A = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function()        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return A + b + c      # \u8f93\u51fa\u6570\u636e\n
/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    final int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new(0);       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = Function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7ed3\u6784\u4f53 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\n    const a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    newNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u6570 */\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\n    let a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\n    const a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\n    const a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f93\u5165\u6570\u636e\n  const int a = 0;      // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n  int b = 0;            // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n  Node node = Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n  int c = function();   // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n  return a + b + c;     // \u8f93\u51fa\u6570\u636e\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u521b\u5efa Node \u7ed3\u6784\u4f53 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u6570 */\nfn function() -> i32 {      \n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f93\u5165\u6570\u636e\n    const a: i32 = 0;               // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let mut b = 0;                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node::new(0);        // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function();             // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;               // \u8f93\u51fa\u6570\u636e\n}\n
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\n    const int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    int c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f93\u5165\u6570\u636e\n    val a = 0                // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    val node = Node(0)       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    val c = function()       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c         // \u8f93\u51fa\u6570\u636e\n}\n
### \u7c7b ###\nclass Node\n    attr_accessor :val      # \u8282\u70b9\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u6570 ###\ndef function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f93\u5165\u6570\u636e\n    a = 0               # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b = 0               # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node.new(0)  # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    a + b + c           # \u8f93\u51fa\u6570\u636e\nend\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002

\u800c\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u3002\u8fd9\u662f\u56e0\u4e3a\u5185\u5b58\u7a7a\u95f4\u662f\u4e00\u9879\u786c\u6027\u8981\u6c42\uff0c\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u5728\u6240\u6709\u8f93\u5165\u6570\u636e\u4e0b\u90fd\u6709\u8db3\u591f\u7684\u5185\u5b58\u7a7a\u95f4\u9884\u7559\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\u3002

  1. \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\uff1a\u5f53 \\(n < 10\\) \u65f6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u4f46\u5f53 \\(n > 10\\) \u65f6\uff0c\u521d\u59cb\u5316\u7684\u6570\u7ec4 nums \u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
  2. \u4ee5\u7b97\u6cd5\u8fd0\u884c\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\uff1a\u4f8b\u5982\uff0c\u7a0b\u5e8f\u5728\u6267\u884c\u6700\u540e\u4e00\u884c\u4e4b\u524d\uff0c\u5360\u7528 \\(O(1)\\) \u7a7a\u95f4\uff1b\u5f53\u521d\u59cb\u5316\u6570\u7ec4 nums \u65f6\uff0c\u7a0b\u5e8f\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
\n

\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def function() -> int:\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
fun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
def function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
\n

\u51fd\u6570 loop() \u548c recur() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u4f46\u7a7a\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u3002

  • \u51fd\u6570 loop() \u5728\u5faa\u73af\u4e2d\u8c03\u7528\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f6e\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u5e76\u91ca\u653e\u4e86\u6808\u5e27\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002
  • \u9012\u5f52\u51fd\u6570 recur() \u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 recur() \uff0c\u4ece\u800c\u5360\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002
"},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u56fe 2-16 \u5c55\u793a\u4e86\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} \\end{aligned} \\]

\u56fe 2-16 \u00a0 \u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

"},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

\u5e38\u6570\u9636\u5e38\u89c1\u4e8e\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u7684\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u5faa\u73af\u4e2d\u521d\u59cb\u5316\u53d8\u91cf\u6216\u8c03\u7528\u51fd\u6570\u800c\u5360\u7528\u7684\u5185\u5b58\uff0c\u5728\u8fdb\u5165\u4e0b\u4e00\u5faa\u73af\u540e\u5c31\u4f1a\u88ab\u91ca\u653e\uff0c\u56e0\u6b64\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u5e38\u89c1\u4e8e\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u6b63\u6bd4\u7684\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u7b49\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5373\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-17 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u5e38\u89c1\u4e8e\u77e9\u9635\u548c\u56fe\uff0c\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u5e73\u65b9\u5173\u7cfb\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 2-18 \u6240\u793a\uff0c\u8be5\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5728\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(n / 2\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-18 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u89c2\u5bdf\u56fe 2-19 \uff0c\u5c42\u6570\u4e3a \\(n\\) \u7684\u201c\u6ee1\u4e8c\u53c9\u6811\u201d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-19 \u00a0 \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u3002\u4f8b\u5982\u5f52\u5e76\u6392\u5e8f\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6808\u5e27\u7a7a\u95f4\u3002

\u518d\u4f8b\u5982\u5c06\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\uff0c\u8f93\u5165\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6743\u8861\u65f6\u95f4\u4e0e\u7a7a\u95f4","text":"

\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u80fd\u8fbe\u5230\u6700\u4f18\u3002\u7136\u800c\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u540c\u65f6\u4f18\u5316\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96be\u3002

\u964d\u4f4e\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a\u4ee3\u4ef7\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u4eec\u5c06\u727a\u7272\u5185\u5b58\u7a7a\u95f4\u6765\u63d0\u5347\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u601d\u8def\u79f0\u4e3a\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff1b\u53cd\u4e4b\uff0c\u5219\u79f0\u4e3a\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002

\u9009\u62e9\u54ea\u79cd\u601d\u8def\u53d6\u51b3\u4e8e\u6211\u4eec\u66f4\u770b\u91cd\u54ea\u4e2a\u65b9\u9762\u3002\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u65f6\u95f4\u6bd4\u7a7a\u95f4\u66f4\u5b9d\u8d35\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u5f53\u7136\uff0c\u5728\u6570\u636e\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u63a7\u5236\u7a7a\u95f4\u590d\u6742\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"

\u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

  • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e24\u4e2a\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\u3002
  • \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u6d4b\u8bd5\u6765\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96be\u4ee5\u6d88\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5f71\u54cd\uff0c\u4e14\u4f1a\u8017\u8d39\u5927\u91cf\u8ba1\u7b97\u8d44\u6e90\u3002
  • \u590d\u6742\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5b9e\u9645\u6d4b\u8bd5\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\uff0c\u5e76\u4e14\u80fd\u591f\u63ed\u793a\u7b97\u6cd5\u5728\u4e0d\u540c\u6570\u636e\u89c4\u6a21\u4e0b\u7684\u6548\u7387\u3002

\u65f6\u95f4\u590d\u6742\u5ea6

  • \u65f6\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\uff0c\u53ef\u4ee5\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f93\u5165\u7684\u6570\u636e\u91cf\u8f83\u5c0f\u6216\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\u65f6\uff0c\u65e0\u6cd5\u7cbe\u786e\u5bf9\u6bd4\u7b97\u6cd5\u6548\u7387\u7684\u4f18\u52a3\u3002
  • \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u53f7\u8868\u793a\uff0c\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
  • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
  • \u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u51e0\u4e4e\u4e0d\u7528\uff0c\u56e0\u4e3a\u8f93\u5165\u6570\u636e\u4e00\u822c\u9700\u8981\u6ee1\u8db3\u4e25\u683c\u6761\u4ef6\u624d\u80fd\u8fbe\u5230\u6700\u4f73\u60c5\u51b5\u3002
  • \u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53cd\u6620\u7b97\u6cd5\u5728\u968f\u673a\u6570\u636e\u8f93\u5165\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u7b97\u6cd5\u6027\u80fd\u3002\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u9700\u8981\u7edf\u8ba1\u8f93\u5165\u6570\u636e\u5206\u5e03\u4ee5\u53ca\u7efc\u5408\u540e\u7684\u6570\u5b66\u671f\u671b\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6

  • \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\u3002
  • \u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u76f8\u5173\u5185\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u8f93\u5165\u7a7a\u95f4\u3001\u6682\u5b58\u7a7a\u95f4\u3001\u8f93\u51fa\u7a7a\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u8f93\u5165\u7a7a\u95f4\u4e0d\u7eb3\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u6307\u4ee4\u7a7a\u95f4\uff0c\u5176\u4e2d\u6808\u5e27\u7a7a\u95f4\u901a\u5e38\u4ec5\u5728\u9012\u5f52\u51fd\u6570\u4e2d\u5f71\u54cd\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5373\u7edf\u8ba1\u7b97\u6cd5\u5728\u6700\u5dee\u8f93\u5165\u6570\u636e\u548c\u6700\u5dee\u8fd0\u884c\u65f6\u523b\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

\u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u901a\u5e38\u8ba4\u4e3a\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

Q\uff1a\u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

\u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u88ab\u72ec\u7acb\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002\u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

\u4e0b\u9762\u4ee5\u51e0\u79cd\u5e38\u89c1\u7684\u7f16\u7a0b\u8bed\u8a00\u4e3a\u4f8b\u6765\u8bf4\u660e\u3002

  • C \u8bed\u8a00\u662f\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u6ca1\u6709\u9762\u5411\u5bf9\u8c61\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u6570\u3002\u4f46\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u521b\u5efa\u7ed3\u6784\u4f53\uff08struct\uff09\u6765\u6a21\u62df\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff0c\u4e0e\u7ed3\u6784\u4f53\u76f8\u5173\u8054\u7684\u51fd\u6570\u5c31\u76f8\u5f53\u4e8e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
  • Java \u548c C# \u662f\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u4ee3\u7801\u5757\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u4e3a\u67d0\u4e2a\u7c7b\u7684\u4e00\u90e8\u5206\u3002\u9759\u6001\u65b9\u6cd5\u7684\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u51fd\u6570\uff0c\u56e0\u4e3a\u5b83\u88ab\u7ed1\u5b9a\u5728\u7c7b\u4e0a\uff0c\u4e0d\u80fd\u8bbf\u95ee\u7279\u5b9a\u7684\u5b9e\u4f8b\u53d8\u91cf\u3002
  • C++ \u548c Python \u65e2\u652f\u6301\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\uff08\u51fd\u6570\uff09\uff0c\u4e5f\u652f\u6301\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff08\u65b9\u6cd5\uff09\u3002

Q\uff1a\u56fe\u89e3\u201c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

\u4e0d\u662f\uff0c\u8be5\u56fe\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002

\u5047\u8bbe\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u6bcf\u6761\u66f2\u7ebf\u7684\u503c\u4e0e\u51fd\u6570\u5bf9\u5e94\u4e0d\u4e0a\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6761\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u4e8e\u5c06\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002

\u5728\u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\u3002\u4f46\u5bf9\u4e8e \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u65f6\u589e\u957f\u8d8b\u52bf\u5df2\u7ecf\u5360\u4e3b\u5bfc\u4e86\u3002

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u4eec\u60f3\u51c6\u786e\u9884\u4f30\u4e00\u6bb5\u4ee3\u7801\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u5e94\u8be5\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

  1. \u786e\u5b9a\u8fd0\u884c\u5e73\u53f0\uff0c\u5305\u62ec\u786c\u4ef6\u914d\u7f6e\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u7cfb\u7edf\u73af\u5883\u7b49\uff0c\u8fd9\u4e9b\u56e0\u7d20\u90fd\u4f1a\u5f71\u54cd\u4ee3\u7801\u7684\u8fd0\u884c\u6548\u7387\u3002
  2. \u8bc4\u4f30\u5404\u79cd\u8ba1\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u6253\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
  3. \u7edf\u8ba1\u4ee3\u7801\u4e2d\u6240\u6709\u7684\u8ba1\u7b97\u64cd\u4f5c\uff0c\u5e76\u5c06\u6240\u6709\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u6c42\u548c\uff0c\u4ece\u800c\u5f97\u5230\u8fd0\u884c\u65f6\u95f4\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u5faa\u73af n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n    print(0); // 5 ns\n  }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

\u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u4e3a \\((6n + 12)\\) ns \uff1a

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

\u4f46\u5b9e\u9645\u4e0a\uff0c\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73b0\u5b9e\u3002\u9996\u5148\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u5c06\u9884\u4f30\u65f6\u95f4\u548c\u8fd0\u884c\u5e73\u53f0\u7ed1\u5b9a\uff0c\u56e0\u4e3a\u7b97\u6cd5\u9700\u8981\u5728\u5404\u79cd\u4e0d\u540c\u7684\u5e73\u53f0\u4e0a\u8fd0\u884c\u3002\u5176\u6b21\uff0c\u6211\u4eec\u5f88\u96be\u83b7\u77e5\u6bcf\u79cd\u64cd\u4f5c\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u8fd9\u7ed9\u9884\u4f30\u8fc7\u7a0b\u5e26\u6765\u4e86\u6781\u5927\u7684\u96be\u5ea6\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u7edf\u8ba1\u7684\u4e0d\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u800c\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002

\u201c\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u201d\u8fd9\u4e2a\u6982\u5ff5\u6bd4\u8f83\u62bd\u8c61\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7ed9\u5b9a\u4e09\u4e2a\u7b97\u6cd5 A\u3001B \u548c C \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int):\n    print(0)\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
# \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

\u56fe 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u4e2a\u7b97\u6cd5\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

  • \u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u4e2a\u6253\u5370\u64cd\u4f5c\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e0d\u968f\u7740 \\(n\\) \u589e\u5927\u800c\u589e\u957f\u3002\u6211\u4eec\u79f0\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002
  • \u7b97\u6cd5 B \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(n\\) \u6b21\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740 \\(n\\) \u589e\u5927\u5448\u7ebf\u6027\u589e\u957f\u3002\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u9636\u201d\u3002
  • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u867d\u7136\u8fd0\u884c\u65f6\u95f4\u5f88\u957f\uff0c\u4f46\u5b83\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u3002\u56e0\u6b64 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002

\u56fe 2-7 \u00a0 \u7b97\u6cd5 A\u3001B \u548c C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

\u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u70b9\u5462\uff1f

  • \u65f6\u95f4\u590d\u6742\u5ea6\u80fd\u591f\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u7b97\u6cd5 B \u7684\u8fd0\u884c\u65f6\u95f4\u5448\u7ebf\u6027\u589e\u957f\uff0c\u5728 \\(n > 1\\) \u65f6\u6bd4\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u201c\u7ebf\u6027\u9636\u201d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u7684\u542b\u4e49\u3002
  • \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7b80\u4fbf\u3002\u663e\u7136\uff0c\u8fd0\u884c\u5e73\u53f0\u548c\u8ba1\u7b97\u64cd\u4f5c\u7c7b\u578b\u90fd\u4e0e\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u65e0\u5173\u3002\u56e0\u6b64\u5728\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u5c06\u6240\u6709\u8ba1\u7b97\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u89c6\u4e3a\u76f8\u540c\u7684\u201c\u5355\u4f4d\u65f6\u95f4\u201d\uff0c\u4ece\u800c\u5c06\u201c\u8ba1\u7b97\u64cd\u4f5c\u8fd0\u884c\u65f6\u95f4\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u4e00\u6765\u4f30\u7b97\u96be\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u5c40\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5c3d\u7ba1\u7b97\u6cd5 A \u548c C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\uff0c\u4f46\u5b9e\u9645\u8fd0\u884c\u65f6\u95f4\u5dee\u522b\u5f88\u5927\u3002\u540c\u6837\uff0c\u5c3d\u7ba1\u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 B \u660e\u663e\u4f18\u4e8e\u7b97\u6cd5 C \u3002\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5f88\u96be\u4ec5\u51ed\u65f6\u95f4\u590d\u6742\u5ea6\u5224\u65ad\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u5f53\u7136\uff0c\u5c3d\u7ba1\u5b58\u5728\u4e0a\u8ff0\u95ee\u9898\uff0c\u590d\u6742\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8bc4\u5224\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
"},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u8f93\u5165\u5927\u5c0f\u4e3a \\(n\\) \u7684\u51fd\u6570\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u5faa\u73af n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

\u8bbe\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u662f\u4e00\u4e2a\u5173\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u7684\u51fd\u6570\uff0c\u8bb0\u4e3a \\(T(n)\\) \uff0c\u5219\u4ee5\u4e0a\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a\uff1a

\\[ T(n) = 3 + 2n \\]

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u5176\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u7ebf\u6027\u9636\u3002

\u6211\u4eec\u5c06\u7ebf\u6027\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8bb0\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e2a\u6570\u5b66\u7b26\u53f7\u79f0\u4e3a\u5927 \\(O\\) \u8bb0\u53f7\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u6e10\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u786e\u7684\u6570\u5b66\u5b9a\u4e49\u3002

\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c

\u82e5\u5b58\u5728\u6b63\u5b9e\u6570 \\(c\\) \u548c\u5b9e\u6570 \\(n_0\\) \uff0c\u4f7f\u5f97\u5bf9\u4e8e\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5219\u53ef\u8ba4\u4e3a \\(f(n)\\) \u7ed9\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u4e2a\u6e10\u8fd1\u4e0a\u754c\uff0c\u8bb0\u4e3a \\(T(n) = O(f(n))\\) \u3002

\u5982\u56fe 2-8 \u6240\u793a\uff0c\u8ba1\u7b97\u6e10\u8fd1\u4e0a\u754c\u5c31\u662f\u5bfb\u627e\u4e00\u4e2a\u51fd\u6570 \\(f(n)\\) \uff0c\u4f7f\u5f97\u5f53 \\(n\\) \u8d8b\u5411\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u5904\u4e8e\u76f8\u540c\u7684\u589e\u957f\u7ea7\u522b\uff0c\u4ec5\u76f8\u5dee\u4e00\u4e2a\u5e38\u6570\u9879 \\(c\\) \u7684\u500d\u6570\u3002

\u56fe 2-8 \u00a0 \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

"},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u6e10\u8fd1\u4e0a\u754c\u7684\u6570\u5b66\u5473\u513f\u6709\u70b9\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89c9\u6ca1\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u65e0\u987b\u62c5\u5fc3\u3002\u6211\u4eec\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65ad\u7684\u5b9e\u8df5\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6e10\u9886\u609f\u5176\u6570\u5b66\u610f\u4e49\u3002

\u6839\u636e\u5b9a\u4e49\uff0c\u786e\u5b9a \\(f(n)\\) \u4e4b\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u4e48\u5982\u4f55\u786e\u5b9a\u6e10\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u603b\u4f53\u5206\u4e3a\u4e24\u6b65\uff1a\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf","text":"

\u9488\u5bf9\u4ee3\u7801\uff0c\u9010\u884c\u4ece\u4e0a\u5230\u4e0b\u8ba1\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u4e8e\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6570\u9879 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u79cd\u7cfb\u6570\u3001\u5e38\u6570\u9879\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\u3002

  1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u4e0e \\(n\\) \u65e0\u5173\uff0c\u6240\u4ee5\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4ea7\u751f\u5f71\u54cd\u3002
  2. \u7701\u7565\u6240\u6709\u7cfb\u6570\u3002\u4f8b\u5982\uff0c\u5faa\u73af \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7b80\u5316\u8bb0\u4e3a \\(n\\) \u6b21\uff0c\u56e0\u4e3a \\(n\\) \u524d\u9762\u7684\u7cfb\u6570\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u6ca1\u6709\u5f71\u54cd\u3002
  3. \u5faa\u73af\u5d4c\u5957\u65f6\u4f7f\u7528\u4e58\u6cd5\u3002\u603b\u64cd\u4f5c\u6570\u91cf\u7b49\u4e8e\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u64cd\u4f5c\u6570\u91cf\u4e4b\u79ef\uff0c\u6bcf\u4e00\u5c42\u5faa\u73af\u4f9d\u7136\u53ef\u4ee5\u5206\u522b\u5957\u7528\u7b2c 1. \u70b9\u548c\u7b2c 2. \u70b9\u7684\u6280\u5de7\u3002

\u7ed9\u5b9a\u4e00\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u6765\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

\u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\uff0c\u4e24\u8005\u63a8\u7b97\u51fa\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7edf\u8ba1 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61d2\u7edf\u8ba1 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u9636\u7684\u9879\u6765\u51b3\u5b9a\u3002\u8fd9\u662f\u56e0\u4e3a\u5728 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u6700\u9ad8\u9636\u7684\u9879\u5c06\u53d1\u6325\u4e3b\u5bfc\u4f5c\u7528\uff0c\u5176\u4ed6\u9879\u7684\u5f71\u54cd\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

\u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u5938\u5f20\u7684\u503c\u662f\u4e3a\u4e86\u5f3a\u8c03\u201c\u7cfb\u6570\u65e0\u6cd5\u64bc\u52a8\u9636\u6570\u201d\u8fd9\u4e00\u7ed3\u8bba\u3002\u5f53 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u8fd9\u4e9b\u5e38\u6570\u53d8\u5f97\u65e0\u8db3\u8f7b\u91cd\u3002

\u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6570\u91cf\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u5982\u56fe 2-9 \u6240\u793a\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u7ebf\u6027\u5bf9\u6570\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} < \\text{\u9636\u4e58\u9636} \\end{aligned} \\]

\u56fe 2-9 \u00a0 \u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

"},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

\u5e38\u6570\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u5373\u4e0d\u968f\u7740 \\(n\\) \u7684\u53d8\u5316\u800c\u53d8\u5316\u3002

\u5728\u4ee5\u4e0b\u51fd\u6570\u4e2d\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u904d\u5386\u6570\u7ec4\u548c\u904d\u5386\u94fe\u8868\u7b49\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u6216\u94fe\u8868\u7684\u957f\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53d8\u91cf \\(n\\) \u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u4e3a\u6570\u636e\u5927\u5c0f\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7ea7\u522b\u589e\u957f\u3002\u5e73\u65b9\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-10 \u5bf9\u6bd4\u4e86\u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u4e09\u79cd\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u56fe 2-10 \u00a0 \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4ee5\u5192\u6ce1\u6392\u5e8f\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u751f\u7269\u5b66\u7684\u201c\u7ec6\u80de\u5206\u88c2\u201d\u662f\u6307\u6570\u9636\u589e\u957f\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72b6\u6001\u4e3a \\(1\\) \u4e2a\u7ec6\u80de\uff0c\u5206\u88c2\u4e00\u8f6e\u540e\u53d8\u4e3a \\(2\\) \u4e2a\uff0c\u5206\u88c2\u4e24\u8f6e\u540e\u53d8\u4e3a \\(4\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f6e\u540e\u6709 \\(2^n\\) \u4e2a\u7ec6\u80de\u3002

\u56fe 2-11 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u7ec6\u80de\u5206\u88c2\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-11 \u00a0 \u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u5728\u5b9e\u9645\u7b97\u6cd5\u4e2d\uff0c\u6307\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u5176\u9012\u5f52\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7a77\u4e3e\u6cd5\uff08\u66b4\u529b\u641c\u7d22\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f83\u5e38\u89c1\u3002\u5bf9\u4e8e\u6570\u636e\u89c4\u6a21\u8f83\u5927\u7684\u95ee\u9898\uff0c\u6307\u6570\u9636\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u6216\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u6765\u89e3\u51b3\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u4e0e\u6307\u6570\u9636\u76f8\u53cd\uff0c\u5bf9\u6570\u9636\u53cd\u6620\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u60c5\u51b5\u3002\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7531\u4e8e\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u6570\u3002

\u56fe 2-12 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_2 n)\\) \uff0c\u7b80\u8bb0\u4e3a \\(O(\\log n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-12 \u00a0 \u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4e0e\u6307\u6570\u9636\u7c7b\u4f3c\uff0c\u5bf9\u6570\u9636\u4e5f\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u7b97\u6cd5\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u957f\u7f13\u6162\uff0c\u662f\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\u7684\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\\(O(\\log n)\\) \u7684\u5e95\u6570\u662f\u591a\u5c11\uff1f

\u51c6\u786e\u6765\u8bf4\uff0c\u201c\u4e00\u5206\u4e3a \\(m\\)\u201d\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u901a\u8fc7\u5bf9\u6570\u6362\u5e95\u516c\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6570\u3001\u76f8\u7b49\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5e95\u6570 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u590d\u6742\u5ea6\u7684\u524d\u63d0\u4e0b\u8f6c\u6362\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u7701\u7565\u5e95\u6570 \\(m\\) \uff0c\u5c06\u5bf9\u6570\u9636\u76f4\u63a5\u8bb0\u4e3a \\(O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636 \\(O(n \\log n)\\)","text":"

\u7ebf\u6027\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u4e24\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u522b\u4e3a \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-13 \u5c55\u793a\u4e86\u7ebf\u6027\u5bf9\u6570\u9636\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u53c9\u6811\u7684\u6bcf\u4e00\u5c42\u7684\u64cd\u4f5c\u603b\u6570\u90fd\u4e3a \\(n\\) \uff0c\u6811\u5171\u6709 \\(\\log_2 n + 1\\) \u5c42\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u56fe 2-13 \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u7b49\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u9636\u4e58\u9636 \\(O(n!)\\)","text":"

\u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u95ee\u9898\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u4e92\u4e0d\u91cd\u590d\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6570\u91cf\u4e3a\uff1a

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

\u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u5982\u56fe 2-14 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u7b2c\u4e00\u5c42\u5206\u88c2\u51fa \\(n\\) \u4e2a\uff0c\u7b2c\u4e8c\u5c42\u5206\u88c2\u51fa \\(n - 1\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c42\u65f6\u505c\u6b62\u5206\u88c2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-14 \u00a0 \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u5f53 \\(n \\geq 4\\) \u65f6\u6052\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u9636\u4e58\u9636\u6bd4\u6307\u6570\u9636\u589e\u957f\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f83\u5927\u65f6\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u7b97\u6cd5\u7684\u65f6\u95f4\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u5047\u8bbe\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d nums \u7531\u4ece \\(1\\) \u81f3 \\(n\\) \u7684\u6570\u5b57\u7ec4\u6210\uff0c\u6bcf\u4e2a\u6570\u5b57\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff0c\u4efb\u52a1\u76ee\u6807\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

  • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
  • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u5143\u7d20\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\) \u3002

\u201c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\u3002\u76f8\u5e94\u5730\uff0c\u201c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8bb0\u53f7\u8868\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6211\u4eec\u5728\u5b9e\u9645\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u56e0\u4e3a\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6982\u7387\u4e0b\u624d\u80fd\u8fbe\u5230\uff0c\u53ef\u80fd\u4f1a\u5e26\u6765\u4e00\u5b9a\u7684\u8bef\u5bfc\u6027\u3002\u800c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u6548\u7387\u5b89\u5168\u503c\uff0c\u8ba9\u6211\u4eec\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u7b97\u6cd5\u3002

\u4ece\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u4e8e\u201c\u7279\u6b8a\u7684\u6570\u636e\u5206\u5e03\u201d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u5e76\u4e0d\u80fd\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f53\u73b0\u7b97\u6cd5\u5728\u968f\u673a\u8f93\u5165\u6570\u636e\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8bb0\u53f7\u6765\u8868\u793a\u3002

\u5bf9\u4e8e\u90e8\u5206\u7b97\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u63a8\u7b97\u51fa\u968f\u673a\u6570\u636e\u5206\u5e03\u4e0b\u7684\u5e73\u5747\u60c5\u51b5\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u4e8e\u8f93\u5165\u6570\u7ec4\u662f\u88ab\u6253\u4e71\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73b0\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6982\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u4e48\u7b97\u6cd5\u7684\u5e73\u5747\u5faa\u73af\u6b21\u6570\u5c31\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

\u4f46\u5bf9\u4e8e\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5f80\u5f80\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u5206\u6790\u51fa\u5728\u6570\u636e\u5206\u5e03\u4e0b\u7684\u6574\u4f53\u6570\u5b66\u671f\u671b\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f5c\u4e3a\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u5224\u6807\u51c6\u3002

\u4e3a\u4ec0\u4e48\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u53f7\uff1f

\u53ef\u80fd\u7531\u4e8e \\(O\\) \u7b26\u53f7\u8fc7\u4e8e\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u8bb2\uff0c\u8fd9\u79cd\u505a\u6cd5\u5e76\u4e0d\u89c4\u8303\u3002\u5728\u672c\u4e66\u548c\u5176\u4ed6\u8d44\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u7c7b\u4f3c\u201c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8bf7\u5c06\u5176\u76f4\u63a5\u7406\u89e3\u4e3a \\(\\Theta(n)\\) \u3002

"},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u6570\u636e\u7ed3\u6784","text":"

Abstract

\u6570\u636e\u7ed3\u6784\u5982\u540c\u4e00\u526f\u7a33\u56fa\u800c\u591a\u6837\u7684\u6846\u67b6\u3002

\u5b83\u4e3a\u6570\u636e\u7684\u6709\u5e8f\u7ec4\u7ec7\u63d0\u4f9b\u4e86\u84dd\u56fe\uff0c\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u751f\u52a8\u8d77\u6765\u3002

"},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b
  • 3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b
  • 3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *
  • 3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *
  • 3.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

\u5f53\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\u65f6\uff0c\u6211\u4eec\u4f1a\u60f3\u5230\u6587\u672c\u3001\u56fe\u7247\u3001\u89c6\u9891\u3001\u8bed\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u79cd\u5f62\u5f0f\u3002\u5c3d\u7ba1\u8fd9\u4e9b\u6570\u636e\u7684\u7ec4\u7ec7\u5f62\u5f0f\u5404\u5f02\uff0c\u4f46\u5b83\u4eec\u90fd\u7531\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6784\u6210\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

  • \u6574\u6570\u7c7b\u578b byte\u3001short\u3001int\u3001long \u3002
  • \u6d6e\u70b9\u6570\u7c7b\u578b float\u3001double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\u3002
  • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002
  • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u4e00\u4e2a\u4e8c\u8fdb\u5236\u4f4d\u5373\u4e3a \\(1\\) \u6bd4\u7279\u3002\u5728\u7edd\u5927\u591a\u6570\u73b0\u4ee3\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bit\uff09\u7ec4\u6210\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u4e3a\u4f8b\u3002

  • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) \u5b57\u8282 = \\(8\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u6570\u5b57\u3002
  • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) \u5b57\u8282 = \\(32\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\u3002

\u8868 3-1 \u5217\u4e3e\u4e86 Java \u4e2d\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u987b\u6b7b\u8bb0\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

\u8868 3-1 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u548c\u53d6\u503c\u8303\u56f4

\u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 \u5b57\u8282 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u5b57\u8282 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u5b57\u8282 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u5b57\u8282 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 \u5b57\u8282 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u5b57\u8282 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 \u5b57\u8282 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 \u5b57\u8282 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

\u8bf7\u6ce8\u610f\uff0c\u8868 3-1 \u9488\u5bf9\u7684\u662f Java \u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u60c5\u51b5\u3002\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u6709\u5404\u81ea\u7684\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\uff0c\u5b83\u4eec\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002

  • \u5728 Python \u4e2d\uff0c\u6574\u6570\u7c7b\u578b int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\uff1b\u6d6e\u70b9\u6570 float \u662f\u53cc\u7cbe\u5ea6 64 \u4f4d\uff1b\u6ca1\u6709 char \u7c7b\u578b\uff0c\u5355\u4e2a\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32 str \u3002
  • C \u548c C++ \u672a\u660e\u786e\u89c4\u5b9a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5b9e\u73b0\u548c\u5e73\u53f0\u5404\u5f02\u3002\u8868 3-1 \u9075\u5faa LP64 \u6570\u636e\u6a21\u578b\uff0c\u5176\u7528\u4e8e\u5305\u62ec Linux \u548c macOS \u5728\u5185\u7684 Unix 64 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u3002
  • \u5b57\u7b26 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u4e3a 1 \u5b57\u8282\uff0c\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\u53d6\u51b3\u4e8e\u7279\u5b9a\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u201c\u5b57\u7b26\u7f16\u7801\u201d\u7ae0\u8282\u3002
  • \u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u4e5f\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a\u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002

\u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u8fd9\u53e5\u8bdd\u7684\u4e3b\u8bed\u662f\u201c\u7ed3\u6784\u201d\u800c\u975e\u201c\u6570\u636e\u201d\u3002

\u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int\u3001\u5c0f\u6570 float \u8fd8\u662f\u5b57\u7b26 char \uff0c\u5219\u4e0e\u201c\u6570\u636e\u7ed3\u6784\u201d\u65e0\u5173\u3002

\u6362\u53e5\u8bdd\u8bf4\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u5185\u5bb9\u7c7b\u578b\u201d\uff0c\u800c\u6570\u636e\u7ed3\u6784\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u7ec4\u7ec7\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u7528\u76f8\u540c\u7684\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\uff09\u6765\u5b58\u50a8\u4e0e\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript \u7684\u6570\u7ec4\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nconst array = [0, 0.0, 'a', false];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
# Ruby \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

"},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u79f0\u4e3a American Standard Code for Information Interchange\uff08\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5982\u56fe 3-6 \u6240\u793a\uff0cASCII \u7801\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

\u56fe 3-6 \u00a0 ASCII \u7801

\u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002

\u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

"},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

\u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6c49\u5b57\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

\u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\u6269\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7684\u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

"},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

\u968f\u7740\u8ba1\u7b97\u673a\u6280\u672f\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u8ba1\u7b97\u673a\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

\u90a3\u4e2a\u65f6\u4ee3\u7684\u7814\u7a76\u4eba\u5458\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

Unicode \u7684\u4e2d\u6587\u540d\u79f0\u4e3a\u201c\u7edf\u4e00\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3 100 \u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

\u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360\u7528 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

Unicode \u662f\u4e00\u79cd\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

\u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u56fe 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

\u56fe 3-7 \u00a0 Unicode \u7f16\u7801\u793a\u4f8b

\u7136\u800c ASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u7684\u4e24\u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7f16\u7801","text":"

\u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u5ea6\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700 1 \u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u5b57\u8282\u3002

UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff0c\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
  • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

\u56fe 3-8 \u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u89c2\u5bdf\u53d1\u73b0\uff0c\u7531\u4e8e\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7\u8bfb\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u4e2a\u6570\u6765\u89e3\u6790\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002

\u4f46\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u5224\u65ad\u51fa\u5f02\u5e38\u3002

\u4e4b\u6240\u4ee5\u5c06 \\(10\\) \u5f53\u4f5c\u6821\u9a8c\u7b26\uff0c\u662f\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u4e2a\u7ed3\u8bba\u53ef\u4ee5\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\uff1a\u5047\u8bbe\u4e00\u4e2a\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \uff0c\u8bf4\u660e\u8be5\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(1\\) \uff0c\u5bf9\u5e94 ASCII \u7801\u3002\u800c ASCII \u7801\u7684\u6700\u9ad8\u4f4d\u5e94\u8be5\u662f \\(0\\) \uff0c\u4e0e\u5047\u8bbe\u77db\u76fe\u3002

\u56fe 3-8 \u00a0 UTF-8 \u7f16\u7801\u793a\u4f8b

\u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec\u4ee5\u4e0b\u4e24\u79cd\u3002

  • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
  • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e ASCII \u5b57\u7b26\u5360\u6bd4\u8f83\u9ad8\u7684\u6587\u672c\u3002

\u4ece\u5b58\u50a8\u7a7a\u95f4\u5360\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 2 \u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u5b57\u8282\u3002

\u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u4f18\u5148\u652f\u6301 UTF-8 \u3002

"},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

\u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7f16\u7801\u3002\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u8fd9\u79cd\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

  • \u968f\u673a\u8bbf\u95ee\uff1aUTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
  • \u5b57\u7b26\u8ba1\u6570\uff1a\u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
  • \u5b57\u7b26\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

\u5b9e\u9645\u4e0a\uff0c\u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u8bb8\u591a\u56e0\u7d20\u3002

  • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
  • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8bed\u8a00\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u53d1\u5c55\u65e9\u671f\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
  • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff08\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff09\u90fd\u5e7f\u6cdb\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

\u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u4ece\u800c\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u989d\u5916\u589e\u52a0\u4ee3\u7801\uff0c\u8fd9\u63d0\u9ad8\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c\u8c03\u8bd5\u96be\u5ea6\u3002

\u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\u3002

  • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7f16\u7801\uff0c\u5e76\u91c7\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u82e5\u5b57\u7b26\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff1b\u5982\u679c\u6709\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u5b57\u8282\u3002
  • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
  • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\uff0c\u5b83\u4eec\u53ef\u4ee5\u4ece\u201c\u903b\u8f91\u7ed3\u6784\u201d\u548c\u201c\u7269\u7406\u7ed3\u6784\u201d\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

\u903b\u8f91\u7ed3\u6784\u63ed\u793a\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\u3002\u5728\u6570\u7ec4\u548c\u94fe\u8868\u4e2d\uff0c\u6570\u636e\u6309\u7167\u4e00\u5b9a\u987a\u5e8f\u6392\u5217\uff0c\u4f53\u73b0\u4e86\u6570\u636e\u4e4b\u95f4\u7684\u7ebf\u6027\u5173\u7cfb\uff1b\u800c\u5728\u6811\u4e2d\uff0c\u6570\u636e\u4ece\u9876\u90e8\u5411\u4e0b\u6309\u5c42\u6b21\u6392\u5217\uff0c\u8868\u73b0\u51fa\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff1b\u56fe\u5219\u7531\u8282\u70b9\u548c\u8fb9\u6784\u6210\uff0c\u53cd\u6620\u4e86\u590d\u6742\u7684\u7f51\u7edc\u5173\u7cfb\u3002

\u5982\u56fe 3-1 \u6240\u793a\uff0c\u903b\u8f91\u7ed3\u6784\u53ef\u5206\u4e3a\u201c\u7ebf\u6027\u201d\u548c\u201c\u975e\u7ebf\u6027\u201d\u4e24\u5927\u7c7b\u3002\u7ebf\u6027\u7ed3\u6784\u6bd4\u8f83\u76f4\u89c2\uff0c\u6307\u6570\u636e\u5728\u903b\u8f91\u5173\u7cfb\u4e0a\u5448\u7ebf\u6027\u6392\u5217\uff1b\u975e\u7ebf\u6027\u7ed3\u6784\u5219\u76f8\u53cd\uff0c\u5448\u975e\u7ebf\u6027\u6392\u5217\u3002

  • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u4e00\u7684\u987a\u5e8f\u5173\u7cfb\u3002
  • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u56fe\u3001\u54c8\u5e0c\u8868\u3002

\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u6811\u5f62\u7ed3\u6784\u548c\u7f51\u72b6\u7ed3\u6784\u3002

  • \u6811\u5f62\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\u3002
  • \u7f51\u72b6\u7ed3\u6784\uff1a\u56fe\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u591a\u5bf9\u591a\u7684\u5173\u7cfb\u3002

\u56fe 3-1 \u00a0 \u7ebf\u6027\u6570\u636e\u7ed3\u6784\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

"},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u5206\u6563","text":"

\u5f53\u7b97\u6cd5\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u56fe 3-2 \u5c55\u793a\u4e86\u4e00\u4e2a\u8ba1\u7b97\u673a\u5185\u5b58\u6761\uff0c\u5176\u4e2d\u6bcf\u4e2a\u9ed1\u8272\u65b9\u5757\u90fd\u5305\u542b\u4e00\u5757\u5185\u5b58\u7a7a\u95f4\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u5185\u5b58\u60f3\u8c61\u6210\u4e00\u4e2a\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5355\u5143\u683c\u90fd\u53ef\u4ee5\u5b58\u50a8\u4e00\u5b9a\u5927\u5c0f\u7684\u6570\u636e\u3002

\u7cfb\u7edf\u901a\u8fc7\u5185\u5b58\u5730\u5740\u6765\u8bbf\u95ee\u76ee\u6807\u4f4d\u7f6e\u7684\u6570\u636e\u3002\u5982\u56fe 3-2 \u6240\u793a\uff0c\u8ba1\u7b97\u673a\u6839\u636e\u7279\u5b9a\u89c4\u5219\u4e3a\u8868\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5206\u914d\u7f16\u53f7\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u6709\u552f\u4e00\u7684\u5185\u5b58\u5730\u5740\u3002\u6709\u4e86\u8fd9\u4e9b\u5730\u5740\uff0c\u7a0b\u5e8f\u4fbf\u53ef\u4ee5\u8bbf\u95ee\u5185\u5b58\u4e2d\u7684\u6570\u636e\u3002

\u56fe 3-2 \u00a0 \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

Tip

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5c06\u5185\u5b58\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u4e2a\u7b80\u5316\u7684\u7c7b\u6bd4\uff0c\u5b9e\u9645\u5185\u5b58\u7684\u5de5\u4f5c\u673a\u5236\u6bd4\u8f83\u590d\u6742\uff0c\u6d89\u53ca\u5730\u5740\u7a7a\u95f4\u3001\u5185\u5b58\u7ba1\u7406\u3001\u7f13\u5b58\u673a\u5236\u3001\u865a\u62df\u5185\u5b58\u548c\u7269\u7406\u5185\u5b58\u7b49\u6982\u5ff5\u3002

\u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u67d0\u5757\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5219\u65e0\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5e8f\u540c\u65f6\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bbe\u8ba1\u4e2d\uff0c\u5185\u5b58\u8d44\u6e90\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u8003\u8651\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u7b97\u6cd5\u6240\u5360\u7528\u7684\u5185\u5b58\u5cf0\u503c\u4e0d\u5e94\u8d85\u8fc7\u7cfb\u7edf\u5269\u4f59\u7a7a\u95f2\u5185\u5b58\uff1b\u5982\u679c\u7f3a\u5c11\u8fde\u7eed\u5927\u5757\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u5206\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

\u5982\u56fe 3-3 \u6240\u793a\uff0c\u7269\u7406\u7ed3\u6784\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u7269\u7406\u7ed3\u6784\u4ece\u5e95\u5c42\u51b3\u5b9a\u4e86\u6570\u636e\u7684\u8bbf\u95ee\u3001\u66f4\u65b0\u3001\u589e\u5220\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

\u56fe 3-3 \u00a0 \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u5206\u6563\u7a7a\u95f4\u5b58\u50a8

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u57fa\u4e8e\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e8c\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002\u4f8b\u5982\uff0c\u6808\u548c\u961f\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff1b\u800c\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u6570\u7ec4\u548c\u94fe\u8868\u3002

  • \u57fa\u4e8e\u6570\u7ec4\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u3001\u77e9\u9635\u3001\u5f20\u91cf\uff08\u7ef4\u5ea6 \\(\\geq 3\\) \u7684\u6570\u7ec4\uff09\u7b49\u3002
  • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u3002

\u94fe\u8868\u5728\u521d\u59cb\u5316\u540e\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u5bf9\u5176\u957f\u5ea6\u8fdb\u884c\u8c03\u6574\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u7ec4\u53ef\u901a\u8fc7\u91cd\u65b0\u5206\u914d\u5185\u5b58\u5b9e\u73b0\u957f\u5ea6\u53d8\u5316\uff0c\u4ece\u800c\u5177\u5907\u4e00\u5b9a\u7684\u201c\u52a8\u6001\u6027\u201d\u3002

Tip

\u5982\u679c\u4f60\u611f\u89c9\u7269\u7406\u7ed3\u6784\u7406\u89e3\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\uff0c\u7136\u540e\u518d\u56de\u987e\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

Tip

\u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

"},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

\u5728\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002

\u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6570\u5b57\u662f\u4ee5\u201c\u8865\u7801\u201d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u5728\u5206\u6790\u8fd9\u6837\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\u3002

  • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
  • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
  • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

\u56fe 3-4 \u5c55\u793a\u4e86\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\u3002

\u56fe 3-4 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

\u539f\u7801\uff08sign-magnitude\uff09\u867d\u7136\u6700\u76f4\u89c2\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u53cd\u7801\uff081's complement\uff09\u3002\u5982\u679c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u540e\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u6362\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u7801)} + 1000 \\; 0010 \\; \\text{(\u539f\u7801)} \\newline & = 0000 \\; 0001 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1101 \\; \\text{(\u53cd\u7801)} \\newline & = 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & \\rightarrow -1 \\end{aligned} \\]

\u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u3002\u6bd4\u5982\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u5219\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5224\u65ad\u7ed3\u679c\u51fa\u9519\u3002\u800c\u5982\u679c\u6211\u4eec\u60f3\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u8fd9\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

\u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\uff0c\u56e0\u6b64\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u8865\u7801\uff082's complement\uff09\u3002\u6211\u4eec\u5148\u6765\u89c2\u5bdf\u4e00\u4e0b\u8d1f\u96f6\u7684\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u8f6c\u6362\u8fc7\u7a0b\uff1a

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u7801)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u53cd\u7801)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

\u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u4f46 byte \u7c7b\u578b\u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\; 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u6b63\u8d1f\u96f6\u6b67\u4e49\u4ece\u800c\u5f97\u5230\u89e3\u51b3\u3002

\u8fd8\u5269\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u3002

\u7136\u800c\uff0c\u8865\u7801 \\(1000 \\; 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\; 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u7801)} + 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u8865\u7801)} + 1111 \\; 1111 \\; \\text{(\u8865\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline & \\rightarrow -128 \\end{aligned} \\]

\u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u8fd0\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

\u8bf7\u6ce8\u610f\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u987b\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

\u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5c31\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\uff0c\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5165\u4e86\u89e3\u3002

"},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u5b57\u8282 \uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

\u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8bb0\u4e00\u4e2a 32 \u6bd4\u7279\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570\u4e3a\uff1a

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

\u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u4e2a\u90e8\u5206\u6784\u6210\u3002

  • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{31}\\) \u3002
  • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
  • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 23 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

\u4e8c\u8fdb\u5236\u6570 float \u5bf9\u5e94\u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff1a

\\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

\u8f6c\u5316\u5230\u5341\u8fdb\u5236\u4e0b\u7684\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff1a

\\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

\u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

\u56fe 3-5 \u00a0 IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u7684\u8ba1\u7b97\u793a\u4f8b

\u89c2\u5bdf\u56fe 3-5 \uff0c\u7ed9\u5b9a\u4e00\u4e2a\u793a\u4f8b\u6570\u636e \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5219\u6709\uff1a

\\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u95ee\u9898\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6570\u4f4d\uff0c\u5bfc\u81f4\u5176\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \u3002\u6839\u636e\u4ee5\u4e0a\u8ba1\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6570\u4e3a \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u6362\u7b26\u53f7\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8d1f\u6570\u3002

\u5c3d\u7ba1\u6d6e\u70b9\u6570 float \u6269\u5c55\u4e86\u53d6\u503c\u8303\u56f4\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6570\u7c7b\u578b int \u5c06\u5168\u90e8 32 \u6bd4\u7279\u7528\u4e8e\u8868\u793a\u6570\u5b57\uff0c\u6570\u5b57\u662f\u5747\u5300\u5206\u5e03\u7684\uff1b\u800c\u7531\u4e8e\u6307\u6570\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u70b9\u6570 float \u7684\u6570\u503c\u8d8a\u5927\uff0c\u76f8\u90bb\u4e24\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u5dee\u503c\u5c31\u4f1a\u8d8b\u5411\u8d8a\u5927\u3002

\u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6570\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\u8868 3-2 \u00a0 \u6307\u6570\u4f4d\u542b\u4e49

\u6307\u6570\u4f4d E \u5206\u6570\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6570\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8ba1\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u89c4\u6570 \u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23}\\) \u3002

\u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c\u4e8e float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d58\u8ff0\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u89d2\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002\u903b\u8f91\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\uff0c\u800c\u7269\u7406\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\u3002
  • \u5e38\u89c1\u7684\u903b\u8f91\u7ed3\u6784\u5305\u62ec\u7ebf\u6027\u3001\u6811\u72b6\u548c\u7f51\u72b6\u7b49\u3002\u901a\u5e38\u6211\u4eec\u6839\u636e\u903b\u8f91\u7ed3\u6784\u5c06\u6570\u636e\u7ed3\u6784\u5206\u4e3a\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\u3001\u56fe\u3001\u5806\uff09\u4e24\u79cd\u3002\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002
  • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
  • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u7531\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e24\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002
  • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u70b9\u6570 float\u3001double \uff0c\u5b57\u7b26 char \u548c\u5e03\u5c14 bool \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
  • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
  • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
  • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u56e0\u6b64\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
  • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u4e0a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
  • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u5360\u7528\u7684\u7a7a\u95f4\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

\u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u94fe\u5f0f\u5730\u5740\u201d\uff08\u540e\u7eed\u201c\u54c8\u5e0c\u51b2\u7a81\u201d\u7ae0\u8282\u4f1a\u8bb2\uff09\uff1a\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u6876\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff0c\u5f53\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002

\u4ece\u5b58\u50a8\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u94fe\u8868\u6216\u4e00\u68f5\u6811\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6811\uff09\u3002

Q\uff1achar \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 \u5b57\u8282\u5417\uff1f

char \u7c7b\u578b\u7684\u957f\u5ea6\u7531\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u51b3\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u3002

Q\uff1a\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d \u662f\u5426\u6709\u6b67\u4e49\uff1f\u6808\u4e5f\u53ef\u4ee5\u8fdb\u884c\u51fa\u6808\u548c\u5165\u6808\u7b49\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52a8\u6001\u201d\u7684\u3002

\u6808\u786e\u5b9e\u53ef\u4ee5\u5b9e\u73b0\u52a8\u6001\u7684\u6570\u636e\u64cd\u4f5c\uff0c\u4f46\u6570\u636e\u7ed3\u6784\u4ecd\u7136\u662f\u201c\u9759\u6001\u201d\uff08\u957f\u5ea6\u4e0d\u53ef\u53d8\uff09\u7684\u3002\u5c3d\u7ba1\u57fa\u4e8e\u6570\u7ec4\u7684\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u52a8\u6001\u5730\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u4eec\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u6570\u636e\u91cf\u8d85\u51fa\u4e86\u9884\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u65e7\u6570\u7ec4\u7684\u5185\u5bb9\u590d\u5236\u5230\u65b0\u6570\u7ec4\u4e2d\u3002

Q\uff1a\u5728\u6784\u5efa\u6808\uff08\u961f\u5217\uff09\u7684\u65f6\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u4e3a\u4ec0\u4e48\u5b83\u4eec\u662f\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u5462\uff1f

\u5728\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e0\u987b\u4eba\u5de5\u6307\u5b9a\u6808\uff08\u961f\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u7531\u7c7b\u5185\u90e8\u81ea\u52a8\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u4e3a 10\u3002\u53e6\u5916\uff0c\u6269\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52a8\u5b9e\u73b0\u7684\u3002\u8be6\u89c1\u540e\u7eed\u7684\u201c\u5217\u8868\u201d\u7ae0\u8282\u3002

Q\uff1a\u539f\u7801\u8f6c\u8865\u7801\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\uff0c\u90a3\u4e48\u8865\u7801\u8f6c\u539f\u7801\u5e94\u8be5\u662f\u9006\u8fd0\u7b97\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff0c\u800c\u8865\u7801\u8f6c\u539f\u7801\u4e5f\u4e00\u6837\u53ef\u4ee5\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f

A\uff1a\u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u548c\u8865\u7801\u7684\u76f8\u4e92\u8f6c\u6362\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u201c\u8865\u6570\u201d\u7684\u8fc7\u7a0b\u3002\u6211\u4eec\u5148\u7ed9\u51fa\u8865\u6570\u7684\u5b9a\u4e49\uff1a\u5047\u8bbe \\(a + b = c\\) \uff0c\u90a3\u4e48\u6211\u4eec\u79f0 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u8865\u6570\uff0c\u53cd\u4e4b\u4e5f\u79f0 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u8865\u6570\u3002

\u7ed9\u5b9a\u4e00\u4e2a \\(n = 4\\) \u4f4d\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570 \\(0010\\) \uff0c\u5982\u679c\u5c06\u8fd9\u4e2a\u6570\u5b57\u770b\u4f5c\u539f\u7801\uff08\u4e0d\u8003\u8651\u7b26\u53f7\u4f4d\uff09\uff0c\u90a3\u4e48\u5b83\u7684\u8865\u7801\u9700\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff1a

\\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

\u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u539f\u7801\u548c\u8865\u7801\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u8865\u7801 \\(1110\\) \u662f\u539f\u7801 \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\u7684\u8fc7\u7a0b\u3002

\u90a3\u4e48\uff0c\u8865\u7801 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u4eec\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

\\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

\u6362\u53e5\u8bdd\u8bf4\uff0c\u539f\u7801\u548c\u8865\u7801\u4e92\u4e3a\u5bf9\u65b9\u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\uff0c\u56e0\u6b64\u201c\u539f\u7801\u8f6c\u8865\u7801\u201d\u548c\u201c\u8865\u7801\u8f6c\u539f\u7801\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u540e\u52a0 1 \uff09\u5b9e\u73b0\u3002

\u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u9006\u8fd0\u7b97\u6765\u6c42\u8865\u7801 \\(1110\\) \u7684\u539f\u7801\uff0c\u5373\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff1a

\\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

\u603b\u7ed3\u6765\u770b\uff0c\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u548c\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\u8fd9\u4e24\u79cd\u8fd0\u7b97\u90fd\u662f\u5728\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\uff0c\u5b83\u4eec\u662f\u7b49\u4ef7\u7684\u3002

\u672c\u8d28\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u8865\u6570\uff08\u56e0\u4e3a\u6052\u6709 \u539f\u7801 + \u53cd\u7801 = 1111\uff09\uff1b\u800c\u5728\u53cd\u7801\u57fa\u7840\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u8865\u7801\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u8865\u6570\u3002

\u4e0a\u8ff0 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\u63a8\u5e7f\u81f3\u4efb\u610f\u4f4d\u6570\u7684\u4e8c\u8fdb\u5236\u6570\u3002

"},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

Abstract

\u96be\u9898\u88ab\u9010\u5c42\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u53d8\u5f97\u66f4\u4e3a\u7b80\u5355\u3002

\u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u4e8b\u5b9e\uff1a\u4ece\u7b80\u5355\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u590d\u6742\u3002

"},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5
  • 12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565
  • 12.3 \u00a0 \u6784\u5efa\u6811\u95ee\u9898
  • 12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898
  • 12.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565","text":"

\u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\uff0c\u641c\u7d22\u7b97\u6cd5\u5206\u4e3a\u4e24\u5927\u7c7b\u3002

  • \u66b4\u529b\u641c\u7d22\uff1a\u5b83\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
  • \u81ea\u9002\u5e94\u641c\u7d22\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u6570\u636e\u7ec4\u7ec7\u5f62\u5f0f\u6216\u5148\u9a8c\u4fe1\u606f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u548c\u6811\u3002

  • \u4e8c\u5206\u67e5\u627e\u7684\u6bcf\u4e00\u6b65\u90fd\u5c06\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\u5206\u89e3\u4e3a\u4e00\u4e2a\u5c0f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u76f4\u6301\u7eed\u5230\u6570\u7ec4\u4e3a\u7a7a\u6216\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
  • \u6811\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u5806\u7b49\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7686\u4e3a \\(O(\\log n)\\) \u3002

\u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

  • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u67e5\u627e\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\u5206\u89e3\u4e3a\u5b50\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\uff0c\u8fd9\u662f\u901a\u8fc7\u6bd4\u8f83\u4e2d\u95f4\u5143\u7d20\u548c\u76ee\u6807\u5143\u7d20\u6765\u5b9e\u73b0\u7684\u3002
  • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u5904\u7406\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u95ee\u9898\u7684\u5f71\u54cd\u3002
  • \u5b50\u95ee\u9898\u7684\u89e3\u65e0\u987b\u5408\u5e76\uff1a\u4e8c\u5206\u67e5\u627e\u65e8\u5728\u67e5\u627e\u4e00\u4e2a\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u3002\u5f53\u5b50\u95ee\u9898\u5f97\u5230\u89e3\u51b3\u65f6\uff0c\u539f\u95ee\u9898\u4e5f\u4f1a\u540c\u65f6\u5f97\u5230\u89e3\u51b3\u3002

\u5206\u6cbb\u80fd\u591f\u63d0\u5347\u641c\u7d22\u6548\u7387\uff0c\u672c\u8d28\u4e0a\u662f\u56e0\u4e3a\u66b4\u529b\u641c\u7d22\u6bcf\u8f6e\u53ea\u80fd\u6392\u9664\u4e00\u4e2a\u9009\u9879\uff0c\u800c\u5206\u6cbb\u641c\u7d22\u6bcf\u8f6e\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9009\u9879\u3002

"},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u4e8e\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e","text":"

\u5728\u4e4b\u524d\u7684\u7ae0\u8282\u4e2d\uff0c\u4e8c\u5206\u67e5\u627e\u662f\u57fa\u4e8e\u9012\u63a8\uff08\u8fed\u4ee3\uff09\u5b9e\u73b0\u7684\u3002\u73b0\u5728\u6211\u4eec\u57fa\u4e8e\u5206\u6cbb\uff08\u9012\u5f52\uff09\u6765\u5b9e\u73b0\u5b83\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8bf7\u67e5\u627e\u5143\u7d20 target \u3002

\u4ece\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u4eec\u5c06\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u8bb0\u4e3a \\(f(i, j)\\) \u3002

\u4ee5\u539f\u95ee\u9898 \\(f(0, n-1)\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u901a\u8fc7\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002

  1. \u8ba1\u7b97\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u7684\u4e2d\u70b9 \\(m\\) \uff0c\u6839\u636e\u5b83\u6392\u9664\u4e00\u534a\u641c\u7d22\u533a\u95f4\u3002
  2. \u9012\u5f52\u6c42\u89e3\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u80fd\u4e3a \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
  3. \u5faa\u73af\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u533a\u95f4\u4e3a\u7a7a\u65f6\u8fd4\u56de\u3002

\u56fe 12-4 \u5c55\u793a\u4e86\u5728\u6570\u7ec4\u4e2d\u4e8c\u5206\u67e5\u627e\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u8fc7\u7a0b\u3002

\u56fe 12-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u8fc7\u7a0b

\u5728\u5b9e\u73b0\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \u6765\u6c42\u89e3\u95ee\u9898 \\(f(i, j)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j)\"\"\"\n    # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
binary_search_recur.cpp
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.java
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.cs
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
binary_search_recur.go
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u6ca1\u6709\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8ba1\u7b97\u7d22\u5f15\u4e2d\u70b9\n    m := i + ((j - i) >> 1)\n    //\u5224\u65ad\u4e2d\u70b9\u4e0e\u76ee\u6807\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u53f3\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u5de6\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
binary_search_recur.swift
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
binary_search_recur.js
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.ts
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.dart
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.rs
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.c
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.kt
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
binary_search_recur.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \uff0c\u8bf7\u4ece\u4e2d\u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u8fd4\u56de\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u3002\u5047\u8bbe\u4e8c\u53c9\u6811\u4e2d\u6ca1\u6709\u503c\u91cd\u590d\u7684\u8282\u70b9\uff08\u5982\u56fe 12-5 \u6240\u793a\uff09\u3002

\u56fe 12-5 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65ad\u662f\u5426\u4e3a\u5206\u6cbb\u95ee\u9898","text":"

\u539f\u95ee\u9898\u5b9a\u4e49\u4e3a\u4ece preorder \u548c inorder \u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u662f\u4e00\u4e2a\u5178\u578b\u7684\u5206\u6cbb\u95ee\u9898\u3002

  • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4ece\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\u3001\u6784\u5efa\u53f3\u5b50\u6811\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u8282\u70b9\u3002\u800c\u5bf9\u4e8e\u6bcf\u68f5\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u590d\u7528\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u5c06\u5176\u5212\u5206\u4e3a\u66f4\u5c0f\u7684\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u7a7a\u5b50\u6811\uff09\u65f6\u7ec8\u6b62\u3002
  • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u4ea4\u96c6\u3002\u5728\u6784\u5efa\u5de6\u5b50\u6811\u65f6\uff0c\u6211\u4eec\u53ea\u9700\u5173\u6ce8\u4e2d\u5e8f\u904d\u5386\u548c\u524d\u5e8f\u904d\u5386\u4e2d\u4e0e\u5de6\u5b50\u6811\u5bf9\u5e94\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6811\u540c\u7406\u3002
  • \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u5b83\u4eec\u94fe\u63a5\u5230\u6839\u8282\u70b9\u4e0a\uff0c\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5212\u5206\u5b50\u6811","text":"

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u8fd9\u9053\u9898\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u6765\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u901a\u8fc7\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u6765\u5212\u5206\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u5462\uff1f

\u6839\u636e\u5b9a\u4e49\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

  • \u524d\u5e8f\u904d\u5386\uff1a[ \u6839\u8282\u70b9 | \u5de6\u5b50\u6811 | \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 3 | 9 | 2 1 7 ] \u3002
  • \u4e2d\u5e8f\u904d\u5386\uff1a[ \u5de6\u5b50\u6811 | \u6839\u8282\u70b9 \uff5c \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 9 | 3 | 1 2 7 ] \u3002

\u4ee5\u4e0a\u56fe\u6570\u636e\u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u56fe 12-6 \u6240\u793a\u7684\u6b65\u9aa4\u5f97\u5230\u5212\u5206\u7ed3\u679c\u3002

  1. \u524d\u5e8f\u904d\u5386\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u8282\u70b9\u7684\u503c\u3002
  2. \u67e5\u627e\u6839\u8282\u70b9 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8be5\u7d22\u5f15\u53ef\u5c06 inorder \u5212\u5206\u4e3a [ 9 | 3 \uff5c 1 2 7 ] \u3002
  3. \u6839\u636e inorder \u7684\u5212\u5206\u7ed3\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u5206\u522b\u4e3a 1 \u548c 3 \uff0c\u4ece\u800c\u53ef\u5c06 preorder \u5212\u5206\u4e3a [ 3 | 9 | 2 1 7 ] \u3002

\u56fe 12-6 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u5212\u5206\u5b50\u6811

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u4e8e\u53d8\u91cf\u63cf\u8ff0\u5b50\u6811\u533a\u95f4","text":"

\u6839\u636e\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u6211\u4eec\u5df2\u7ecf\u5f97\u5230\u6839\u8282\u70b9\u3001\u5de6\u5b50\u6811\u3001\u53f3\u5b50\u6811\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002\u800c\u4e3a\u4e86\u63cf\u8ff0\u8fd9\u4e9b\u7d22\u5f15\u533a\u95f4\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u3002

  • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(i\\) \u3002
  • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(m\\) \u3002
  • \u5c06\u5f53\u524d\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u8bb0\u4e3a \\([l, r]\\) \u3002

\u5982\u8868 12-1 \u6240\u793a\uff0c\u901a\u8fc7\u4ee5\u4e0a\u53d8\u91cf\u5373\u53ef\u8868\u793a\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002

\u8868 12-1 \u00a0 \u6839\u8282\u70b9\u548c\u5b50\u6811\u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u7684\u7d22\u5f15

\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4 \u5f53\u524d\u6811 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6811 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6811 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

\u8bf7\u6ce8\u610f\uff0c\u53f3\u5b50\u6811\u6839\u8282\u70b9\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u4e49\u662f\u201c\u5de6\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u201d\uff0c\u5efa\u8bae\u7ed3\u5408\u56fe 12-7 \u7406\u89e3\u3002

\u56fe 12-7 \u00a0 \u6839\u8282\u70b9\u548c\u5de6\u53f3\u5b50\u6811\u7684\u7d22\u5f15\u533a\u95f4\u8868\u793a

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4e3a\u4e86\u63d0\u5347\u67e5\u8be2 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 hmap \u6765\u5b58\u50a8\u6570\u7ec4 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root = TreeNode(preorder[i])\n    # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m = inorder_map[preorder[i]]\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\"\"\"\n    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
build_tree.cpp
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
build_tree.java
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.cs
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
build_tree.go
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m := inorderMap[preorder[i]]\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
build_tree.swift
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
build_tree.js
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.ts
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.dart
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u8282\u70b9\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u8282\u70b9\n  return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
build_tree.rs
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    Some(root)\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
build_tree.c
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
build_tree.kt
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
build_tree.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
build_tree.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 12-8 \u5c55\u793a\u4e86\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5404\u4e2a\u8282\u70b9\u662f\u5728\u5411\u4e0b\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u6761\u8fb9\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

<1><2><3><4><5><6><7><8><9>

\u56fe 12-8 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b

\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u5185\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u7684\u5212\u5206\u7ed3\u679c\u5982\u56fe 12-9 \u6240\u793a\u3002

\u56fe 12-9 \u00a0 \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u7684\u5212\u5206\u7ed3\u679c

\u8bbe\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u4e2a\u8282\u70b9\uff08\u6267\u884c\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u54c8\u5e0c\u8868\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5","text":"

\u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u79f0\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u79cd\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u89c1\u7684\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u4e24\u4e2a\u6b65\u9aa4\u3002

  1. \u5206\uff08\u5212\u5206\u9636\u6bb5\uff09\uff1a\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u6216\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898\u65f6\u7ec8\u6b62\u3002
  2. \u6cbb\uff08\u5408\u5e76\u9636\u6bb5\uff09\uff1a\u4ece\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u95ee\u9898\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

\u5982\u56fe 12-1 \u6240\u793a\uff0c\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\u4e4b\u4e00\u3002

  1. \u5206\uff1a\u9012\u5f52\u5730\u5c06\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u5230\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u95ee\u9898\uff09\u3002
  2. \u6cbb\uff1a\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u6709\u5e8f\u7684\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002

\u56fe 12-1 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65ad\u5206\u6cbb\u95ee\u9898","text":"

\u4e00\u4e2a\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u51b3\uff0c\u901a\u5e38\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u51e0\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

  1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u95ee\u9898\u53ef\u4ee5\u5206\u89e3\u6210\u89c4\u6a21\u66f4\u5c0f\u3001\u7c7b\u4f3c\u7684\u5b50\u95ee\u9898\uff0c\u4ee5\u53ca\u80fd\u591f\u4ee5\u76f8\u540c\u65b9\u5f0f\u9012\u5f52\u5730\u8fdb\u884c\u5212\u5206\u3002
  2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5b50\u95ee\u9898\u4e4b\u95f4\u6ca1\u6709\u91cd\u53e0\uff0c\u4e92\u4e0d\u4f9d\u8d56\uff0c\u53ef\u4ee5\u72ec\u7acb\u89e3\u51b3\u3002
  3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u539f\u95ee\u9898\u7684\u89e3\u901a\u8fc7\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\u5f97\u6765\u3002

\u663e\u7136\uff0c\u5f52\u5e76\u6392\u5e8f\u6ee1\u8db3\u4ee5\u4e0a\u4e09\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

  1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u9012\u5f52\u5730\u5c06\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\u3002
  2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u53ef\u4ee5\u72ec\u7acb\u5730\u8fdb\u884c\u6392\u5e8f\uff08\u5b50\u95ee\u9898\u53ef\u4ee5\u72ec\u7acb\u8fdb\u884c\u6c42\u89e3\uff09\u3002
  3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e24\u4e2a\u6709\u5e8f\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002
"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u901a\u8fc7\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\uff0c\u5f80\u5f80\u8fd8\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u76f8\u8f83\u4e8e\u9009\u62e9\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u4e3a\u5b83\u4eec\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

\u90a3\u4e48\uff0c\u6211\u4eec\u4e0d\u7981\u53d1\u95ee\uff1a\u4e3a\u4ec0\u4e48\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c42\u903b\u8f91\u662f\u4ec0\u4e48\uff1f\u6362\u53e5\u8bdd\u8bf4\uff0c\u5c06\u5927\u95ee\u9898\u5206\u89e3\u4e3a\u591a\u4e2a\u5b50\u95ee\u9898\u3001\u89e3\u51b3\u5b50\u95ee\u9898\u3001\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u5408\u5e76\u4e3a\u539f\u95ee\u9898\u7684\u89e3\uff0c\u8fd9\u51e0\u6b65\u7684\u6548\u7387\u4e3a\u4ec0\u4e48\u6bd4\u76f4\u63a5\u89e3\u51b3\u539f\u95ee\u9898\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u8fd9\u4e2a\u95ee\u9898\u53ef\u4ee5\u4ece\u64cd\u4f5c\u6570\u91cf\u548c\u5e76\u884c\u8ba1\u7b97\u4e24\u65b9\u9762\u6765\u8ba8\u8bba\u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6570\u91cf\u4f18\u5316","text":"

\u4ee5\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u4e3a\u4f8b\uff0c\u5176\u5904\u7406\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u9700\u8981 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5047\u8bbe\u6211\u4eec\u6309\u7167\u56fe 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u5219\u5212\u5206\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6bcf\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O((n / 2)^2)\\) \u65f6\u95f4\uff0c\u5408\u5e76\u4e24\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

\\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

\u56fe 12-2 \u00a0 \u5212\u5206\u6570\u7ec4\u524d\u540e\u7684\u5192\u6ce1\u6392\u5e8f

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8ba1\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u8fb9\u548c\u53f3\u8fb9\u5206\u522b\u4e3a\u5212\u5206\u524d\u548c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u603b\u6570\uff1a

\\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

\u8fd9\u610f\u5473\u7740\u5f53 \\(n > 4\\) \u65f6\uff0c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u6570\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u5e94\u8be5\u66f4\u9ad8\u3002\u8bf7\u6ce8\u610f\uff0c\u5212\u5206\u540e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u9636 \\(O(n^2)\\) \uff0c\u53ea\u662f\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\u4e86\u3002

\u8fdb\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u4eec\u628a\u5b50\u6570\u7ec4\u4e0d\u65ad\u5730\u518d\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u505c\u6b62\u5212\u5206\u5462\uff1f\u8fd9\u79cd\u601d\u8def\u5b9e\u9645\u4e0a\u5c31\u662f\u201c\u5f52\u5e76\u6392\u5e8f\u201d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u4eec\u591a\u8bbe\u7f6e\u51e0\u4e2a\u5212\u5206\u70b9\uff0c\u5c06\u539f\u6570\u7ec4\u5e73\u5747\u5212\u5206\u4e3a \\(k\\) \u4e2a\u5b50\u6570\u7ec4\u5462\uff1f\u8fd9\u79cd\u60c5\u51b5\u4e0e\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u7c7b\u4f3c\uff0c\u5b83\u975e\u5e38\u9002\u5408\u6392\u5e8f\u6d77\u91cf\u6570\u636e\uff0c\u7406\u8bba\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230 \\(O(n + k)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e76\u884c\u8ba1\u7b97\u4f18\u5316","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u5e76\u884c\u89e3\u51b3\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8fd8\u6709\u5229\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002

\u5e76\u884c\u4f18\u5316\u5728\u591a\u6838\u6216\u591a\u5904\u7406\u5668\u7684\u73af\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u4e3a\u7cfb\u7edf\u53ef\u4ee5\u540c\u65f6\u5904\u7406\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8ba1\u7b97\u8d44\u6e90\uff0c\u4ece\u800c\u663e\u8457\u51cf\u5c11\u603b\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u3002

\u6bd4\u5982\u5728\u56fe 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u4eec\u5c06\u6d77\u91cf\u7684\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u5219\u53ef\u5c06\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52a1\u5206\u6563\u5230\u5404\u4e2a\u8ba1\u7b97\u5355\u5143\uff0c\u5b8c\u6210\u540e\u518d\u5408\u5e76\u7ed3\u679c\u3002

\u56fe 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e76\u884c\u8ba1\u7b97

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u89c1\u5e94\u7528","text":"

\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u6765\u89e3\u51b3\u8bb8\u591a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\u3002

  • \u5bfb\u627e\u6700\u8fd1\u70b9\u5bf9\uff1a\u8be5\u7b97\u6cd5\u9996\u5148\u5c06\u70b9\u96c6\u5206\u6210\u4e24\u90e8\u5206\uff0c\u7136\u540e\u5206\u522b\u627e\u51fa\u4e24\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u70b9\u5bf9\uff0c\u6700\u540e\u627e\u51fa\u8de8\u8d8a\u4e24\u90e8\u5206\u7684\u6700\u8fd1\u70b9\u5bf9\u3002
  • \u5927\u6574\u6570\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u6574\u6570\u4e58\u6cd5\u5206\u89e3\u4e3a\u51e0\u4e2a\u8f83\u5c0f\u7684\u6574\u6570\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u77e9\u9635\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u77e9\u9635\u4e58\u6cd5\u5206\u89e3\u4e3a\u591a\u4e2a\u5c0f\u77e9\u9635\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u6c49\u8bfa\u5854\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u89e3\u51b3\uff0c\u8fd9\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u5e94\u7528\u3002
  • \u6c42\u89e3\u9006\u5e8f\u5bf9\uff1a\u5728\u4e00\u4e2a\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6570\u5b57\u5927\u4e8e\u540e\u9762\u7684\u6570\u5b57\uff0c\u90a3\u4e48\u8fd9\u4e24\u4e2a\u6570\u5b57\u6784\u6210\u4e00\u4e2a\u9006\u5e8f\u5bf9\u3002\u6c42\u89e3\u9006\u5e8f\u5bf9\u95ee\u9898\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u501f\u52a9\u5f52\u5e76\u6392\u5e8f\u8fdb\u884c\u6c42\u89e3\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u4e2d\u5e94\u7528\u5f97\u975e\u5e38\u5e7f\u6cdb\u3002

  • \u4e8c\u5206\u67e5\u627e\uff1a\u4e8c\u5206\u67e5\u627e\u662f\u5c06\u6709\u5e8f\u6570\u7ec4\u4ece\u4e2d\u70b9\u7d22\u5f15\u5904\u5206\u4e3a\u4e24\u90e8\u5206\uff0c\u7136\u540e\u6839\u636e\u76ee\u6807\u503c\u4e0e\u4e2d\u95f4\u5143\u7d20\u503c\u6bd4\u8f83\u7ed3\u679c\uff0c\u51b3\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u533a\u95f4\uff0c\u5e76\u5728\u5269\u4f59\u533a\u95f4\u6267\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
  • \u5f52\u5e76\u6392\u5e8f\uff1a\u672c\u8282\u5f00\u5934\u5df2\u4ecb\u7ecd\uff0c\u4e0d\u518d\u8d58\u8ff0\u3002
  • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9009\u53d6\u4e00\u4e2a\u57fa\u51c6\u503c\uff0c\u7136\u540e\u628a\u6570\u7ec4\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5927\uff0c\u518d\u5bf9\u8fd9\u4e24\u90e8\u5206\u8fdb\u884c\u76f8\u540c\u7684\u5212\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e0b\u4e00\u4e2a\u5143\u7d20\u3002
  • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c06\u6570\u636e\u5206\u6563\u5230\u591a\u4e2a\u6876\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u5404\u4e2a\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002
  • \u6811\uff1a\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u7ea2\u9ed1\u6811\u3001B \u6811\u3001B+ \u6811\u7b49\uff0c\u5b83\u4eec\u7684\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u89c6\u4e3a\u5206\u6cbb\u7b56\u7565\u7684\u5e94\u7528\u3002
  • \u5806\uff1a\u5806\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u5176\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u5220\u9664\u548c\u5806\u5316\uff0c\u5b9e\u9645\u4e0a\u90fd\u9690\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
  • \u54c8\u5e0c\u8868\uff1a\u867d\u7136\u54c8\u5e0c\u8868\u5e76\u4e0d\u76f4\u63a5\u5e94\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u54c8\u5e0c\u51b2\u7a81\u89e3\u51b3\u65b9\u6848\u95f4\u63a5\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u94fe\u5f0f\u5730\u5740\u4e2d\u7684\u957f\u94fe\u8868\u4f1a\u88ab\u8f6c\u5316\u4e3a\u7ea2\u9ed1\u6811\uff0c\u4ee5\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002

\u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u79cd\u201c\u6da6\u7269\u7ec6\u65e0\u58f0\u201d\u7684\u7b97\u6cd5\u601d\u60f3\uff0c\u9690\u542b\u5728\u5404\u79cd\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u4e2d\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898","text":"

\u5728\u5f52\u5e76\u6392\u5e8f\u548c\u6784\u5efa\u4e8c\u53c9\u6811\u4e2d\uff0c\u6211\u4eec\u90fd\u662f\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a\u539f\u95ee\u9898\u4e00\u534a\u7684\u5b50\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u6c49\u8bfa\u5854\u95ee\u9898\uff0c\u6211\u4eec\u91c7\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

Question

\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8bb0\u4e3a A\u3001B \u548c C \u3002\u8d77\u59cb\u72b6\u6001\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u7740 \\(n\\) \u4e2a\u5706\u76d8\uff0c\u5b83\u4eec\u4ece\u4e0a\u5230\u4e0b\u6309\u7167\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6211\u4eec\u7684\u4efb\u52a1\u662f\u8981\u628a\u8fd9 \\(n\\) \u4e2a\u5706\u76d8\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u5e76\u4fdd\u6301\u5b83\u4eec\u7684\u539f\u6709\u987a\u5e8f\u4e0d\u53d8\uff08\u5982\u56fe 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52a8\u5706\u76d8\u7684\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u89c4\u5219\u3002

  1. \u5706\u76d8\u53ea\u80fd\u4ece\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u62ff\u51fa\uff0c\u4ece\u53e6\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u653e\u5165\u3002
  2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\u3002
  3. \u5c0f\u5706\u76d8\u5fc5\u987b\u65f6\u523b\u4f4d\u4e8e\u5927\u5706\u76d8\u4e4b\u4e0a\u3002

\u56fe 12-10 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u793a\u4f8b

\u6211\u4eec\u5c06\u89c4\u6a21\u4e3a \\(i\\) \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u8bb0\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c06 \\(3\\) \u4e2a\u5706\u76d8\u4ece A \u79fb\u52a8\u81f3 C \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u8651\u57fa\u672c\u60c5\u51b5","text":"

\u5982\u56fe 12-11 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(1)\\) \uff0c\u5373\u5f53\u53ea\u6709\u4e00\u4e2a\u5706\u76d8\u65f6\uff0c\u6211\u4eec\u5c06\u5b83\u76f4\u63a5\u4ece A \u79fb\u52a8\u81f3 C \u5373\u53ef\u3002

<1><2>

\u56fe 12-11 \u00a0 \u89c4\u6a21\u4e3a 1 \u7684\u95ee\u9898\u7684\u89e3

\u5982\u56fe 12-12 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(2)\\) \uff0c\u5373\u5f53\u6709\u4e24\u4e2a\u5706\u76d8\u65f6\uff0c\u7531\u4e8e\u8981\u65f6\u523b\u6ee1\u8db3\u5c0f\u5706\u76d8\u5728\u5927\u5706\u76d8\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u501f\u52a9 B \u6765\u5b8c\u6210\u79fb\u52a8\u3002

  1. \u5148\u5c06\u4e0a\u9762\u7684\u5c0f\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
  2. \u518d\u5c06\u5927\u5706\u76d8\u4ece A \u79fb\u81f3 C \u3002
  3. \u6700\u540e\u5c06\u5c0f\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u56fe 12-12 \u00a0 \u89c4\u6a21\u4e3a 2 \u7684\u95ee\u9898\u7684\u89e3

\u89e3\u51b3\u95ee\u9898 \\(f(2)\\) \u7684\u8fc7\u7a0b\u53ef\u603b\u7ed3\u4e3a\uff1a\u5c06\u4e24\u4e2a\u5706\u76d8\u501f\u52a9 B \u4ece A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u79f0\u4e3a\u76ee\u6807\u67f1\u3001B \u79f0\u4e3a\u7f13\u51b2\u67f1\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u95ee\u9898\u5206\u89e3","text":"

\u5bf9\u4e8e\u95ee\u9898 \\(f(3)\\) \uff0c\u5373\u5f53\u6709\u4e09\u4e2a\u5706\u76d8\u65f6\uff0c\u60c5\u51b5\u53d8\u5f97\u7a0d\u5fae\u590d\u6742\u4e86\u4e00\u4e9b\u3002

\u56e0\u4e3a\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ece\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c06 A \u9876\u90e8\u7684\u4e24\u4e2a\u5706\u76d8\u770b\u4f5c\u4e00\u4e2a\u6574\u4f53\uff0c\u6267\u884c\u56fe 12-13 \u6240\u793a\u7684\u6b65\u9aa4\u3002\u8fd9\u6837\u4e09\u4e2a\u5706\u76d8\u5c31\u88ab\u987a\u5229\u5730\u4ece A \u79fb\u81f3 C \u4e86\u3002

  1. \u4ee4 B \u4e3a\u76ee\u6807\u67f1\u3001C \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
  2. \u5c06 A \u4e2d\u5269\u4f59\u7684\u4e00\u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u52a8\u81f3 C \u3002
  3. \u4ee4 C \u4e3a\u76ee\u6807\u67f1\u3001A \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u56fe 12-13 \u00a0 \u89c4\u6a21\u4e3a 3 \u7684\u95ee\u9898\u7684\u89e3

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u5c06\u95ee\u9898 \\(f(3)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(2)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u4e4b\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002\u8fd9\u8bf4\u660e\u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u5e76\u3002

\u81f3\u6b64\uff0c\u6211\u4eec\u53ef\u603b\u7ed3\u51fa\u56fe 12-14 \u6240\u793a\u7684\u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c06\u539f\u95ee\u9898 \\(f(n)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \uff0c\u5e76\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u3002

  1. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 C \u4ece A \u79fb\u81f3 B \u3002
  2. \u5c06\u5269\u4f59 \\(1\\) \u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u81f3 C \u3002
  3. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 A \u4ece B \u79fb\u81f3 C \u3002

\u5bf9\u4e8e\u8fd9\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u901a\u8fc7\u76f8\u540c\u7684\u65b9\u5f0f\u8fdb\u884c\u9012\u5f52\u5212\u5206\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52a8\u64cd\u4f5c\u5373\u53ef\u3002

\u56fe 12-14 \u00a0 \u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c06\u67f1 src \u9876\u90e8\u7684 \\(i\\) \u4e2a\u5706\u76d8\u501f\u52a9\u7f13\u51b2\u67f1 buf \u79fb\u52a8\u81f3\u76ee\u6807\u67f1 tar \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\"\"\"\n    # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan = src.pop()\n    # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898\"\"\"\n    n = len(A)\n    # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
hanota.cpp
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src.back();\n    src.pop_back();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.java
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.cs
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
hanota.go
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src, tar *list.List) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan := src.Back()\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9876\u90e8\u5706\u76d8\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
hanota.swift
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.popLast()!\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u5217\u8868\u5c3e\u90e8\u662f\u67f1\u5b50\u9876\u90e8\n    // \u5c06 src \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
hanota.js
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src, tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.ts
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src: number[], tar: number[]): void {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.dart
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<int> src, List<int> tar) {\n  // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  int pan = src.removeLast();\n  // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
hanota.rs
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.remove(src.len() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.c
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
hanota.kt
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    val pan = src.removeAt(src.size - 1)\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
hanota.rb
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
hanota.zig
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 12-15 \u6240\u793a\uff0c\u6c49\u8bfa\u5854\u95ee\u9898\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5bf9\u5e94\u4e00\u4e2a\u5f00\u542f\u7684 dfs() \u51fd\u6570\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u56fe 12-15 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u7684\u9012\u5f52\u6811

Quote

\u6c49\u8bfa\u5854\u95ee\u9898\u6e90\u81ea\u4e00\u4e2a\u53e4\u8001\u7684\u4f20\u8bf4\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u4e2a\u5bfa\u5e99\u91cc\uff0c\u50e7\u4fa3\u4eec\u6709\u4e09\u6839\u9ad8\u5927\u7684\u94bb\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u4e2a\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5706\u76d8\u3002\u50e7\u4fa3\u4eec\u4e0d\u65ad\u5730\u79fb\u52a8\u5706\u76d8\uff0c\u4ed6\u4eec\u76f8\u4fe1\u5728\u6700\u540e\u4e00\u4e2a\u5706\u76d8\u88ab\u6b63\u786e\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u8fd9\u4e2a\u4e16\u754c\u5c31\u4f1a\u7ed3\u675f\u3002

\u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fa3\u4eec\u6bcf\u79d2\u949f\u79fb\u52a8\u4e00\u6b21\uff0c\u603b\u5171\u9700\u8981\u5927\u7ea6 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7ea6 \\(5850\\) \u4ebf\u5e74\uff0c\u8fdc\u8fdc\u8d85\u8fc7\u4e86\u73b0\u5728\u5bf9\u5b87\u5b99\u5e74\u9f84\u7684\u4f30\u8ba1\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u8fd9\u4e2a\u4f20\u8bf4\u662f\u771f\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u4e0d\u9700\u8981\u62c5\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u6765\u3002

"},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7ed3","text":"
  • \u5206\u6cbb\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u7b97\u6cd5\u8bbe\u8ba1\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5212\u5206\uff09\u548c\u6cbb\uff08\u5408\u5e76\uff09\u4e24\u4e2a\u9636\u6bb5\uff0c\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002
  • \u5224\u65ad\u662f\u5426\u662f\u5206\u6cbb\u7b97\u6cd5\u95ee\u9898\u7684\u4f9d\u636e\u5305\u62ec\uff1a\u95ee\u9898\u80fd\u5426\u5206\u89e3\u3001\u5b50\u95ee\u9898\u662f\u5426\u72ec\u7acb\u3001\u5b50\u95ee\u9898\u80fd\u5426\u5408\u5e76\u3002
  • \u5f52\u5e76\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\uff0c\u5176\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u7b49\u957f\u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u5f00\u59cb\u9010\u5c42\u5408\u5e76\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002
  • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u51cf\u5c11\u4e86\u64cd\u4f5c\u6570\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u540e\u6709\u5229\u4e8e\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002
  • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u51b3\u8bb8\u591a\u7b97\u6cd5\u95ee\u9898\uff0c\u4e5f\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u5904\u5904\u53ef\u89c1\u5176\u8eab\u5f71\u3002
  • \u76f8\u8f83\u4e8e\u66b4\u529b\u641c\u7d22\uff0c\u81ea\u9002\u5e94\u641c\u7d22\u6548\u7387\u66f4\u9ad8\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\u3002
  • \u4e8c\u5206\u67e5\u627e\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u4e2a\u5178\u578b\u5e94\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u7684\u6b65\u9aa4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\u3002
  • \u5728\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u95ee\u9898\u4e2d\uff0c\u6784\u5efa\u6811\uff08\u539f\u95ee\u9898\uff09\u53ef\u4ee5\u5212\u5206\u4e3a\u6784\u5efa\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5212\u5206\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u7684\u7d22\u5f15\u533a\u95f4\u6765\u5b9e\u73b0\u3002
  • \u5728\u6c49\u8bfa\u5854\u95ee\u9898\u4e2d\uff0c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(n\\) \u7684\u95ee\u9898\u53ef\u4ee5\u5212\u5206\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a \\(n-1\\) \u7684\u5b50\u95ee\u9898\u548c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(1\\) \u7684\u5b50\u95ee\u9898\u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002
"},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52a8\u6001\u89c4\u5212","text":"

Abstract

\u5c0f\u6eaa\u6c47\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u6c47\u5165\u5927\u6d77\u3002

\u52a8\u6001\u89c4\u5212\u5c06\u5c0f\u95ee\u9898\u7684\u89e3\u6c47\u96c6\u6210\u5927\u95ee\u9898\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9886\u6211\u4eec\u8d70\u5411\u89e3\u51b3\u95ee\u9898\u7684\u5f7c\u5cb8\u3002

"},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212
  • 14.2 \u00a0 DP \u95ee\u9898\u7279\u6027
  • 14.3 \u00a0 DP \u89e3\u9898\u601d\u8def
  • 14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898
  • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898
  • 14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898
  • 14.7 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52a8\u6001\u89c4\u5212\u95ee\u9898\u7279\u6027","text":"

\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u52a8\u6001\u89c4\u5212\u662f\u5982\u4f55\u901a\u8fc7\u5b50\u95ee\u9898\u5206\u89e3\u6765\u6c42\u89e3\u539f\u95ee\u9898\u7684\u3002\u5b9e\u9645\u4e0a\uff0c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u7684\u4fa7\u91cd\u70b9\u4e0d\u540c\u3002

  • \u5206\u6cbb\u7b97\u6cd5\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u591a\u4e2a\u76f8\u4e92\u72ec\u7acb\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u95ee\u9898\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6700\u7ec8\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
  • \u52a8\u6001\u89c4\u5212\u4e5f\u5bf9\u95ee\u9898\u8fdb\u884c\u9012\u5f52\u5206\u89e3\uff0c\u4f46\u4e0e\u5206\u6cbb\u7b97\u6cd5\u7684\u4e3b\u8981\u533a\u522b\u662f\uff0c\u52a8\u6001\u89c4\u5212\u4e2d\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u4f9d\u8d56\u7684\uff0c\u5728\u5206\u89e3\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0\u8bb8\u591a\u91cd\u53e0\u5b50\u95ee\u9898\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u5728\u5c1d\u8bd5\u548c\u56de\u9000\u4e2d\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u5e76\u901a\u8fc7\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\u3002\u539f\u95ee\u9898\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\u6784\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6bcf\u4e2a\u51b3\u7b56\u6b65\u9aa4\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u4e2a\u5b50\u95ee\u9898\u3002

\u5b9e\u9645\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u5e38\u7528\u6765\u6c42\u89e3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5b83\u4eec\u4e0d\u4ec5\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u8fd8\u5177\u6709\u53e6\u5916\u4e24\u5927\u7279\u6027\uff1a\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784","text":"

\u6211\u4eec\u5bf9\u722c\u697c\u68af\u95ee\u9898\u7a0d\u4f5c\u6539\u52a8\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9002\u5408\u5c55\u793a\u6700\u4f18\u5b50\u7ed3\u6784\u6982\u5ff5\u3002

\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7

\u7ed9\u5b9a\u4e00\u4e2a\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u6bcf\u4e00\u9636\u697c\u68af\u4e0a\u90fd\u8d34\u6709\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u4f60\u5728\u8be5\u53f0\u9636\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\u3002\u7ed9\u5b9a\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\u6570\u7ec4 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u4e2a\u53f0\u9636\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\\(cost[0]\\) \u4e3a\u5730\u9762\uff08\u8d77\u59cb\u70b9\uff09\u3002\u8bf7\u8ba1\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u4ef7\u624d\u80fd\u5230\u8fbe\u9876\u90e8\uff1f

\u5982\u56fe 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9636\u7684\u4ee3\u4ef7\u5206\u522b\u4e3a \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5219\u4ece\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7\u4e3a \\(2\\) \u3002

\u56fe 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7

\u8bbe \\(dp[i]\\) \u4e3a\u722c\u5230\u7b2c \\(i\\) \u9636\u7d2f\u8ba1\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\u7531\u4e8e\u7b2c \\(i\\) \u9636\u53ea\u53ef\u80fd\u4ece \\(i - 1\\) \u9636\u6216 \\(i - 2\\) \u9636\u8d70\u6765\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u4e8e \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u4e3a\u4e86\u5c3d\u53ef\u80fd\u51cf\u5c11\u4ee3\u4ef7\uff0c\u6211\u4eec\u5e94\u8be5\u9009\u62e9\u4e24\u8005\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\uff1a

\\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

\u8fd9\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u542b\u4e49\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u662f\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\u7684\u3002

\u672c\u9898\u663e\u7136\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6211\u4eec\u4ece\u4e24\u4e2a\u5b50\u95ee\u9898\u6700\u4f18\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9009\u51fa\u8f83\u4f18\u7684\u90a3\u4e00\u4e2a\uff0c\u5e76\u7528\u5b83\u6784\u5efa\u51fa\u539f\u95ee\u9898 \\(dp[i]\\) \u7684\u6700\u4f18\u89e3\u3002

\u90a3\u4e48\uff0c\u4e0a\u4e00\u8282\u7684\u722c\u697c\u68af\u9898\u76ee\u6709\u6ca1\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u5462\uff1f\u5b83\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u4e2a\u8ba1\u6570\u95ee\u9898\uff0c\u4f46\u5982\u679c\u6362\u4e00\u79cd\u95ee\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6570\u91cf\u201d\u3002\u6211\u4eec\u610f\u5916\u5730\u53d1\u73b0\uff0c\u867d\u7136\u9898\u76ee\u4fee\u6539\u524d\u540e\u662f\u7b49\u4ef7\u7684\uff0c\u4f46\u6700\u4f18\u5b50\u7ed3\u6784\u6d6e\u73b0\u51fa\u6765\u4e86\uff1a\u7b2c \\(n\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u7b49\u4e8e\u7b2c \\(n-1\\) \u9636\u548c\u7b2c \\(n-2\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8bf4\uff0c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u89e3\u91ca\u65b9\u5f0f\u6bd4\u8f83\u7075\u6d3b\uff0c\u5728\u4e0d\u540c\u95ee\u9898\u4e2d\u4f1a\u6709\u4e0d\u540c\u7684\u542b\u4e49\u3002

\u6839\u636e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72b6\u6001 \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f97\u5230\u52a8\u6001\u89c4\u5212\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\u3002

\u56fe 14-7 \u00a0 \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u672c\u9898\u4e5f\u53ef\u4ee5\u8fdb\u884c\u7a7a\u95f4\u4f18\u5316\uff0c\u5c06\u4e00\u7ef4\u538b\u7f29\u81f3\u96f6\u7ef4\uff0c\u4f7f\u5f97\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u65e0\u540e\u6548\u6027","text":"

\u65e0\u540e\u6548\u6027\u662f\u52a8\u6001\u89c4\u5212\u80fd\u591f\u6709\u6548\u89e3\u51b3\u95ee\u9898\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u4e49\u4e3a\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u786e\u5b9a\u7684\u72b6\u6001\uff0c\u5b83\u7684\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u5f53\u524d\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002

\u4ee5\u722c\u697c\u68af\u95ee\u9898\u4e3a\u4f8b\uff0c\u7ed9\u5b9a\u72b6\u6001 \\(i\\) \uff0c\u5b83\u4f1a\u53d1\u5c55\u51fa\u72b6\u6001 \\(i+1\\) \u548c\u72b6\u6001 \\(i+2\\) \uff0c\u5206\u522b\u5bf9\u5e94\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u8fd9\u4e24\u79cd\u9009\u62e9\u65f6\uff0c\u6211\u4eec\u65e0\u987b\u8003\u8651\u72b6\u6001 \\(i\\) \u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5b83\u4eec\u5bf9\u72b6\u6001 \\(i\\) \u7684\u672a\u6765\u6ca1\u6709\u5f71\u54cd\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u7ed9\u722c\u697c\u68af\u95ee\u9898\u6dfb\u52a0\u4e00\u4e2a\u7ea6\u675f\uff0c\u60c5\u51b5\u5c31\u4e0d\u4e00\u6837\u4e86\u3002

\u5e26\u7ea6\u675f\u722c\u697c\u68af

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u4f46\u4e0d\u80fd\u8fde\u7eed\u4e24\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5982\u56fe 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u9636\u4ec5\u5269 \\(2\\) \u79cd\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u8fde\u7eed\u4e09\u6b21\u8df3 \\(1\\) \u9636\u7684\u65b9\u6848\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\uff0c\u56e0\u6b64\u88ab\u820d\u5f03\u3002

\u56fe 14-8 \u00a0 \u5e26\u7ea6\u675f\u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

\u5728\u8be5\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\uff0c\u90a3\u4e48\u4e0b\u4e00\u8f6e\u5c31\u5fc5\u987b\u8df3 \\(2\\) \u9636\u3002\u8fd9\u610f\u5473\u7740\uff0c\u4e0b\u4e00\u6b65\u9009\u62e9\u4e0d\u80fd\u7531\u5f53\u524d\u72b6\u6001\uff08\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u72ec\u7acb\u51b3\u5b9a\uff0c\u8fd8\u548c\u524d\u4e00\u4e2a\u72b6\u6001\uff08\u4e0a\u4e00\u8f6e\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u6709\u5173\u3002

\u4e0d\u96be\u53d1\u73b0\uff0c\u6b64\u95ee\u9898\u5df2\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u4e3a \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8bb8\u591a\u201c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\u201d\u65b9\u6848\uff0c\u800c\u4e3a\u4e86\u6ee1\u8db3\u7ea6\u675f\uff0c\u6211\u4eec\u5c31\u4e0d\u80fd\u5c06 \\(dp[i-1]\\) \u76f4\u63a5\u8ba1\u5165 \\(dp[i]\\) \u4e2d\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff1a\u72b6\u6001 \\([i, j]\\) \u8868\u793a\u5904\u5728\u7b2c \\(i\\) \u9636\u5e76\u4e14\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(j\\) \u9636\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72b6\u6001\u5b9a\u4e49\u6709\u6548\u5730\u533a\u5206\u4e86\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u8fd8\u662f \\(2\\) \u9636\uff0c\u6211\u4eec\u53ef\u4ee5\u636e\u6b64\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u4ece\u4f55\u800c\u6765\u7684\u3002

  • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ea\u80fd\u9009\u62e9\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u4ece \\(dp[i-1, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002
  • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(2\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ef\u9009\u62e9\u8df3 \\(1\\) \u9636\u6216\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u4ece \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002

\u5982\u56fe 14-9 \u6240\u793a\uff0c\u5728\u8be5\u5b9a\u4e49\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u65b9\u6848\u6570\u3002\u6b64\u65f6\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

\u56fe 14-9 \u00a0 \u8003\u8651\u7ea6\u675f\u4e0b\u7684\u9012\u63a8\u5173\u7cfb

\u6700\u7ec8\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u4e24\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u9636\u7684\u65b9\u6848\u603b\u6570\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
climbing_stairs_constraint_dp.cpp
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.java
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.cs
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
climbing_stairs_constraint_dp.go
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.swift
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.js
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.ts
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.dart
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.rs
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.c
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
climbing_stairs_constraint_dp.kt
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.rb
[class]{}-[func]{climbing_stairs_constraint_dp}\n
climbing_stairs_constraint_dp.zig
// \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u4e8e\u4ec5\u9700\u591a\u8003\u8651\u524d\u9762\u4e00\u4e2a\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff0c\u4f7f\u5f97\u95ee\u9898\u91cd\u65b0\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u95ee\u9898\u5177\u6709\u975e\u5e38\u4e25\u91cd\u7684\u201c\u6709\u540e\u6548\u6027\u201d\u3002

\u722c\u697c\u68af\u4e0e\u969c\u788d\u751f\u6210

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\u3002\u89c4\u5b9a\u5f53\u722c\u5230\u7b2c \\(i\\) \u9636\u65f6\uff0c\u7cfb\u7edf\u81ea\u52a8\u4f1a\u5728\u7b2c \\(2i\\) \u9636\u4e0a\u653e\u4e0a\u969c\u788d\u7269\uff0c\u4e4b\u540e\u6240\u6709\u8f6e\u90fd\u4e0d\u5141\u8bb8\u8df3\u5230\u7b2c \\(2i\\) \u9636\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u4e24\u8f6e\u5206\u522b\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u9636\u4e0a\uff0c\u5219\u4e4b\u540e\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u9636\u4e0a\u3002\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5728\u8fd9\u4e2a\u95ee\u9898\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8dc3\u4f9d\u8d56\u8fc7\u53bb\u6240\u6709\u7684\u72b6\u6001\uff0c\u56e0\u4e3a\u6bcf\u4e00\u6b21\u8df3\u8dc3\u90fd\u4f1a\u5728\u66f4\u9ad8\u7684\u9636\u68af\u4e0a\u8bbe\u7f6e\u969c\u788d\uff0c\u5e76\u5f71\u54cd\u672a\u6765\u7684\u8df3\u8dc3\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u52a8\u6001\u89c4\u5212\u5f80\u5f80\u96be\u4ee5\u89e3\u51b3\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u590d\u6742\u7684\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff08\u4f8b\u5982\u65c5\u884c\u5546\u95ee\u9898\uff09\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u542f\u53d1\u5f0f\u641c\u7d22\u3001\u9057\u4f20\u7b97\u6cd5\u3001\u5f3a\u5316\u5b66\u4e60\u7b49\uff0c\u4ece\u800c\u5728\u6709\u9650\u65f6\u95f4\u5185\u5f97\u5230\u53ef\u7528\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52a8\u6001\u89c4\u5212\u89e3\u9898\u601d\u8def","text":"

\u4e0a\u4e24\u8282\u4ecb\u7ecd\u4e86\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4e3b\u8981\u7279\u5f81\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u4e00\u8d77\u63a2\u7a76\u4e24\u4e2a\u66f4\u52a0\u5b9e\u7528\u7684\u95ee\u9898\u3002

  1. \u5982\u4f55\u5224\u65ad\u4e00\u4e2a\u95ee\u9898\u662f\u4e0d\u662f\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff1f
  2. \u6c42\u89e3\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8be5\u4ece\u4f55\u5904\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9aa4\u662f\u4ec0\u4e48\uff1f
"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u95ee\u9898\u5224\u65ad","text":"

\u603b\u7684\u6765\u8bf4\uff0c\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u90a3\u4e48\u5b83\u901a\u5e38\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u4eec\u5f88\u96be\u4ece\u95ee\u9898\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u8fd9\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u653e\u5bbd\u6761\u4ef6\uff0c\u5148\u89c2\u5bdf\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7a77\u4e3e\uff09\u89e3\u51b3\u3002

\u9002\u5408\u7528\u56de\u6eaf\u89e3\u51b3\u7684\u95ee\u9898\u901a\u5e38\u6ee1\u8db3\u201c\u51b3\u7b56\u6811\u6a21\u578b\u201d\uff0c\u8fd9\u79cd\u95ee\u9898\u53ef\u4ee5\u4f7f\u7528\u6811\u5f62\u7ed3\u6784\u6765\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\uff0c\u6bcf\u4e00\u6761\u8def\u5f84\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\u3002

\u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u95ee\u9898\u5305\u542b\u660e\u786e\u7684\u51b3\u7b56\u6982\u5ff5\uff0c\u5e76\u4e14\u89e3\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u51b3\u7b56\u4ea7\u751f\u7684\uff0c\u90a3\u4e48\u5b83\u5c31\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u6765\u89e3\u51b3\u3002

\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8fd8\u6709\u4e00\u4e9b\u5224\u65ad\u7684\u201c\u52a0\u5206\u9879\u201d\u3002

  • \u95ee\u9898\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u4f18\u5316\u63cf\u8ff0\u3002
  • \u95ee\u9898\u7684\u72b6\u6001\u80fd\u591f\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u3001\u591a\u7ef4\u77e9\u9635\u6216\u6811\u6765\u8868\u793a\uff0c\u5e76\u4e14\u4e00\u4e2a\u72b6\u6001\u4e0e\u5176\u5468\u56f4\u7684\u72b6\u6001\u5b58\u5728\u9012\u63a8\u5173\u7cfb\u3002

\u76f8\u5e94\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u51cf\u5206\u9879\u201d\u3002

  • \u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u4f18\u89e3\u3002
  • \u95ee\u9898\u63cf\u8ff0\u4e2d\u6709\u660e\u663e\u7684\u6392\u5217\u7ec4\u5408\u7684\u7279\u5f81\uff0c\u9700\u8981\u8fd4\u56de\u5177\u4f53\u7684\u591a\u4e2a\u65b9\u6848\u3002

\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u5e76\u5177\u6709\u8f83\u4e3a\u660e\u663e\u7684\u201c\u52a0\u5206\u9879\u201d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5047\u8bbe\u5b83\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff0c\u5e76\u5728\u6c42\u89e3\u8fc7\u7a0b\u4e2d\u9a8c\u8bc1\u5b83\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u95ee\u9898\u6c42\u89e3\u6b65\u9aa4","text":"

\u52a8\u6001\u89c4\u5212\u7684\u89e3\u9898\u6d41\u7a0b\u4f1a\u56e0\u95ee\u9898\u7684\u6027\u8d28\u548c\u96be\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\u63cf\u8ff0\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5bfc\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u7b49\u3002

\u4e3a\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u9898\u6b65\u9aa4\uff0c\u6211\u4eec\u4f7f\u7528\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\u201c\u6700\u5c0f\u8def\u5f84\u548c\u201d\u6765\u4e3e\u4f8b\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a \\(n \\times m\\) \u7684\u4e8c\u7ef4\u7f51\u683c grid \uff0c\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5305\u542b\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u8be5\u5355\u5143\u683c\u7684\u4ee3\u4ef7\u3002\u673a\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u5355\u5143\u683c\u4e3a\u8d77\u59cb\u70b9\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52a8\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u8fbe\u53f3\u4e0b\u89d2\u5355\u5143\u683c\u3002\u8bf7\u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f84\u548c\u3002

\u56fe 14-10 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u7f51\u683c\u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e3a \\(13\\) \u3002

\u56fe 14-10 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u793a\u4f8b\u6570\u636e

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u672c\u9898\u7684\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u5c31\u662f\u4ece\u5f53\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8bbe\u5f53\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\([i, j]\\) \uff0c\u5219\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u540e\uff0c\u7d22\u5f15\u53d8\u4e3a \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72b6\u6001\u5e94\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u4e24\u4e2a\u53d8\u91cf\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u4ece\u8d77\u59cb\u70b9 \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\uff0c\u89e3\u8bb0\u4e3a \\(dp[i, j]\\) \u3002

\u81f3\u6b64\uff0c\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u56fe 14-11 \u6240\u793a\u7684\u4e8c\u7ef4 \\(dp\\) \u77e9\u9635\uff0c\u5176\u5c3a\u5bf8\u4e0e\u8f93\u5165\u7f51\u683c \\(grid\\) \u76f8\u540c\u3002

\u56fe 14-11 \u00a0 \u72b6\u6001\u5b9a\u4e49\u4e0e dp \u8868

Note

\u52a8\u6001\u89c4\u5212\u548c\u56de\u6eaf\u8fc7\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u4e3a\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\uff0c\u800c\u72b6\u6001\u7531\u6240\u6709\u51b3\u7b56\u53d8\u91cf\u6784\u6210\u3002\u5b83\u5e94\u5f53\u5305\u542b\u63cf\u8ff0\u89e3\u9898\u8fdb\u5ea6\u7684\u6240\u6709\u53d8\u91cf\uff0c\u5176\u5305\u542b\u4e86\u8db3\u591f\u7684\u4fe1\u606f\uff0c\u80fd\u591f\u7528\u6765\u63a8\u5bfc\u51fa\u4e0b\u4e00\u4e2a\u72b6\u6001\u3002

\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5b9a\u4e49\u4e00\u4e2a \\(dp\\) \u8868\u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u72b6\u6001\u7684\u6bcf\u4e2a\u72ec\u7acb\u53d8\u91cf\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\u3002\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72b6\u6001\u548c\u5b50\u95ee\u9898\u7684\u89e3\u4e4b\u95f4\u7684\u6620\u5c04\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u5bf9\u4e8e\u72b6\u6001 \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u4ece\u4e0a\u8fb9\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u8fb9\u683c\u5b50 \\([i, j-1]\\) \u8f6c\u79fb\u800c\u6765\u3002\u56e0\u6b64\u6700\u4f18\u5b50\u7ed3\u6784\u4e3a\uff1a\u5230\u8fbe \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e0e \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\u51b3\u5b9a\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u56fe 14-12 \u6240\u793a\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

\u56fe 14-12 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

Note

\u6839\u636e\u5b9a\u4e49\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u95ee\u9898\u548c\u5b50\u95ee\u9898\u7684\u5173\u7cfb\uff0c\u627e\u51fa\u901a\u8fc7\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6765\u6784\u9020\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u4f18\u5b50\u7ed3\u6784\u3002

\u4e00\u65e6\u6211\u4eec\u627e\u5230\u4e86\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5728\u672c\u9898\u4e2d\uff0c\u5904\u5728\u9996\u884c\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u5de6\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u5904\u5728\u9996\u5217\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u4e0a\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u8fb9\u754c\u6761\u4ef6\u3002

\u5982\u56fe 14-13 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528\u5faa\u73af\u6765\u904d\u5386\u77e9\u9635\uff0c\u5916\u5faa\u73af\u904d\u5386\u5404\u884c\uff0c\u5185\u5faa\u73af\u904d\u5386\u5404\u5217\u3002

\u56fe 14-13 \u00a0 \u8fb9\u754c\u6761\u4ef6\u4e0e\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

Note

\u8fb9\u754c\u6761\u4ef6\u5728\u52a8\u6001\u89c4\u5212\u4e2d\u7528\u4e8e\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u7d22\u4e2d\u7528\u4e8e\u526a\u679d\u3002

\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8bc1\u5728\u8ba1\u7b97\u5f53\u524d\u95ee\u9898\u7684\u89e3\u65f6\uff0c\u6240\u6709\u5b83\u4f9d\u8d56\u7684\u66f4\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u90fd\u5df2\u7ecf\u88ab\u6b63\u786e\u5730\u8ba1\u7b97\u51fa\u6765\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u5df2\u7ecf\u53ef\u4ee5\u76f4\u63a5\u5199\u51fa\u52a8\u6001\u89c4\u5212\u4ee3\u7801\u3002\u7136\u800c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u7d22 \\(\\rightarrow\\) \u8bb0\u5fc6\u5316\u641c\u7d22 \\(\\rightarrow\\) \u52a8\u6001\u89c4\u5212\u201d\u7684\u987a\u5e8f\u5b9e\u73b0\u66f4\u52a0\u7b26\u5408\u601d\u7ef4\u4e60\u60ef\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u4ece\u72b6\u6001 \\([i, j]\\) \u5f00\u59cb\u641c\u7d22\uff0c\u4e0d\u65ad\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u72b6\u6001 \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u9012\u5f52\u51fd\u6570\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, j]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u4ece \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c \\(dp[i, j]\\) \u3002
  • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53 \\(i = 0\\) \u4e14 \\(j = 0\\) \u65f6\uff0c\u8fd4\u56de\u4ee3\u4ef7 \\(grid[0, 0]\\) \u3002
  • \u526a\u679d\uff1a\u5f53 \\(i < 0\\) \u65f6\u6216 \\(j < 0\\) \u65f6\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u65f6\u8fd4\u56de\u4ee3\u4ef7 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.Min(left, up) + grid[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  return min(left, up) + grid[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-14 \u7ed9\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u4e3a\u6839\u8282\u70b9\u7684\u9012\u5f52\u6811\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5176\u6570\u91cf\u4f1a\u968f\u7740\u7f51\u683c grid \u7684\u5c3a\u5bf8\u53d8\u5927\u800c\u6025\u5267\u589e\u591a\u3002

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u539f\u56e0\u4e3a\uff1a\u5b58\u5728\u591a\u6761\u8def\u5f84\u53ef\u4ee5\u4ece\u5de6\u4e0a\u89d2\u5230\u8fbe\u67d0\u4e00\u5355\u5143\u683c\u3002

\u56fe 14-14 \u00a0 \u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

\u6bcf\u4e2a\u72b6\u6001\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u4e24\u79cd\u9009\u62e9\uff0c\u4ece\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u603b\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^{m + n})\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u79cd\u8ba1\u7b97\u65b9\u5f0f\u672a\u8003\u8651\u4e34\u8fd1\u7f51\u683c\u8fb9\u754c\u7684\u60c5\u51b5\uff0c\u5f53\u5230\u8fbe\u7f51\u7edc\u8fb9\u754c\u65f6\u53ea\u5269\u4e0b\u4e00\u79cd\u9009\u62e9\uff0c\u56e0\u6b64\u5b9e\u9645\u7684\u8def\u5f84\u6570\u91cf\u4f1a\u5c11\u4e00\u4e9b\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u6211\u4eec\u5f15\u5165\u4e00\u4e2a\u548c\u7f51\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8bb0\u5fc6\u5217\u8868 mem \uff0c\u7528\u4e8e\u8bb0\u5f55\u5404\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u8fdb\u884c\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs_mem}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8bb0\u5fc6\u5316\u540e\uff0c\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u72b6\u6001\u603b\u6570\uff0c\u5373\u7f51\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

\u56fe 14-15 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f84\u548c\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\uff0c\u5176\u904d\u5386\u4e86\u6574\u4e2a\u7f51\u683c\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

\u6570\u7ec4 dp \u5927\u5c0f\u4e3a \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u56fe 14-16 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u53ea\u4e0e\u5176\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u683c\u5b50\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u7528\u4e00\u4e2a\u5355\u884c\u6570\u7ec4\u6765\u5b9e\u73b0 \\(dp\\) \u8868\u3002

\u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u6570\u7ec4 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72b6\u6001\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72b6\u6001\uff0c\u800c\u662f\u5728\u904d\u5386\u6bcf\u884c\u65f6\u66f4\u65b0\u5b83\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ..< n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..<n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp_comp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898","text":"

\u7f16\u8f91\u8ddd\u79bb\uff0c\u4e5f\u79f0 Levenshtein \u8ddd\u79bb\uff0c\u6307\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u4e92\u76f8\u8f6c\u6362\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6570\uff0c\u901a\u5e38\u7528\u4e8e\u5728\u4fe1\u606f\u68c0\u7d22\u548c\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e2d\u5ea6\u91cf\u4e24\u4e2a\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

Question

\u8f93\u5165\u4e24\u4e2a\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c06 \\(s\\) \u8f6c\u6362\u4e3a \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

\u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\u8fdb\u884c\u4e09\u79cd\u7f16\u8f91\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u4e2a\u5b57\u7b26\u3001\u5220\u9664\u4e00\u4e2a\u5b57\u7b26\u3001\u5c06\u5b57\u7b26\u66ff\u6362\u4e3a\u4efb\u610f\u4e00\u4e2a\u5b57\u7b26\u3002

\u5982\u56fe 14-27 \u6240\u793a\uff0c\u5c06 kitten \u8f6c\u6362\u4e3a sitting \u9700\u8981\u7f16\u8f91 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u4e0e 1 \u6b21\u6dfb\u52a0\u64cd\u4f5c\uff1b\u5c06 hello \u8f6c\u6362\u4e3a algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u548c 1 \u6b21\u5220\u9664\u64cd\u4f5c\u3002

\u56fe 14-27 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u793a\u4f8b\u6570\u636e

\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u51b3\u7b56\u6811\u6a21\u578b\u6765\u89e3\u91ca\u3002\u5b57\u7b26\u4e32\u5bf9\u5e94\u6811\u8282\u70b9\uff0c\u4e00\u8f6e\u51b3\u7b56\uff08\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\uff09\u5bf9\u5e94\u6811\u7684\u4e00\u6761\u8fb9\u3002

\u5982\u56fe 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u51b5\u4e0b\uff0c\u6bcf\u4e2a\u8282\u70b9\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8bb8\u591a\u6761\u8fb9\uff0c\u6bcf\u6761\u8fb9\u5bf9\u5e94\u4e00\u79cd\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u4ece hello \u8f6c\u6362\u5230 algo \u6709\u8bb8\u591a\u79cd\u53ef\u80fd\u7684\u8def\u5f84\u3002

\u4ece\u51b3\u7b56\u6811\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u8282\u70b9 hello \u548c\u8282\u70b9 algo \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\u3002

\u56fe 14-28 \u00a0 \u57fa\u4e8e\u51b3\u7b56\u6811\u6a21\u578b\u8868\u793a\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u662f\u5bf9\u5b57\u7b26\u4e32 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\u3002

\u6211\u4eec\u5e0c\u671b\u5728\u7f16\u8f91\u64cd\u4f5c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u95ee\u9898\u7684\u89c4\u6a21\u9010\u6e10\u7f29\u5c0f\uff0c\u8fd9\u6837\u624d\u80fd\u6784\u5efa\u5b50\u95ee\u9898\u3002\u8bbe\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \uff0c\u6211\u4eec\u5148\u8003\u8651\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u4eec\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u76f4\u63a5\u8003\u8651 \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u4eec\u9700\u8981\u5bf9 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\uff08\u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\uff09\uff0c\u4f7f\u5f97\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26\u76f8\u540c\uff0c\u4ece\u800c\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u8003\u8651\u89c4\u6a21\u66f4\u5c0f\u7684\u95ee\u9898\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u5728\u5b57\u7b26\u4e32 \\(s\\) \u4e2d\u8fdb\u884c\u7684\u6bcf\u4e00\u8f6e\u51b3\u7b56\uff08\u7f16\u8f91\u64cd\u4f5c\uff09\uff0c\u90fd\u4f1a\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u4f59\u7684\u5f85\u5339\u914d\u5b57\u7b26\u53d1\u751f\u53d8\u5316\u3002\u56e0\u6b64\uff0c\u72b6\u6001\u4e3a\u5f53\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u8651\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u4e2a\u5b57\u7b26\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\uff1a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

\u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u8003\u8651\u5b50\u95ee\u9898 \\(dp[i, j]\\) \uff0c\u5176\u5bf9\u5e94\u7684\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5c3e\u90e8\u5b57\u7b26\u4e3a \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u636e\u4e0d\u540c\u7f16\u8f91\u64cd\u4f5c\u5206\u4e3a\u56fe 14-29 \u6240\u793a\u7684\u4e09\u79cd\u60c5\u51b5\u3002

  1. \u5728 \\(s[i-1]\\) \u4e4b\u540e\u6dfb\u52a0 \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i, j-1]\\) \u3002
  2. \u5220\u9664 \\(s[i-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j]\\) \u3002
  3. \u5c06 \\(s[i-1]\\) \u66ff\u6362\u4e3a \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j-1]\\) \u3002

\u56fe 14-29 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u72b6\u6001\u8f6c\u79fb

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7f16\u8f91\u6b65\u6570 \\(1\\) \u3002\u5bf9\u5e94\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

\u8bf7\u6ce8\u610f\uff0c\u5f53 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, j] = dp[i-1, j-1] \\]

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u4e24\u5b57\u7b26\u4e32\u90fd\u4e3a\u7a7a\u65f6\uff0c\u7f16\u8f91\u6b65\u6570\u4e3a \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u5f53 \\(s\\) \u4e3a\u7a7a\u4f46 \\(t\\) \u4e0d\u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(t\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u5f53 \\(s\\) \u4e0d\u4e3a\u7a7a\u4f46 \\(t\\) \u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(s\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

\u89c2\u5bdf\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8d56\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
edit_distance.cpp
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.java
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.cs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
edit_distance.go
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.swift
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.js
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.ts
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.dart
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
edit_distance.rs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
edit_distance.c
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
edit_distance.kt
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp}\n
edit_distance.zig
// \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-30 \u6240\u793a\uff0c\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\u4e0e\u80cc\u5305\u95ee\u9898\u975e\u5e38\u7c7b\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5199\u4e00\u4e2a\u4e8c\u7ef4\u7f51\u683c\u7684\u8fc7\u7a0b\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u56fe 14-30 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f6c\u79fb\u800c\u6765\u7684\uff0c\u800c\u6b63\u5e8f\u904d\u5386\u4f1a\u4e22\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u904d\u5386\u65e0\u6cd5\u63d0\u524d\u6784\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u4e24\u79cd\u904d\u5386\u987a\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf leftup \u6765\u6682\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u4ece\u800c\u53ea\u9700\u8003\u8651\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u65f6\u7684\u60c5\u51b5\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u904d\u5386\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n + 1):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u6682\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    return dp[m]\n
edit_distance.cpp
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.java
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.cs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.go
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i := 1; i <= n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.swift
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ... n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.js
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.ts
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.dart
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
edit_distance.rs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..=n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
edit_distance.c
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
edit_distance.kt
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp_comp}\n
edit_distance.zig
// \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n + 1) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212","text":"

\u52a8\u6001\u89c4\u5212\uff08dynamic programming\uff09\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u7b97\u6cd5\u8303\u5f0f\uff0c\u5b83\u5c06\u4e00\u4e2a\u95ee\u9898\u5206\u89e3\u4e3a\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u907f\u514d\u91cd\u590d\u8ba1\u7b97\uff0c\u4ece\u800c\u5927\u5e45\u63d0\u5347\u65f6\u95f4\u6548\u7387\u3002

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u4ece\u4e00\u4e2a\u7ecf\u5178\u4f8b\u9898\u5165\u624b\uff0c\u5148\u7ed9\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c2\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u518d\u9010\u6b65\u5bfc\u51fa\u66f4\u9ad8\u6548\u7684\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

\u722c\u697c\u68af

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5982\u56fe 14-1 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e00\u4e2a \\(3\\) \u9636\u697c\u68af\uff0c\u5171\u6709 \\(3\\) \u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\u3002

\u56fe 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u56de\u6eaf\u6765\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5c06\u722c\u697c\u68af\u60f3\u8c61\u4e3a\u4e00\u4e2a\u591a\u8f6e\u9009\u62e9\u7684\u8fc7\u7a0b\uff1a\u4ece\u5730\u9762\u51fa\u53d1\uff0c\u6bcf\u8f6e\u9009\u62e9\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u6bcf\u5f53\u5230\u8fbe\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u65b9\u6848\u6570\u91cf\u52a0 \\(1\\) \uff0c\u5f53\u8d8a\u8fc7\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u5176\u526a\u679d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    state = 0  # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
climbing_stairs_backtrack.cpp
/* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;                // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.java
/* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.cs
/* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.go
/* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state+choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    choices := []int{1, 2}\n    // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.swift
/* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
climbing_stairs_backtrack.js
/* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.ts
/* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.dart
/* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    if (state + choice > n) continue;\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
climbing_stairs_backtrack.rs
/* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
climbing_stairs_backtrack.c
/* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;           // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
climbing_stairs_backtrack.kt
/* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    val state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
climbing_stairs_backtrack.zig
// \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u697c\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    var state: i32 = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u5e76\u4e0d\u663e\u5f0f\u5730\u5bf9\u95ee\u9898\u8fdb\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c06\u6c42\u89e3\u95ee\u9898\u770b\u4f5c\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\uff0c\u901a\u8fc7\u8bd5\u63a2\u548c\u526a\u679d\uff0c\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

\u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u4ece\u95ee\u9898\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u8fd9\u9053\u9898\u3002\u8bbe\u722c\u5230\u7b2c \\(i\\) \u9636\u5171\u6709 \\(dp[i]\\) \u79cd\u65b9\u6848\uff0c\u90a3\u4e48 \\(dp[i]\\) \u5c31\u662f\u539f\u95ee\u9898\uff0c\u5176\u5b50\u95ee\u9898\u5305\u62ec\uff1a

\\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

\u7531\u4e8e\u6bcf\u8f6e\u53ea\u80fd\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u56e0\u6b64\u5f53\u6211\u4eec\u7ad9\u5728\u7b2c \\(i\\) \u9636\u697c\u68af\u4e0a\u65f6\uff0c\u4e0a\u4e00\u8f6e\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u4e0a\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ea\u80fd\u4ece\u7b2c \\(i -1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u8fc8\u5411\u7b2c \\(i\\) \u9636\u3002

\u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u63a8\u8bba\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u9636\u7684\u65b9\u6848\u6570\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u9636\u7684\u65b9\u6848\u6570\u5c31\u7b49\u4e8e\u722c\u5230\u7b2c \\(i\\) \u9636\u7684\u65b9\u6848\u6570\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

\\[ dp[i] = dp[i-1] + dp[i-2] \\]

\u8fd9\u610f\u5473\u7740\u5728\u722c\u697c\u68af\u95ee\u9898\u4e2d\uff0c\u5404\u4e2a\u5b50\u95ee\u9898\u4e4b\u95f4\u5b58\u5728\u9012\u63a8\u5173\u7cfb\uff0c\u539f\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u95ee\u9898\u7684\u89e3\u6784\u5efa\u5f97\u6765\u3002\u56fe 14-2 \u5c55\u793a\u4e86\u8be5\u9012\u63a8\u5173\u7cfb\u3002

\u56fe 14-2 \u00a0 \u65b9\u6848\u6570\u91cf\u9012\u63a8\u5173\u7cfb

\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9012\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u7d22\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u9012\u5f52\u5730\u5c06\u4e00\u4e2a\u8f83\u5927\u95ee\u9898\u62c6\u89e3\u4e3a\u4e24\u4e2a\u8f83\u5c0f\u95ee\u9898\u7684\u548c\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898 \\(dp[1]\\) \u548c \\(dp[2]\\) \u65f6\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u9636\u5206\u522b\u6709 \\(1\\)\u3001\\(2\\) \u79cd\u65b9\u6848\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5b83\u548c\u6807\u51c6\u56de\u6eaf\u4ee3\u7801\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u4f46\u66f4\u52a0\u7b80\u6d01\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
def dfs(i: int) -> int:\n    \"\"\"\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u641c\u7d22\"\"\"\n    return dfs(n)\n
climbing_stairs_dfs.cpp
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.java
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.cs
/* \u641c\u7d22 */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
climbing_stairs_dfs.go
/* \u641c\u7d22 */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.swift
/* \u641c\u7d22 */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
climbing_stairs_dfs.js
/* \u641c\u7d22 */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.ts
/* \u641c\u7d22 */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
climbing_stairs_dfs.dart
/* \u641c\u7d22 */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
climbing_stairs_dfs.rs
/* \u641c\u7d22 */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
climbing_stairs_dfs.c
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.kt
/* \u641c\u7d22 */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
climbing_stairs_dfs.zig
// \u641c\u7d22\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u641c\u7d22\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u7d22\u5f62\u6210\u7684\u9012\u5f52\u6811\u3002\u5bf9\u4e8e\u95ee\u9898 \\(dp[n]\\) \uff0c\u5176\u9012\u5f52\u6811\u7684\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002\u6307\u6570\u9636\u5c5e\u4e8e\u7206\u70b8\u5f0f\u589e\u957f\uff0c\u5982\u679c\u6211\u4eec\u8f93\u5165\u4e00\u4e2a\u6bd4\u8f83\u5927\u7684 \\(n\\) \uff0c\u5219\u4f1a\u9677\u5165\u6f2b\u957f\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

\u56fe 14-3 \u00a0 \u722c\u697c\u68af\u5bf9\u5e94\u9012\u5f52\u6811

\u89c2\u5bdf\u56fe 14-3 \uff0c\u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u201c\u91cd\u53e0\u5b50\u95ee\u9898\u201d\u5bfc\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u4e24\u8005\u90fd\u5305\u542b\u5b50\u95ee\u9898 \\(dp[7]\\) \u3002

\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5b50\u95ee\u9898\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5b50\u5b50\u5b59\u5b59\u65e0\u7a77\u5c3d\u4e5f\u3002\u7edd\u5927\u90e8\u5206\u8ba1\u7b97\u8d44\u6e90\u90fd\u6d6a\u8d39\u5728\u8fd9\u4e9b\u91cd\u53e0\u7684\u5b50\u95ee\u9898\u4e0a\u3002

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u4e3a\u4e86\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u4eec\u5e0c\u671b\u6240\u6709\u7684\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u6570\u7ec4 mem \u6765\u8bb0\u5f55\u6bcf\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u526a\u679d\u3002

  1. \u5f53\u9996\u6b21\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u5c06\u5176\u8bb0\u5f55\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u540e\u4f7f\u7528\u3002
  2. \u5f53\u518d\u6b21\u9700\u8981\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u4fbf\u53ef\u76f4\u63a5\u4ece mem[i] \u4e2d\u83b7\u53d6\u7ed3\u679c\uff0c\u4ece\u800c\u907f\u514d\u91cd\u590d\u8ba1\u7b97\u8be5\u5b50\u95ee\u9898\u3002

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
climbing_stairs_dfs_mem.cpp
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.java
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.cs
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
climbing_stairs_dfs_mem.go
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
climbing_stairs_dfs_mem.swift
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
climbing_stairs_dfs_mem.js
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.ts
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.dart
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8bb0\u5f55 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.rs
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
climbing_stairs_dfs_mem.c
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
climbing_stairs_dfs_mem.kt
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
climbing_stairs_dfs_mem.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
climbing_stairs_dfs_mem.zig
// \u8bb0\u5fc6\u5316\u641c\u7d22\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u56fe 14-4 \uff0c\u7ecf\u8fc7\u8bb0\u5fc6\u5316\u5904\u7406\u540e\uff0c\u6240\u6709\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u8fd9\u662f\u4e00\u4e2a\u5de8\u5927\u7684\u98de\u8dc3\u3002

\u56fe 14-4 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u5bf9\u5e94\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u201c\u4ece\u9876\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u4eec\u4ece\u539f\u95ee\u9898\uff08\u6839\u8282\u70b9\uff09\u5f00\u59cb\uff0c\u9012\u5f52\u5730\u5c06\u8f83\u5927\u5b50\u95ee\u9898\u5206\u89e3\u4e3a\u8f83\u5c0f\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u53f6\u8282\u70b9\uff09\u3002\u4e4b\u540e\uff0c\u901a\u8fc7\u56de\u6eaf\u9010\u5c42\u6536\u96c6\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

\u4e0e\u4e4b\u76f8\u53cd\uff0c\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u201c\u4ece\u5e95\u81f3\u9876\u201d\u7684\u65b9\u6cd5\uff1a\u4ece\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u6784\u5efa\u66f4\u5927\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002

\u7531\u4e8e\u52a8\u6001\u89c4\u5212\u4e0d\u5305\u542b\u56de\u6eaf\u8fc7\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u5faa\u73af\u8fed\u4ee3\u5b9e\u73b0\uff0c\u65e0\u987b\u4f7f\u7528\u9012\u5f52\u3002\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u4e0e\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u6570\u7ec4 mem \u76f8\u540c\u7684\u8bb0\u5f55\u4f5c\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.java
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.cs
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.go
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.swift
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.js
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.ts
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.dart
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
climbing_stairs_dp.rs
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
climbing_stairs_dp.c
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
climbing_stairs_dp.kt
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp}\n
climbing_stairs_dp.zig
// \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-5 \u6a21\u62df\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\u3002

\u56fe 14-5 \u00a0 \u722c\u697c\u68af\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u4e0e\u56de\u6eaf\u7b97\u6cd5\u4e00\u6837\uff0c\u52a8\u6001\u89c4\u5212\u4e5f\u4f7f\u7528\u201c\u72b6\u6001\u201d\u6982\u5ff5\u6765\u8868\u793a\u95ee\u9898\u6c42\u89e3\u7684\u7279\u5b9a\u9636\u6bb5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\u4ee5\u53ca\u76f8\u5e94\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u697c\u68af\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570 \\(i\\) \u3002

\u6839\u636e\u4ee5\u4e0a\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u52a8\u6001\u89c4\u5212\u7684\u5e38\u7528\u672f\u8bed\u3002

  • \u5c06\u6570\u7ec4 dp \u79f0\u4e3a dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72b6\u6001 \\(i\\) \u5bf9\u5e94\u5b50\u95ee\u9898\u7684\u89e3\u3002
  • \u5c06\u6700\u5c0f\u5b50\u95ee\u9898\u5bf9\u5e94\u7684\u72b6\u6001\uff08\u7b2c \\(1\\) \u9636\u548c\u7b2c \\(2\\) \u9636\u697c\u68af\uff09\u79f0\u4e3a\u521d\u59cb\u72b6\u6001\u3002
  • \u5c06\u9012\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u79f0\u4e3a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002
"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u7531\u4e8e \\(dp[i]\\) \u53ea\u4e0e \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u987b\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u800c\u53ea\u9700\u4e24\u4e2a\u53d8\u91cf\u6eda\u52a8\u524d\u8fdb\u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.java
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.cs
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.go
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
climbing_stairs_dp.swift
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
climbing_stairs_dp.js
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.ts
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.dart
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
climbing_stairs_dp.rs
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
climbing_stairs_dp.c
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.kt
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp_comp}\n
climbing_stairs_dp.zig
// \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u7531\u4e8e\u7701\u53bb\u4e86\u6570\u7ec4 dp \u5360\u7528\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

\u5728\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e2d\uff0c\u5f53\u524d\u72b6\u6001\u5f80\u5f80\u4ec5\u4e0e\u524d\u9762\u6709\u9650\u4e2a\u72b6\u6001\u6709\u5173\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72b6\u6001\uff0c\u901a\u8fc7\u201c\u964d\u7ef4\u201d\u6765\u8282\u7701\u5185\u5b58\u7a7a\u95f4\u3002\u8fd9\u79cd\u7a7a\u95f4\u4f18\u5316\u6280\u5de7\u88ab\u79f0\u4e3a\u201c\u6eda\u52a8\u53d8\u91cf\u201d\u6216\u201c\u6eda\u52a8\u6570\u7ec4\u201d\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898","text":"

\u80cc\u5305\u95ee\u9898\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u52a8\u6001\u89c4\u5212\u5165\u95e8\u9898\u76ee\uff0c\u662f\u52a8\u6001\u89c4\u5212\u4e2d\u6700\u5e38\u89c1\u7684\u95ee\u9898\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u95ee\u9898\u3001\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u3001\u591a\u91cd\u80cc\u5305\u95ee\u9898\u7b49\u3002

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6765\u6c42\u89e3\u6700\u5e38\u89c1\u7684 0-1 \u80cc\u5305\u95ee\u9898\u3002

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002

\u89c2\u5bdf\u56fe 14-17 \uff0c\u7531\u4e8e\u7269\u54c1\u7f16\u53f7 \\(i\\) \u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u6570\u7ec4\u7d22\u5f15\u4ece \\(0\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5bf9\u5e94\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u4ef7\u503c \\(val[i-1]\\) \u3002

\u56fe 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u6570\u636e

\u6211\u4eec\u53ef\u4ee5\u5c06 0-1 \u80cc\u5305\u95ee\u9898\u770b\u4f5c\u4e00\u4e2a\u7531 \\(n\\) \u8f6e\u51b3\u7b56\u7ec4\u6210\u7684\u8fc7\u7a0b\uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u4f53\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u4e24\u79cd\u51b3\u7b56\uff0c\u56e0\u6b64\u8be5\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\u3002

\u8be5\u95ee\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u201d\uff0c\u56e0\u6b64\u8f83\u5927\u6982\u7387\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u54c1\u6765\u8bf4\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u51cf\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72b6\u6001\u5b9a\u4e49\uff1a\u5f53\u524d\u7269\u54c1\u7f16\u53f7 \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8bb0\u4e3a \\([i, c]\\) \u3002

\u72b6\u6001 \\([i, c]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\uff0c\u8bb0\u4e3a \\(dp[i, c]\\) \u3002

\u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u5f53\u6211\u4eec\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u51b3\u7b56\u540e\uff0c\u5269\u4f59\u7684\u662f\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u51b3\u7b56\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u51cf\u5c11 \\(wgt[i-1]\\) \uff0c\u4ef7\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c-wgt[i-1]]\\) \u3002

\u4e0a\u8ff0\u5206\u6790\u5411\u6211\u4eec\u63ed\u793a\u4e86\u672c\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6700\u5927\u4ef7\u503c \\(dp[i, c]\\) \u7b49\u4e8e\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\u3002\u7531\u6b64\u53ef\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u4f59\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u65e0\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\u6700\u5927\u4ef7\u503c\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

\u5f53\u524d\u72b6\u6001 \\([i, c]\\) \u4ece\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c-wgt[i-1]]\\) \u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u6309\u987a\u5e8f\u5b9e\u73b0\u66b4\u529b\u641c\u7d22\u3001\u8bb0\u5fc6\u5316\u641c\u7d22\u3001\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u641c\u7d22\u4ee3\u7801\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, c]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5b50\u95ee\u9898\u7684\u89e3 \\(dp[i, c]\\) \u3002
  • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53\u7269\u54c1\u7f16\u53f7\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5e76\u8fd4\u56de\u4ef7\u503c \\(0\\) \u3002
  • \u526a\u679d\uff1a\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes);\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.Max(no, yes);\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return int(math.Max(float64(no), float64(yes)))\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  return max(no, yes);\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    std::cmp::max(no, yes)\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return myMax(no, yes);\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return @max(no, yes);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-18 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u7269\u54c1\u90fd\u4f1a\u4ea7\u751f\u4e0d\u9009\u548c\u9009\u4e24\u6761\u641c\u7d22\u5206\u652f\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002

\u89c2\u5bdf\u9012\u5f52\u6811\uff0c\u5bb9\u6613\u53d1\u73b0\u5176\u4e2d\u5b58\u5728\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u5f53\u7269\u54c1\u8f83\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f83\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f83\u591a\u65f6\uff0c\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u6570\u91cf\u5c06\u4f1a\u5927\u5e45\u589e\u591a\u3002

\u56fe 14-18 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u4e3a\u4e86\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u6211\u4eec\u501f\u52a9\u8bb0\u5fc6\u5217\u8868 mem \u6765\u8bb0\u5f55\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5bf9\u5e94 \\(dp[i, c]\\) \u3002

\u5f15\u5165\u8bb0\u5fc6\u5316\u4e4b\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5b50\u95ee\u9898\u6570\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs_mem}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-19 \u5c55\u793a\u4e86\u5728\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u88ab\u526a\u6389\u7684\u641c\u7d22\u5206\u652f\u3002

\u56fe 14-19 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u52a8\u6001\u89c4\u5212\u5b9e\u8d28\u4e0a\u5c31\u662f\u5728\u72b6\u6001\u8f6c\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u8fc7\u7a0b\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-20 \u6240\u793a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u7531\u6570\u7ec4 dp \u5927\u5c0f\u51b3\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14>

\u56fe 14-20 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u90fd\u53ea\u4e0e\u5176\u4e0a\u4e00\u884c\u7684\u72b6\u6001\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e24\u4e2a\u6570\u7ec4\u6eda\u52a8\u524d\u8fdb\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

\u8fdb\u4e00\u6b65\u601d\u8003\uff0c\u6211\u4eec\u80fd\u5426\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u5b9e\u73b0\u7a7a\u95f4\u4f18\u5316\u5462\uff1f\u89c2\u5bdf\u53ef\u77e5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f6c\u79fb\u8fc7\u6765\u7684\u3002\u5047\u8bbe\u53ea\u6709\u4e00\u4e2a\u6570\u7ec4\uff0c\u5f53\u5f00\u59cb\u904d\u5386\u7b2c \\(i\\) \u884c\u65f6\uff0c\u8be5\u6570\u7ec4\u5b58\u50a8\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72b6\u6001\u3002

  • \u5982\u679c\u91c7\u53d6\u6b63\u5e8f\u904d\u5386\uff0c\u90a3\u4e48\u904d\u5386\u5230 \\(dp[i, j]\\) \u65f6\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7ecf\u88ab\u8986\u76d6\uff0c\u6b64\u65f6\u5c31\u65e0\u6cd5\u5f97\u5230\u6b63\u786e\u7684\u72b6\u6001\u8f6c\u79fb\u7ed3\u679c\u3002
  • \u5982\u679c\u91c7\u53d6\u5012\u5e8f\u904d\u5386\uff0c\u5219\u4e0d\u4f1a\u53d1\u751f\u8986\u76d6\u95ee\u9898\uff0c\u72b6\u6001\u8f6c\u79fb\u53ef\u4ee5\u6b63\u786e\u8fdb\u884c\u3002

\u56fe 14-21 \u5c55\u793a\u4e86\u5728\u5355\u4e2a\u6570\u7ec4\u4e0b\u4ece\u7b2c \\(i = 1\\) \u884c\u8f6c\u6362\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u8fc7\u7a0b\u3002\u8bf7\u601d\u8003\u6b63\u5e8f\u904d\u5386\u548c\u5012\u5e8f\u904d\u5386\u7684\u533a\u522b\u3002

<1><2><3><4><5><6>

\u56fe 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4 \\(i\\) \u76f4\u63a5\u5220\u9664\uff0c\u5e76\u4e14\u628a\u5185\u5faa\u73af\u66f4\u6539\u4e3a\u5012\u5e8f\u904d\u5386\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u904d\u5386\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u904d\u5386\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u904d\u5386\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u904d\u5386\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp_comp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u904d\u5386\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7ed3","text":"
  • \u52a8\u6001\u89c4\u5212\u5bf9\u95ee\u9898\u8fdb\u884c\u5206\u89e3\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u89c4\u907f\u91cd\u590d\u8ba1\u7b97\uff0c\u63d0\u9ad8\u8ba1\u7b97\u6548\u7387\u3002
  • \u4e0d\u8003\u8651\u65f6\u95f4\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52a8\u6001\u89c4\u5212\u95ee\u9898\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u7d22\uff09\u8fdb\u884c\u6c42\u89e3\uff0c\u4f46\u9012\u5f52\u6811\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u6548\u7387\u6781\u4f4e\u3002\u901a\u8fc7\u5f15\u5165\u8bb0\u5fc6\u5316\u5217\u8868\uff0c\u53ef\u4ee5\u5b58\u50a8\u6240\u6709\u8ba1\u7b97\u8fc7\u7684\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u4ece\u800c\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002
  • \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u9012\u5f52\u5f0f\u89e3\u6cd5\uff0c\u800c\u4e0e\u4e4b\u5bf9\u5e94\u7684\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u4ece\u5e95\u81f3\u9876\u7684\u9012\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5199\u8868\u683c\u201d\u4e00\u6837\u3002\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u4ec5\u4f9d\u8d56\u67d0\u4e9b\u5c40\u90e8\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\uff0c\u4ece\u800c\u964d\u4f4e\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8d28\u3002
  • \u52a8\u6001\u89c4\u5212\u95ee\u9898\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002
  • \u5982\u679c\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u53ef\u4ee5\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\uff0c\u5219\u5b83\u5c31\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u3002
  • \u65e0\u540e\u6548\u6027\u6307\u5bf9\u4e8e\u4e00\u4e2a\u72b6\u6001\uff0c\u5176\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u8be5\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u4e0d\u5177\u6709\u65e0\u540e\u6548\u6027\uff0c\u65e0\u6cd5\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5feb\u901f\u6c42\u89e3\u3002

\u80cc\u5305\u95ee\u9898

  • \u80cc\u5305\u95ee\u9898\u662f\u6700\u5178\u578b\u7684\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u53d8\u79cd\u3002
  • 0-1 \u80cc\u5305\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\u3002\u6839\u636e\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u4e24\u79cd\u51b3\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\uff0c\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u904d\u5386\u5217\u8868\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72b6\u6001\u88ab\u8986\u76d6\u3002
  • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u6bcf\u79cd\u7269\u54c1\u7684\u9009\u53d6\u6570\u91cf\u65e0\u9650\u5236\uff0c\u56e0\u6b64\u9009\u62e9\u653e\u5165\u7269\u54c1\u7684\u72b6\u6001\u8f6c\u79fb\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\u3002\u7531\u4e8e\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\u5e94\u5f53\u6b63\u5e8f\u904d\u5386\u3002
  • \u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u4e2a\u53d8\u79cd\u3002\u5b83\u4ece\u6c42\u201c\u6700\u5927\u201d\u4ef7\u503c\u53d8\u4e3a\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e01\u6570\u91cf\uff0c\u56e0\u6b64\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u5e94\u6539\u4e3a \\(\\min()\\) \u3002\u4ece\u8ffd\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u6765\u8868\u793a\u201c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u201d\u7684\u65e0\u6548\u89e3\u3002
  • \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u4ece\u6c42\u201c\u6700\u5c11\u786c\u5e01\u6570\u91cf\u201d\u6539\u4e3a\u6c42\u201c\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u201d\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u76f8\u5e94\u5730\u4ece \\(\\min()\\) \u6539\u4e3a\u6c42\u548c\u8fd0\u7b97\u7b26\u3002

\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

  • \u7f16\u8f91\u8ddd\u79bb\uff08Levenshtein \u8ddd\u79bb\uff09\u7528\u4e8e\u8861\u91cf\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u4e49\u4e3a\u4ece\u4e00\u4e2a\u5b57\u7b26\u4e32\u5230\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u7f16\u8f91\u64cd\u4f5c\u5305\u62ec\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\u3002
  • \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002\u5f53 \\(s[i] \\ne t[j]\\) \u65f6\uff0c\u5177\u6709\u4e09\u79cd\u51b3\u7b56\uff1a\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\uff0c\u5b83\u4eec\u90fd\u6709\u76f8\u5e94\u7684\u5269\u4f59\u5b50\u95ee\u9898\u3002\u636e\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u6784\u5efa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u800c\u5f53 \\(s[i] = t[j]\\) \u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\u3002
  • \u5728\u7f16\u8f91\u8ddd\u79bb\u4e2d\uff0c\u72b6\u6001\u4f9d\u8d56\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u6b63\u5e8f\u6216\u5012\u5e8f\u904d\u5386\u90fd\u65e0\u6cd5\u6b63\u786e\u5730\u8fdb\u884c\u72b6\u6001\u8f6c\u79fb\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u53d8\u91cf\u6682\u5b58\u5de6\u4e0a\u65b9\u72b6\u6001\uff0c\u4ece\u800c\u8f6c\u5316\u5230\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7b49\u4ef7\u7684\u60c5\u51b5\uff0c\u53ef\u4ee5\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002
"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6c42\u89e3\u53e6\u4e00\u4e2a\u5e38\u89c1\u7684\u80cc\u5305\u95ee\u9898\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u4e86\u89e3\u5b83\u7684\u4e00\u79cd\u7279\u4f8b\uff1a\u96f6\u94b1\u5151\u6362\u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 14-22 \u6240\u793a\u3002

\u56fe 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\uff0c\u533a\u522b\u4ec5\u5728\u4e8e\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9009\u62e9\u6b21\u6570\u3002

  • \u5728 0-1 \u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u53ea\u6709\u4e00\u4e2a\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u53ea\u80fd\u4ece\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002
  • \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u7684\u6570\u91cf\u662f\u65e0\u9650\u7684\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u4ecd\u53ef\u4ee5\u4ece\u524d \\(i\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002

\u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u89c4\u5b9a\u4e0b\uff0c\u72b6\u6001 \\([i, c]\\) \u7684\u53d8\u5316\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

\u4ece\u800c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u53d8\u4e3a\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5bf9\u6bd4\u4e24\u9053\u9898\u76ee\u7684\u4ee3\u7801\uff0c\u72b6\u6001\u8f6c\u79fb\u4e2d\u6709\u4e00\u5904\u4ece \\(i-1\\) \u53d8\u4e3a \\(i\\) \uff0c\u5176\u4f59\u5b8c\u5168\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u662f\u4ece\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u72b6\u6001\u8f6c\u79fb\u800c\u6765\u7684\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u5e94\u8be5\u5bf9 \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002

\u8fd9\u4e2a\u904d\u5386\u987a\u5e8f\u4e0e 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8bf7\u501f\u52a9\u56fe 14-23 \u6765\u7406\u89e3\u4e24\u8005\u7684\u533a\u522b\u3002

<1><2><3><4><5><6>

\u56fe 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u4ee3\u7801\u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4\u5220\u9664\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp_comp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898","text":"

\u80cc\u5305\u95ee\u9898\u662f\u4e00\u5927\u7c7b\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4ee3\u8868\uff0c\u5176\u62e5\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 14-24 \u6240\u793a\u3002

\u56fe 14-24 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u96f6\u94b1\u5151\u6362\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\uff0c\u4e24\u8005\u5177\u6709\u4ee5\u4e0b\u8054\u7cfb\u4e0e\u4e0d\u540c\u70b9\u3002

  • \u4e24\u9053\u9898\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\uff0c\u201c\u7269\u54c1\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5bf9\u5e94\u201c\u76ee\u6807\u91d1\u989d\u201d\u3002
  • \u4f18\u5316\u76ee\u6807\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u4ef7\u503c\uff0c\u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e01\u6570\u91cf\u3002
  • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u94b1\u5151\u6362\u662f\u6c42\u201c\u6070\u597d\u201d\u51d1\u5230\u76ee\u6807\u91d1\u989d\u7684\u89e3\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u72b6\u6001 \\([i, a]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\uff0c\u8bb0\u4e3a \\(dp[i, a]\\) \u3002

\u4e8c\u7ef4 \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt+1)\\) \u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u672c\u9898\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u4e24\u70b9\u5dee\u5f02\u3002

  • \u672c\u9898\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c06\u8fd0\u7b97\u7b26 \\(\\max()\\) \u66f4\u6539\u4e3a \\(\\min()\\) \u3002
  • \u4f18\u5316\u4e3b\u4f53\u662f\u786c\u5e01\u6570\u91cf\u800c\u975e\u5546\u54c1\u4ef7\u503c\uff0c\u56e0\u6b64\u5728\u9009\u4e2d\u786c\u5e01\u65f6\u6267\u884c \\(+1\\) \u5373\u53ef\u3002
\\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u51d1\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u5373\u662f\u65e0\u6548\u89e3\u3002\u4e3a\u4f7f\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u6570\u80fd\u591f\u8bc6\u522b\u5e76\u8fc7\u6ee4\u65e0\u6548\u89e3\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528 \\(+ \\infty\\) \u6765\u8868\u793a\u5b83\u4eec\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(+ \\infty\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u5e76\u672a\u63d0\u4f9b \\(+ \\infty\\) \u53d8\u91cf\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u6765\u4ee3\u66ff\u3002\u800c\u8fd9\u53c8\u4f1a\u5bfc\u81f4\u5927\u6570\u8d8a\u754c\uff1a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u53d1\u751f\u6ea2\u51fa\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u6570\u5b57 \\(amt + 1\\) \u6765\u8868\u793a\u65e0\u6548\u89e3\uff0c\u56e0\u4e3a\u51d1\u51fa \\(amt\\) \u7684\u786c\u5e01\u6570\u91cf\u6700\u591a\u4e3a \\(amt\\) \u3002\u6700\u540e\u8fd4\u56de\u524d\uff0c\u5224\u65ad \\(dp[n, amt]\\) \u662f\u5426\u7b49\u4e8e \\(amt + 1\\) \uff0c\u82e5\u662f\u5219\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
coin_change.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
coin_change.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp}\n
coin_change.zig
// \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-25 \u5c55\u793a\u4e86\u96f6\u94b1\u5151\u6362\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u56fe 14-25 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u96f6\u94b1\u5151\u6362\u7684\u7a7a\u95f4\u4f18\u5316\u7684\u5904\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
coin_change.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp_comp}\n
coin_change.zig
// \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II","text":"

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u3002\u793a\u4f8b\u5982\u56fe 14-26 \u6240\u793a\u3002

\u56fe 14-26 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u76f8\u6bd4\u4e8e\u4e0a\u4e00\u9898\uff0c\u672c\u9898\u76ee\u6807\u662f\u6c42\u7ec4\u5408\u6570\u91cf\uff0c\u56e0\u6b64\u5b50\u95ee\u9898\u53d8\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u7ec4\u5408\u6570\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7ef4\u77e9\u9635\u3002

\u5f53\u524d\u72b6\u6001\u7684\u7ec4\u5408\u6570\u91cf\u7b49\u4e8e\u4e0d\u9009\u5f53\u524d\u786c\u5e01\u4e0e\u9009\u5f53\u524d\u786c\u5e01\u8fd9\u4e24\u79cd\u51b3\u7b56\u7684\u7ec4\u5408\u6570\u91cf\u4e4b\u548c\u3002\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

\u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u65e0\u987b\u9009\u62e9\u4efb\u4f55\u786c\u5e01\u5373\u53ef\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u5e94\u5c06\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u4e3a \\(1\\) \u3002\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
coin_change_ii.cpp
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.java
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.cs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
coin_change_ii.go
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.swift
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.js
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.ts
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.dart
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
coin_change_ii.rs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
coin_change_ii.c
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp}\n
coin_change_ii.zig
// \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7a7a\u95f4\u4f18\u5316\u5904\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u5220\u9664\u786c\u5e01\u7ef4\u5ea6\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
coin_change_ii.cpp
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.java
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.cs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.go
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.swift
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.js
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.ts
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.dart
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
coin_change_ii.rs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
coin_change_ii.c
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp_comp}\n
coin_change_ii.zig
// \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u56fe","text":"

Abstract

\u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u4eec\u5c31\u50cf\u662f\u4e00\u4e2a\u4e2a\u8282\u70b9\uff0c\u88ab\u65e0\u6570\u770b\u4e0d\u89c1\u7684\u8fb9\u76f8\u8fde\u3002

\u6bcf\u4e00\u6b21\u7684\u76f8\u8bc6\u4e0e\u76f8\u79bb\uff0c\u90fd\u5728\u8fd9\u5f20\u5de8\u5927\u7684\u7f51\u7edc\u56fe\u4e2d\u7559\u4e0b\u72ec\u7279\u7684\u5370\u8bb0\u3002

"},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 9.1 \u00a0 \u56fe
  • 9.2 \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c
  • 9.3 \u00a0 \u56fe\u7684\u904d\u5386
  • 9.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u56fe","text":"

\u56fe\uff08graph\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u9876\u70b9\uff08vertex\uff09\u548c\u8fb9\uff08edge\uff09\u7ec4\u6210\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u56fe \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9 \\(V\\) \u548c\u4e00\u7ec4\u8fb9 \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u4e2a\u5305\u542b 5 \u4e2a\u9876\u70b9\u548c 7 \u6761\u8fb9\u7684\u56fe\u3002

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

\u5982\u679c\u5c06\u9876\u70b9\u770b\u4f5c\u8282\u70b9\uff0c\u5c06\u8fb9\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u56fe\u770b\u4f5c\u4e00\u79cd\u4ece\u94fe\u8868\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\u3002\u5982\u56fe 9-1 \u6240\u793a\uff0c\u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002

\u56fe 9-1 \u00a0 \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

"},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u56fe\u7684\u5e38\u89c1\u7c7b\u578b\u4e0e\u672f\u8bed","text":"

\u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u65e0\u5411\u56fe\uff08undirected graph\uff09\u548c\u6709\u5411\u56fe\uff08directed graph\uff09\uff0c\u5982\u56fe 9-2 \u6240\u793a\u3002

  • \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u8fb9\u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u7684\u201c\u53cc\u5411\u201d\u8fde\u63a5\u5173\u7cfb\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u5173\u7cfb\u201d\u3002
  • \u5728\u6709\u5411\u56fe\u4e2d\uff0c\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u5173\u6ce8\u201d\u4e0e\u201c\u88ab\u5173\u6ce8\u201d\u5173\u7cfb\u3002

\u56fe 9-2 \u00a0 \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

\u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u8fde\u901a\u56fe\uff08connected graph\uff09\u548c\u975e\u8fde\u901a\u56fe\uff08disconnected graph\uff09\uff0c\u5982\u56fe 9-3 \u6240\u793a\u3002

  • \u5bf9\u4e8e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u53ef\u4ee5\u5230\u8fbe\u5176\u4f59\u4efb\u610f\u9876\u70b9\u3002
  • \u5bf9\u4e8e\u975e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002

\u56fe 9-3 \u00a0 \u8fde\u901a\u56fe\u4e0e\u975e\u8fde\u901a\u56fe

\u6211\u4eec\u8fd8\u53ef\u4ee5\u4e3a\u8fb9\u6dfb\u52a0\u201c\u6743\u91cd\u201d\u53d8\u91cf\uff0c\u4ece\u800c\u5f97\u5230\u5982\u56fe 9-4 \u6240\u793a\u7684\u6709\u6743\u56fe\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u8363\u8000\u300b\u7b49\u624b\u6e38\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u5171\u540c\u6e38\u620f\u65f6\u95f4\u6765\u8ba1\u7b97\u73a9\u5bb6\u4e4b\u95f4\u7684\u201c\u4eb2\u5bc6\u5ea6\u201d\uff0c\u8fd9\u79cd\u4eb2\u5bc6\u5ea6\u7f51\u7edc\u5c31\u53ef\u4ee5\u7528\u6709\u6743\u56fe\u6765\u8868\u793a\u3002

\u56fe 9-4 \u00a0 \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

\u56fe\u6570\u636e\u7ed3\u6784\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u672f\u8bed\u3002

  • \u90bb\u63a5\uff08adjacency\uff09\uff1a\u5f53\u4e24\u9876\u70b9\u4e4b\u95f4\u5b58\u5728\u8fb9\u76f8\u8fde\u65f6\uff0c\u79f0\u8fd9\u4e24\u9876\u70b9\u201c\u90bb\u63a5\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
  • \u8def\u5f84\uff08path\uff09\uff1a\u4ece\u9876\u70b9 A \u5230\u9876\u70b9 B \u7ecf\u8fc7\u7684\u8fb9\u6784\u6210\u7684\u5e8f\u5217\u88ab\u79f0\u4e3a\u4ece A \u5230 B \u7684\u201c\u8def\u5f84\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
  • \u5ea6\uff08degree\uff09\uff1a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u56fe\u7684\u8868\u793a","text":"

\u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

"},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u90bb\u63a5\u77e9\u9635","text":"

\u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u90bb\u63a5\u77e9\u9635\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u662f\u5426\u5b58\u5728\u8fb9\u3002

\u5982\u56fe 9-5 \u6240\u793a\uff0c\u8bbe\u90bb\u63a5\u77e9\u9635\u4e3a \\(M\\)\u3001\u9876\u70b9\u5217\u8868\u4e3a \\(V\\) \uff0c\u90a3\u4e48\u77e9\u9635\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9876\u70b9 \\(V[i]\\) \u5230\u9876\u70b9 \\(V[j]\\) \u4e4b\u95f4\u5b58\u5728\u8fb9\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u65e0\u8fb9\u3002

\u56fe 9-5 \u00a0 \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

\u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u9876\u70b9\u4e0d\u80fd\u4e0e\u81ea\u8eab\u76f8\u8fde\uff0c\u56e0\u6b64\u90bb\u63a5\u77e9\u9635\u4e3b\u5bf9\u89d2\u7ebf\u5143\u7d20\u6ca1\u6709\u610f\u4e49\u3002
  • \u5bf9\u4e8e\u65e0\u5411\u56fe\uff0c\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u7b49\u4ef7\uff0c\u6b64\u65f6\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\u3002
  • \u5c06\u90bb\u63a5\u77e9\u9635\u7684\u5143\u7d20\u4ece \\(1\\) \u548c \\(0\\) \u66ff\u6362\u4e3a\u6743\u91cd\uff0c\u5219\u53ef\u8868\u793a\u6709\u6743\u56fe\u3002

\u4f7f\u7528\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u77e9\u9635\u5143\u7d20\u4ee5\u83b7\u53d6\u8fb9\uff0c\u56e0\u6b64\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9635\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u5185\u5b58\u5360\u7528\u8f83\u591a\u3002

"},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u90bb\u63a5\u8868","text":"

\u90bb\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002\u56fe 9-6 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f7f\u7528\u90bb\u63a5\u8868\u5b58\u50a8\u7684\u56fe\u7684\u793a\u4f8b\u3002

\u56fe 9-6 \u00a0 \u56fe\u7684\u90bb\u63a5\u8868\u8868\u793a

\u90bb\u63a5\u8868\u4ec5\u5b58\u50a8\u5b9e\u9645\u5b58\u5728\u7684\u8fb9\uff0c\u800c\u8fb9\u7684\u603b\u6570\u901a\u5e38\u8fdc\u5c0f\u4e8e \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002\u7136\u800c\uff0c\u5728\u90bb\u63a5\u8868\u4e2d\u9700\u8981\u901a\u8fc7\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u5176\u65f6\u95f4\u6548\u7387\u4e0d\u5982\u90bb\u63a5\u77e9\u9635\u3002

\u89c2\u5bdf\u56fe 9-6 \uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u201c\u94fe\u5f0f\u5730\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u7684\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u6bd4\u5982\u5f53\u94fe\u8868\u8f83\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u5316\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u6548\u7387\u4ece \\(O(n)\\) \u4f18\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u8fd8\u53ef\u4ee5\u628a\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u56fe\u7684\u5e38\u89c1\u5e94\u7528","text":"

\u5982\u8868 9-1 \u6240\u793a\uff0c\u8bb8\u591a\u73b0\u5b9e\u7cfb\u7edf\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

\u8868 9-1 \u00a0 \u73b0\u5b9e\u751f\u6d3b\u4e2d\u5e38\u89c1\u7684\u56fe

\u9876\u70b9 \u8fb9 \u56fe\u8ba1\u7b97\u95ee\u9898 \u793e\u4ea4\u7f51\u7edc \u7528\u6237 \u597d\u53cb\u5173\u7cfb \u6f5c\u5728\u597d\u53cb\u63a8\u8350 \u5730\u94c1\u7ebf\u8def \u7ad9\u70b9 \u7ad9\u70b9\u95f4\u7684\u8fde\u901a\u6027 \u6700\u77ed\u8def\u7ebf\u63a8\u8350 \u592a\u9633\u7cfb \u661f\u4f53 \u661f\u4f53\u95f4\u7684\u4e07\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8f68\u9053\u8ba1\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u56fe\u7684\u57fa\u7840\u64cd\u4f5c","text":"

\u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u201c\u8fb9\u201d\u7684\u64cd\u4f5c\u548c\u5bf9\u201c\u9876\u70b9\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u5f0f\u5982\u56fe 9-7 \u6240\u793a\u3002

  • \u6dfb\u52a0\u6216\u5220\u9664\u8fb9\uff1a\u76f4\u63a5\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u800c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u9700\u8981\u540c\u65f6\u66f4\u65b0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u7684\u5c3e\u90e8\u6dfb\u52a0\u4e00\u884c\u4e00\u5217\uff0c\u5e76\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u4e00\u884c\u4e00\u5217\u3002\u5f53\u5220\u9664\u9996\u884c\u9996\u5217\u65f6\u8fbe\u5230\u6700\u5dee\u60c5\u51b5\uff0c\u9700\u8981\u5c06 \\((n-1)^2\\) \u4e2a\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52a8\u201d\uff0c\u4ece\u800c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u521d\u59cb\u5316\uff1a\u4f20\u5165 \\(n\\) \u4e2a\u9876\u70b9\uff0c\u521d\u59cb\u5316\u957f\u5ea6\u4e3a \\(n\\) \u7684\u9876\u70b9\u5217\u8868 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u90bb\u63a5\u77e9\u9635 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
\u521d\u59cb\u5316\u90bb\u63a5\u77e9\u9635\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

\u56fe 9-7 \u00a0 \u90bb\u63a5\u77e9\u9635\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

\u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\)\u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\u53ef\u6839\u636e\u56fe 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5b9e\u73b0\u5404\u79cd\u64cd\u4f5c\u3002

  • \u6dfb\u52a0\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u7684\u672b\u5c3e\u6dfb\u52a0\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u4e3a\u662f\u65e0\u5411\u56fe\uff0c\u6240\u4ee5\u9700\u8981\u540c\u65f6\u6dfb\u52a0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u5220\u9664\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u4e2d\u67e5\u627e\u5e76\u5220\u9664\u6307\u5b9a\u8fb9\uff0c\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\u3002\u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u9700\u8981\u540c\u65f6\u5220\u9664\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u94fe\u8868\uff0c\u5e76\u5c06\u65b0\u589e\u9876\u70b9\u4f5c\u4e3a\u94fe\u8868\u5934\u8282\u70b9\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u9876\u70b9\uff1a\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5220\u9664\u5305\u542b\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
  • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
\u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

\u56fe 9-8 \u00a0 \u90bb\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

\u4ee5\u4e0b\u662f\u90bb\u63a5\u8868\u7684\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u6bd4\u56fe 9-8 \uff0c\u5b9e\u9645\u4ee3\u7801\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

  • \u4e3a\u4e86\u65b9\u4fbf\u6dfb\u52a0\u4e0e\u5220\u9664\u9876\u70b9\uff0c\u4ee5\u53ca\u7b80\u5316\u4ee3\u7801\uff0c\u6211\u4eec\u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u6765\u4ee3\u66ff\u94fe\u8868\u3002
  • \u4f7f\u7528\u54c8\u5e0c\u8868\u6765\u5b58\u50a8\u90bb\u63a5\u8868\uff0ckey \u4e3a\u9876\u70b9\u5b9e\u4f8b\uff0cvalue \u4e3a\u8be5\u9876\u70b9\u7684\u90bb\u63a5\u9876\u70b9\u5217\u8868\uff08\u94fe\u8868\uff09\u3002

\u53e6\u5916\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u4e0e\u90bb\u63a5\u77e9\u9635\u4e00\u6837\uff0c\u7528\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u5047\u8bbe\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u6240\u6709\u5927\u4e8e \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684 Vertex \u5b9e\u4f8b\uff0c\u5220\u9664\u67d0\u4e00\u9876\u70b9\u4e4b\u540e\u5c31\u65e0\u987b\u6539\u52a8\u5176\u4ed6\u9876\u70b9\u4e86\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

\u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u8868 9-2 \u5bf9\u6bd4\u4e86\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u3002

\u8868 9-2 \u00a0 \u90bb\u63a5\u77e9\u9635\u4e0e\u90bb\u63a5\u8868\u5bf9\u6bd4

\u90bb\u63a5\u77e9\u9635 \u90bb\u63a5\u8868\uff08\u94fe\u8868\uff09 \u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09 \u5224\u65ad\u662f\u5426\u90bb\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u8fb9 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u8fb9 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u9876\u70b9 \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u9876\u70b9 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u5185\u5b58\u7a7a\u95f4\u5360\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

\u89c2\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\u6548\u7387\u4e0e\u7a7a\u95f4\u6548\u7387\u6700\u4f18\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u64cd\u4f5c\u8fb9\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u6570\u7ec4\u8bbf\u95ee\u6216\u8d4b\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7efc\u5408\u6765\u770b\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u7684\u539f\u5219\uff0c\u800c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u7684\u539f\u5219\u3002

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u56fe\u7684\u904d\u5386","text":"

\u6811\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5bf9\u591a\u201d\u7684\u5173\u7cfb\uff0c\u800c\u56fe\u5219\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5bf9\u591a\u201d\u5173\u7cfb\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6811\u770b\u4f5c\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\u3002\u663e\u7136\uff0c\u6811\u7684\u904d\u5386\u64cd\u4f5c\u4e5f\u662f\u56fe\u7684\u904d\u5386\u64cd\u4f5c\u7684\u4e00\u79cd\u7279\u4f8b\u3002

\u56fe\u548c\u6811\u90fd\u9700\u8981\u5e94\u7528\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u548c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

"},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\u67d0\u4e2a\u8282\u70b9\u51fa\u53d1\uff0c\u59cb\u7ec8\u4f18\u5148\u8bbf\u95ee\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5982\u56fe 9-9 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u9996\u5148\u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u7136\u540e\u904d\u5386\u4e0b\u4e00\u4e2a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u8bbf\u95ee\u5b8c\u6bd5\u3002

\u56fe 9-9 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

BFS \u901a\u5e38\u501f\u52a9\u961f\u5217\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002\u961f\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8d28\uff0c\u8fd9\u4e0e BFS \u7684\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u601d\u60f3\u5f02\u66f2\u540c\u5de5\u3002

  1. \u5c06\u904d\u5386\u8d77\u59cb\u9876\u70b9 startVet \u52a0\u5165\u961f\u5217\uff0c\u5e76\u5f00\u542f\u5faa\u73af\u3002
  2. \u5728\u5faa\u73af\u7684\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\uff0c\u5f39\u51fa\u961f\u9996\u9876\u70b9\u5e76\u8bb0\u5f55\u8bbf\u95ee\uff0c\u7136\u540e\u5c06\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u52a0\u5165\u5230\u961f\u5217\u5c3e\u90e8\u3002
  3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6bd5\u540e\u7ed3\u675f\u3002

\u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

Tip

\u54c8\u5e0c\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u53ea\u5b58\u50a8 key \u800c\u4e0d\u5b58\u50a8 value \u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fdb\u884c key \u7684\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u636e key \u7684\u552f\u4e00\u6027\uff0c\u54c8\u5e0c\u96c6\u5408\u901a\u5e38\u7528\u4e8e\u6570\u636e\u53bb\u91cd\u7b49\u573a\u666f\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
graph_bfs.kt
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u56fe 9-10 \u6765\u52a0\u6df1\u7406\u89e3\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 9-10 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0d\u552f\u4e00\u3002\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u987a\u5e8f\u904d\u5386\uff0c\u800c\u591a\u4e2a\u76f8\u540c\u8ddd\u79bb\u7684\u9876\u70b9\u7684\u904d\u5386\u987a\u5e8f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u3002\u4ee5\u56fe 9-10 \u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\)\u3001\\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\uff0c\u9876\u70b9 \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

"},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u5165\u961f\u5e76\u51fa\u961f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u5728\u904d\u5386\u90bb\u63a5\u9876\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \uff0c\u961f\u5217 que \u4e2d\u7684\u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\u5982\u56fe 9-11 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u5f53\u524d\u9876\u70b9\u7684\u67d0\u4e2a\u90bb\u63a5\u9876\u70b9\uff0c\u76f4\u5230\u8d70\u5230\u5c3d\u5934\u65f6\u8fd4\u56de\uff0c\u518d\u7ee7\u7eed\u8d70\u5230\u5c3d\u5934\u5e76\u8fd4\u56de\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u904d\u5386\u5b8c\u6210\u3002

\u56fe 9-11 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

\u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934\u518d\u8fd4\u56de\u201d\u7684\u7b97\u6cd5\u8303\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u5728\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u4e2d\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 9-12 \u6240\u793a\u3002

  • \u76f4\u865a\u7ebf\u4ee3\u8868\u5411\u4e0b\u9012\u63a8\uff0c\u8868\u793a\u5f00\u542f\u4e86\u4e00\u4e2a\u65b0\u7684\u9012\u5f52\u65b9\u6cd5\u6765\u8bbf\u95ee\u65b0\u9876\u70b9\u3002
  • \u66f2\u865a\u7ebf\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u9012\u5f52\u65b9\u6cd5\u5df2\u7ecf\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u5f00\u542f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

\u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe 9-12 \u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\u6a21\u62df\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6574\u4e2a DFS \u8fc7\u7a0b\uff0c\u5305\u62ec\u6bcf\u4e2a\u9012\u5f52\u65b9\u6cd5\u4f55\u65f6\u5f00\u542f\u3001\u4f55\u65f6\u8fd4\u56de\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 9-12 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5e8f\u5217\u7684\u987a\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7ed9\u5b9a\u67d0\u9876\u70b9\uff0c\u5148\u5f80\u54ea\u4e2a\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u90bb\u63a5\u9876\u70b9\u7684\u987a\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e71\uff0c\u90fd\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

\u4ee5\u6811\u7684\u904d\u5386\u4e3a\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\uff0c\u5b83\u4eec\u5c55\u793a\u4e86\u4e09\u79cd\u904d\u5386\u4f18\u5148\u7ea7\uff0c\u7136\u800c\u8fd9\u4e09\u8005\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

"},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u6700\u5927\u4e3a \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9\u548c\u4e00\u7ec4\u8fb9\u6784\u6210\u7684\u96c6\u5408\u3002
  • \u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002
  • \u6709\u5411\u56fe\u7684\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u8fde\u901a\u56fe\u4e2d\u7684\u4efb\u610f\u9876\u70b9\u5747\u53ef\u8fbe\uff0c\u6709\u6743\u56fe\u7684\u6bcf\u6761\u8fb9\u90fd\u5305\u542b\u6743\u91cd\u53d8\u91cf\u3002
  • \u90bb\u63a5\u77e9\u9635\u5229\u7528\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u6709\u8fb9\u6216\u65e0\u8fb9\u3002\u90bb\u63a5\u77e9\u9635\u5728\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u95f4\u5360\u7528\u8f83\u591a\u3002
  • \u90bb\u63a5\u8868\u4f7f\u7528\u591a\u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u3002\u90bb\u63a5\u8868\u76f8\u5bf9\u4e8e\u90bb\u63a5\u77e9\u9635\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0c\u4f46\u7531\u4e8e\u9700\u8981\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u65f6\u95f4\u6548\u7387\u8f83\u4f4e\u3002
  • \u5f53\u90bb\u63a5\u8868\u4e2d\u7684\u94fe\u8868\u8fc7\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u5176\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6216\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002
  • \u4ece\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002
  • \u56fe\u53ef\u7528\u4e8e\u5efa\u6a21\u5404\u7c7b\u73b0\u5b9e\u7cfb\u7edf\uff0c\u5982\u793e\u4ea4\u7f51\u7edc\u3001\u5730\u94c1\u7ebf\u8def\u7b49\u3002
  • \u6811\u662f\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\uff0c\u6811\u7684\u904d\u5386\u4e5f\u662f\u56fe\u7684\u904d\u5386\u7684\u4e00\u79cd\u7279\u4f8b\u3002
  • \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u3001\u5c42\u5c42\u6269\u5f20\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u901a\u5e38\u501f\u52a9\u961f\u5217\u5b9e\u73b0\u3002
  • \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u65f6\u518d\u56de\u6eaf\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

\u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

\u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u89c6\u4e3a\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

Q\uff1a\u975e\u8fde\u901a\u56fe\u4e2d\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

\u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

Q\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

\u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\uff0c\u8fd9\u6837\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

"},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8d2a\u5fc3","text":"

Abstract

\u5411\u65e5\u8475\u671d\u7740\u592a\u9633\u8f6c\u52a8\uff0c\u65f6\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u957f\u7684\u6700\u5927\u53ef\u80fd\u3002

\u8d2a\u5fc3\u7b56\u7565\u5728\u4e00\u8f6e\u8f6e\u7684\u7b80\u5355\u9009\u62e9\u4e2d\uff0c\u9010\u6b65\u5bfc\u5411\u6700\u4f73\u7b54\u6848\u3002

"},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5
  • 15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898
  • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898
  • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898
  • 15.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898","text":"

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u4ef7\u503c\u6839\u636e\u9009\u62e9\u7684\u91cd\u91cf\u6bd4\u4f8b\u8ba1\u7b97\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 15-3 \u6240\u793a\u3002

\u56fe 15-3 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

\u5206\u6570\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u6574\u4f53\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72b6\u6001\u5305\u542b\u5f53\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6807\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u4ef7\u503c\u3002

\u4e0d\u540c\u70b9\u5728\u4e8e\uff0c\u672c\u9898\u5141\u8bb8\u53ea\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u56fe 15-4 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u7269\u54c1\u4efb\u610f\u5730\u8fdb\u884c\u5207\u5206\uff0c\u5e76\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u6765\u8ba1\u7b97\u76f8\u5e94\u4ef7\u503c\u3002

  1. \u5bf9\u4e8e\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c\u4e3a \\(val[i-1] / wgt[i-1]\\) \uff0c\u7b80\u79f0\u5355\u4f4d\u4ef7\u503c\u3002
  2. \u5047\u8bbe\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u4e3a \\(w\\) \uff0c\u5219\u80cc\u5305\u589e\u52a0\u7684\u4ef7\u503c\u4e3a \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

\u56fe 15-4 \u00a0 \u7269\u54c1\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c

"},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u6700\u5927\u5316\u80cc\u5305\u5185\u7269\u54c1\u603b\u4ef7\u503c\uff0c\u672c\u8d28\u4e0a\u662f\u6700\u5927\u5316\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u4ef7\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u56fe 15-5 \u6240\u793a\u7684\u8d2a\u5fc3\u7b56\u7565\u3002

  1. \u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\u3002
  2. \u904d\u5386\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f6e\u8d2a\u5fc3\u5730\u9009\u62e9\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
  3. \u82e5\u5269\u4f59\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u4f7f\u7528\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6ee1\u80cc\u5305\u3002

\u56fe 15-5 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565

"},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u6211\u4eec\u5efa\u7acb\u4e86\u4e00\u4e2a\u7269\u54c1\u7c7b Item \uff0c\u4ee5\u4fbf\u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u8fdb\u884c\u6392\u5e8f\u3002\u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u5f53\u80cc\u5305\u5df2\u6ee1\u65f6\u8df3\u51fa\u5e76\u8fd4\u56de\u89e3\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u4ef7\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n    return res\n
fractional_knapsack.cpp
/* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.java
/* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.cs
/* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.go
/* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.swift
/* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u4ef7\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.js
/* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u4ef7\u503c\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.ts
/* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u4ef7\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.dart
/* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u4ef7\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break;\n    }\n  }\n  return res;\n}\n
fractional_knapsack.rs
/* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u4ef7\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    res\n}\n
fractional_knapsack.c
/* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n} Item;\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
fractional_knapsack.kt
/* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u4ef7\u503c\n)\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.rb
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
fractional_knapsack.zig
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u904d\u5386\u6574\u4e2a\u7269\u54c1\u5217\u8868\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u7269\u54c1\u6570\u91cf\u3002

\u7531\u4e8e\u521d\u59cb\u5316\u4e86\u4e00\u4e2a Item \u5bf9\u8c61\u5217\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

"},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u91c7\u7528\u53cd\u8bc1\u6cd5\u3002\u5047\u8bbe\u7269\u54c1 \\(x\\) \u662f\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u4ef7\u503c\u4e3a res \uff0c\u4f46\u8be5\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u73b0\u5728\u4ece\u80cc\u5305\u4e2d\u62ff\u51fa\u5355\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u5e76\u66ff\u6362\u4e3a\u5355\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u4e8e\u7269\u54c1 \\(x\\) \u7684\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u6362\u540e\u7684\u603b\u4ef7\u503c\u4e00\u5b9a\u5927\u4e8e res \u3002\u8fd9\u4e0e res \u662f\u6700\u4f18\u89e3\u77db\u76fe\uff0c\u8bf4\u660e\u6700\u4f18\u89e3\u4e2d\u5fc5\u987b\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u5bf9\u4e8e\u8be5\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u6784\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u603b\u800c\u8a00\u4e4b\uff0c\u5355\u4f4d\u4ef7\u503c\u66f4\u5927\u7684\u7269\u54c1\u603b\u662f\u66f4\u4f18\u9009\u62e9\uff0c\u8fd9\u8bf4\u660e\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

\u5982\u56fe 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c06\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u5355\u4f4d\u4ef7\u503c\u5206\u522b\u770b\u4f5c\u4e00\u5f20\u4e8c\u7ef4\u56fe\u8868\u7684\u6a2a\u8f74\u548c\u7eb5\u8f74\uff0c\u5219\u5206\u6570\u80cc\u5305\u95ee\u9898\u53ef\u8f6c\u5316\u4e3a\u201c\u6c42\u5728\u6709\u9650\u6a2a\u8f74\u533a\u95f4\u4e0b\u56f4\u6210\u7684\u6700\u5927\u9762\u79ef\u201d\u3002\u8fd9\u4e2a\u7c7b\u6bd4\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u51e0\u4f55\u89d2\u5ea6\u7406\u89e3\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

\u56fe 15-6 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u51e0\u4f55\u8868\u793a

"},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5","text":"

\u8d2a\u5fc3\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u7684\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u95ee\u9898\u7684\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\uff0c\u90fd\u9009\u62e9\u5f53\u524d\u770b\u8d77\u6765\u6700\u4f18\u7684\u9009\u62e9\uff0c\u5373\u8d2a\u5fc3\u5730\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002\u8d2a\u5fc3\u7b97\u6cd5\u7b80\u6d01\u4e14\u9ad8\u6548\uff0c\u5728\u8bb8\u591a\u5b9e\u9645\u95ee\u9898\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002

\u8d2a\u5fc3\u7b97\u6cd5\u548c\u52a8\u6001\u89c4\u5212\u90fd\u5e38\u7528\u4e8e\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u3002\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u5904\uff0c\u6bd4\u5982\u90fd\u4f9d\u8d56\u6700\u4f18\u5b50\u7ed3\u6784\u6027\u8d28\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

  • \u52a8\u6001\u89c4\u5212\u4f1a\u6839\u636e\u4e4b\u524d\u9636\u6bb5\u7684\u6240\u6709\u51b3\u7b56\u6765\u8003\u8651\u5f53\u524d\u51b3\u7b56\uff0c\u5e76\u4f7f\u7528\u8fc7\u53bb\u5b50\u95ee\u9898\u7684\u89e3\u6765\u6784\u5efa\u5f53\u524d\u5b50\u95ee\u9898\u7684\u89e3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4f1a\u8003\u8651\u8fc7\u53bb\u7684\u51b3\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u4e0d\u65ad\u7f29\u5c0f\u95ee\u9898\u8303\u56f4\uff0c\u76f4\u81f3\u95ee\u9898\u88ab\u89e3\u51b3\u3002

\u6211\u4eec\u5148\u901a\u8fc7\u4f8b\u9898\u201c\u96f6\u94b1\u5151\u6362\u201d\u4e86\u89e3\u8d2a\u5fc3\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u8fd9\u9053\u9898\u5df2\u7ecf\u5728\u201c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u76f8\u4fe1\u4f60\u5bf9\u5b83\u5e76\u4e0d\u964c\u751f\u3002

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

\u672c\u9898\u91c7\u53d6\u7684\u8d2a\u5fc3\u7b56\u7565\u5982\u56fe 15-1 \u6240\u793a\u3002\u7ed9\u5b9a\u76ee\u6807\u91d1\u989d\uff0c\u6211\u4eec\u8d2a\u5fc3\u5730\u9009\u62e9\u4e0d\u5927\u4e8e\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e01\uff0c\u4e0d\u65ad\u5faa\u73af\u8be5\u6b65\u9aa4\uff0c\u76f4\u81f3\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u4e3a\u6b62\u3002

\u56fe 15-1 \u00a0 \u96f6\u94b1\u5151\u6362\u7684\u8d2a\u5fc3\u7b56\u7565

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
coin_change_greedy.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
coin_change_greedy.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
coin_change_greedy.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9009\u62e9 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
coin_change_greedy.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
coin_change_greedy.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
coin_change_greedy.rb
[class]{}-[func]{coin_change_greedy}\n
coin_change_greedy.zig
[class]{}-[func]{coinChangeGreedy}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4f60\u53ef\u80fd\u4f1a\u4e0d\u7531\u5730\u53d1\u51fa\u611f\u53f9\uff1aSo clean \uff01\u8d2a\u5fc3\u7b97\u6cd5\u4ec5\u7528\u7ea6\u5341\u884c\u4ee3\u7801\u5c31\u89e3\u51b3\u4e86\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u64cd\u4f5c\u76f4\u63a5\u3001\u5b9e\u73b0\u7b80\u5355\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0c\u8bb0\u786c\u5e01\u6700\u5c0f\u9762\u503c\u4e3a \\(\\min(coins)\\) \uff0c\u5219\u8d2a\u5fc3\u9009\u62e9\u6700\u591a\u5faa\u73af \\(amt / \\min(coins)\\) \u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(amt / \\min(coins))\\) \u3002\u8fd9\u6bd4\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002

\u7136\u800c\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u9762\u503c\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5e76\u4e0d\u80fd\u627e\u5230\u6700\u4f18\u89e3\u3002\u56fe 15-2 \u7ed9\u51fa\u4e86\u4e24\u4e2a\u793a\u4f8b\u3002

  • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8be5\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u7ed9\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3\u3002
  • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8bbe \\(amt = 60\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(11\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(20 + 20 + 20\\) \uff0c\u4ec5\u9700 \\(3\\) \u679a\u786c\u5e01\u3002
  • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8bbe \\(amt = 98\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(49\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(49 + 49\\) \uff0c\u4ec5\u9700 \\(2\\) \u679a\u786c\u5e01\u3002

\u56fe 15-2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u627e\u51fa\u6700\u4f18\u89e3\u7684\u793a\u4f8b

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5bf9\u4e8e\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u4fdd\u8bc1\u627e\u5230\u5168\u5c40\u6700\u4f18\u89e3\uff0c\u5e76\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\u3002

\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u9002\u7528\u60c5\u51b5\u5206\u4ee5\u4e0b\u4e24\u79cd\u3002

  1. \u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5f80\u5f80\u662f\u6700\u4f18\u9009\u62e9\uff0c\u56e0\u4e3a\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u66f4\u9ad8\u6548\u3002
  2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5bf9\u4e8e\u5f88\u591a\u590d\u6742\u95ee\u9898\u6765\u8bf4\uff0c\u5bfb\u627e\u5168\u5c40\u6700\u4f18\u89e3\u975e\u5e38\u56f0\u96be\uff0c\u80fd\u4ee5\u8f83\u9ad8\u6548\u7387\u627e\u5230\u6b21\u4f18\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u9519\u7684\u3002
"},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7279\u6027","text":"

\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0c\u4ec0\u4e48\u6837\u7684\u95ee\u9898\u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8bf4\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1f

\u76f8\u8f83\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f7f\u7528\u6761\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u5173\u6ce8\u95ee\u9898\u7684\u4e24\u4e2a\u6027\u8d28\u3002

  • \u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\uff1a\u53ea\u6709\u5f53\u5c40\u90e8\u6700\u4f18\u9009\u62e9\u59cb\u7ec8\u53ef\u4ee5\u5bfc\u81f4\u5168\u5c40\u6700\u4f18\u89e3\u65f6\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u624d\u80fd\u4fdd\u8bc1\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u5305\u542b\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u3002

\u6700\u4f18\u5b50\u7ed3\u6784\u5df2\u7ecf\u5728\u201c\u52a8\u6001\u89c4\u5212\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u95ee\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\u5e76\u4e0d\u660e\u663e\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u89e3\u51b3\u3002

\u6211\u4eec\u4e3b\u8981\u63a2\u7a76\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u5224\u65ad\u65b9\u6cd5\u3002\u867d\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f83\u7b80\u5355\uff0c\u4f46\u5b9e\u9645\u4e0a\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\uff0c\u8bc1\u660e\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u5e76\u975e\u6613\u4e8b\u3002

\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u6211\u4eec\u867d\u7136\u80fd\u591f\u5bb9\u6613\u5730\u4e3e\u51fa\u53cd\u4f8b\uff0c\u5bf9\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u8fdb\u884c\u8bc1\u4f2a\uff0c\u4f46\u8bc1\u5b9e\u7684\u96be\u5ea6\u8f83\u5927\u3002\u5982\u679c\u95ee\uff1a\u6ee1\u8db3\u4ec0\u4e48\u6761\u4ef6\u7684\u786c\u5e01\u7ec4\u5408\u53ef\u4ee5\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u4eec\u5f80\u5f80\u53ea\u80fd\u51ed\u501f\u76f4\u89c9\u6216\u4e3e\u4f8b\u5b50\u6765\u7ed9\u51fa\u4e00\u4e2a\u6a21\u68f1\u4e24\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96be\u4ee5\u7ed9\u51fa\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\u3002

Quote

\u6709\u4e00\u7bc7\u8bba\u6587\u7ed9\u51fa\u4e86\u4e00\u4e2a \\(O(n^3)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u7b97\u6cd5\uff0c\u7528\u4e8e\u5224\u65ad\u4e00\u4e2a\u786c\u5e01\u7ec4\u5408\u80fd\u5426\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u989d\u7684\u6700\u4f18\u89e3\u3002

Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

"},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u89e3\u9898\u6b65\u9aa4","text":"

\u8d2a\u5fc3\u95ee\u9898\u7684\u89e3\u51b3\u6d41\u7a0b\u5927\u4f53\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e09\u6b65\u3002

  1. \u95ee\u9898\u5206\u6790\uff1a\u68b3\u7406\u4e0e\u7406\u89e3\u95ee\u9898\u7279\u6027\uff0c\u5305\u62ec\u72b6\u6001\u5b9a\u4e49\u3001\u4f18\u5316\u76ee\u6807\u548c\u7ea6\u675f\u6761\u4ef6\u7b49\u3002\u8fd9\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52a8\u6001\u89c4\u5212\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
  2. \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\uff1a\u786e\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8d2a\u5fc3\u9009\u62e9\u3002\u8fd9\u4e2a\u7b56\u7565\u80fd\u591f\u5728\u6bcf\u4e00\u6b65\u51cf\u5c0f\u95ee\u9898\u7684\u89c4\u6a21\uff0c\u5e76\u6700\u7ec8\u89e3\u51b3\u6574\u4e2a\u95ee\u9898\u3002
  3. \u6b63\u786e\u6027\u8bc1\u660e\uff1a\u901a\u5e38\u9700\u8981\u8bc1\u660e\u95ee\u9898\u5177\u6709\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8fd9\u4e2a\u6b65\u9aa4\u53ef\u80fd\u9700\u8981\u7528\u5230\u6570\u5b66\u8bc1\u660e\uff0c\u4f8b\u5982\u5f52\u7eb3\u6cd5\u6216\u53cd\u8bc1\u6cd5\u7b49\u3002

\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6c42\u89e3\u95ee\u9898\u7684\u6838\u5fc3\u6b65\u9aa4\uff0c\u4f46\u5b9e\u65bd\u8d77\u6765\u53ef\u80fd\u5e76\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e0d\u540c\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\u7684\u5dee\u5f02\u8f83\u5927\u3002\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\u6765\u8bf4\uff0c\u8d2a\u5fc3\u7b56\u7565\u6bd4\u8f83\u6d45\u663e\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u4e0e\u5c1d\u8bd5\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5bf9\u4e8e\u4e00\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u9690\u853d\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u975e\u5e38\u8003\u9a8c\u4e2a\u4eba\u7684\u89e3\u9898\u7ecf\u9a8c\u4e0e\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
  • \u67d0\u4e9b\u8d2a\u5fc3\u7b56\u7565\u5177\u6709\u8f83\u5f3a\u7684\u8ff7\u60d1\u6027\u3002\u5f53\u6211\u4eec\u6ee1\u6000\u4fe1\u5fc3\u8bbe\u8ba1\u597d\u8d2a\u5fc3\u7b56\u7565\uff0c\u5199\u51fa\u89e3\u9898\u4ee3\u7801\u5e76\u63d0\u4ea4\u8fd0\u884c\uff0c\u5f88\u53ef\u80fd\u53d1\u73b0\u90e8\u5206\u6d4b\u8bd5\u6837\u4f8b\u65e0\u6cd5\u901a\u8fc7\u3002\u8fd9\u662f\u56e0\u4e3a\u8bbe\u8ba1\u7684\u8d2a\u5fc3\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u786e\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7ecd\u7684\u96f6\u94b1\u5151\u6362\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u6848\u4f8b\u3002

\u4e3a\u4e86\u4fdd\u8bc1\u6b63\u786e\u6027\uff0c\u6211\u4eec\u5e94\u8be5\u5bf9\u8d2a\u5fc3\u7b56\u7565\u8fdb\u884c\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8bc1\u6cd5\u6216\u6570\u5b66\u5f52\u7eb3\u6cd5\u3002

\u7136\u800c\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6ca1\u6709\u5934\u7eea\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u9762\u5411\u6d4b\u8bd5\u7528\u4f8b\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u4e0e\u9a8c\u8bc1\u8d2a\u5fc3\u7b56\u7565\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u5178\u578b\u4f8b\u9898","text":"

\u8d2a\u5fc3\u7b97\u6cd5\u5e38\u5e38\u5e94\u7528\u5728\u6ee1\u8db3\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u4f18\u5316\u95ee\u9898\u4e2d\uff0c\u4ee5\u4e0b\u5217\u4e3e\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8d2a\u5fc3\u7b97\u6cd5\u95ee\u9898\u3002

  • \u786c\u5e01\u627e\u96f6\u95ee\u9898\uff1a\u5728\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u603b\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u533a\u95f4\u8c03\u5ea6\u95ee\u9898\uff1a\u5047\u8bbe\u4f60\u6709\u4e00\u4e9b\u4efb\u52a1\uff0c\u6bcf\u4e2a\u4efb\u52a1\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u8fdb\u884c\uff0c\u4f60\u7684\u76ee\u6807\u662f\u5b8c\u6210\u5c3d\u53ef\u80fd\u591a\u7684\u4efb\u52a1\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u7ed3\u675f\u65f6\u95f4\u6700\u65e9\u7684\u4efb\u52a1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u5206\u6570\u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u8f7d\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6807\u662f\u9009\u62e9\u4e00\u7ec4\u7269\u54c1\uff0c\u4f7f\u5f97\u603b\u91cd\u91cf\u4e0d\u8d85\u8fc7\u8f7d\u91cd\u91cf\uff0c\u4e14\u603b\u4ef7\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u6027\u4ef7\u6bd4\u6700\u9ad8\uff08\u4ef7\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u80a1\u7968\u4e70\u5356\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u80a1\u7968\u7684\u5386\u53f2\u4ef7\u683c\uff0c\u4f60\u53ef\u4ee5\u8fdb\u884c\u591a\u6b21\u4e70\u5356\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7ecf\u6301\u6709\u80a1\u7968\uff0c\u90a3\u4e48\u5728\u5356\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u4e70\uff0c\u76ee\u6807\u662f\u83b7\u53d6\u6700\u5927\u5229\u6da6\u3002
  • \u970d\u592b\u66fc\u7f16\u7801\uff1a\u970d\u592b\u66fc\u7f16\u7801\u662f\u4e00\u79cd\u7528\u4e8e\u65e0\u635f\u6570\u636e\u538b\u7f29\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002\u901a\u8fc7\u6784\u5efa\u970d\u592b\u66fc\u6811\uff0c\u6bcf\u6b21\u9009\u62e9\u51fa\u73b0\u9891\u7387\u6700\u4f4e\u7684\u4e24\u4e2a\u8282\u70b9\u5408\u5e76\uff0c\u6700\u540e\u5f97\u5230\u7684\u970d\u592b\u66fc\u6811\u7684\u5e26\u6743\u8def\u5f84\u957f\u5ea6\uff08\u7f16\u7801\u957f\u5ea6\uff09\u6700\u5c0f\u3002
  • Dijkstra \u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u79cd\u89e3\u51b3\u7ed9\u5b9a\u6e90\u9876\u70b9\u5230\u5176\u4f59\u5404\u9876\u70b9\u7684\u6700\u77ed\u8def\u5f84\u95ee\u9898\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002
"},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6570\u7ec4 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u4ee3\u8868\u4e00\u4e2a\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4e4b\u95f4\u7684\u7a7a\u95f4\u53ef\u4ee5\u7ec4\u6210\u4e00\u4e2a\u5bb9\u5668\u3002

\u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u7684\u4e58\u79ef\uff08\u9762\u79ef\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f83\u77ed\u7684\u9694\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u4e2a\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002

\u8bf7\u5728\u6570\u7ec4\u4e2d\u9009\u62e9\u4e24\u4e2a\u9694\u677f\uff0c\u4f7f\u5f97\u7ec4\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u56fe 15-7 \u6240\u793a\u3002

\u56fe 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

\u5bb9\u5668\u7531\u4efb\u610f\u4e24\u4e2a\u9694\u677f\u56f4\u6210\uff0c\u56e0\u6b64\u672c\u9898\u7684\u72b6\u6001\u4e3a\u4e24\u4e2a\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u6839\u636e\u9898\u610f\uff0c\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u4e58\u4ee5\u5bbd\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002\u8bbe\u5bb9\u91cf\u4e3a \\(cap[i, j]\\) \uff0c\u5219\u53ef\u5f97\u8ba1\u7b97\u516c\u5f0f\uff1a

\\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

\u8bbe\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u4e24\u4e2a\u9694\u677f\u7684\u7ec4\u5408\u6570\u91cf\uff08\u72b6\u6001\u603b\u6570\uff09\u4e3a \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u4e2a\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u7a77\u4e3e\u6240\u6709\u72b6\u6001\uff0c\u4ece\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u8fd9\u9053\u9898\u8fd8\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u56fe 15-8 \u6240\u793a\uff0c\u73b0\u9009\u53d6\u4e00\u4e2a\u72b6\u6001 \\([i, j]\\) \uff0c\u5176\u6ee1\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002

\u56fe 15-8 \u00a0 \u521d\u59cb\u72b6\u6001

\u5982\u56fe 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u65f6\u5c06\u957f\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5219\u5bb9\u91cf\u4e00\u5b9a\u53d8\u5c0f\u3002

\u8fd9\u662f\u56e0\u4e3a\u5728\u79fb\u52a8\u957f\u677f \\(j\\) \u540e\uff0c\u5bbd\u5ea6 \\(j-i\\) \u80af\u5b9a\u53d8\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u53d8\uff08 \\(i\\) \u4ecd\u4e3a\u77ed\u677f\uff09\u6216\u53d8\u5c0f\uff08\u79fb\u52a8\u540e\u7684 \\(j\\) \u6210\u4e3a\u77ed\u677f\uff09\u3002

\u56fe 15-9 \u00a0 \u5411\u5185\u79fb\u52a8\u957f\u677f\u540e\u7684\u72b6\u6001

\u53cd\u5411\u601d\u8003\uff0c\u6211\u4eec\u53ea\u6709\u5411\u5185\u6536\u7f29\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u53d8\u5927\u3002\u56e0\u4e3a\u867d\u7136\u5bbd\u5ea6\u4e00\u5b9a\u53d8\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u4f1a\u53d8\u5927\uff08\u79fb\u52a8\u540e\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u4f1a\u53d8\u957f\uff09\u3002\u4f8b\u5982\u5728\u56fe 15-10 \u4e2d\uff0c\u79fb\u52a8\u77ed\u677f\u540e\u9762\u79ef\u53d8\u5927\u3002

\u56fe 15-10 \u00a0 \u5411\u5185\u79fb\u52a8\u77ed\u677f\u540e\u7684\u72b6\u6001

\u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\uff1a\u521d\u59cb\u5316\u4e24\u6307\u9488\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u4e24\u7aef\uff0c\u6bcf\u8f6e\u5411\u5185\u6536\u7f29\u77ed\u677f\u5bf9\u5e94\u7684\u6307\u9488\uff0c\u76f4\u81f3\u4e24\u6307\u9488\u76f8\u9047\u3002

\u56fe 15-11 \u5c55\u793a\u4e86\u8d2a\u5fc3\u7b56\u7565\u7684\u6267\u884c\u8fc7\u7a0b\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u5217\u6570\u7ec4\u4e24\u7aef\u3002
  2. \u8ba1\u7b97\u5f53\u524d\u72b6\u6001\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u5e76\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
  3. \u6bd4\u8f83\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u5e76\u5c06\u77ed\u677f\u5411\u5185\u79fb\u52a8\u4e00\u683c\u3002
  4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u65f6\u7ed3\u675f\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u8d2a\u5fc3\u8fc7\u7a0b

"},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4ee3\u7801\u5faa\u73af\u6700\u591a \\(n\\) \u8f6e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u53d8\u91cf \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res = 0\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
max_capacity.cpp
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.java
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.cs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.go
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res := 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.swift
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
max_capacity.js
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.ts
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.dart
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  int res = 0;\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
max_capacity.rs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let mut res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
max_capacity.c
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.kt
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.rb
[class]{}-[func]{max_capacity}\n
max_capacity.zig
[class]{}-[func]{maxCapacity}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u4e4b\u6240\u4ee5\u8d2a\u5fc3\u6bd4\u7a77\u4e3e\u66f4\u5feb\uff0c\u662f\u56e0\u4e3a\u6bcf\u8f6e\u7684\u8d2a\u5fc3\u9009\u62e9\u90fd\u4f1a\u201c\u8df3\u8fc7\u201d\u4e00\u4e9b\u72b6\u6001\u3002

\u6bd4\u5982\u5728\u72b6\u6001 \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002\u82e5\u8d2a\u5fc3\u5730\u5c06\u77ed\u677f \\(i\\) \u5411\u5185\u79fb\u52a8\u4e00\u683c\uff0c\u4f1a\u5bfc\u81f4\u56fe 15-12 \u6240\u793a\u7684\u72b6\u6001\u88ab\u201c\u8df3\u8fc7\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e4b\u540e\u65e0\u6cd5\u9a8c\u8bc1\u8fd9\u4e9b\u72b6\u6001\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

\\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

\u56fe 15-12 \u00a0 \u79fb\u52a8\u77ed\u677f\u5bfc\u81f4\u88ab\u8df3\u8fc7\u7684\u72b6\u6001

\u89c2\u5bdf\u53d1\u73b0\uff0c\u8fd9\u4e9b\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u957f\u677f \\(j\\) \u5411\u5185\u79fb\u52a8\u7684\u6240\u6709\u72b6\u6001\u3002\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u8bc1\u660e\u5185\u79fb\u957f\u677f\u4e00\u5b9a\u4f1a\u5bfc\u81f4\u5bb9\u91cf\u53d8\u5c0f\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u4f18\u89e3\uff0c\u8df3\u8fc7\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4\u9519\u8fc7\u6700\u4f18\u89e3\u3002

\u4ee5\u4e0a\u5206\u6790\u8bf4\u660e\uff0c\u79fb\u52a8\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5c06\u5176\u5207\u5206\u4e3a\u81f3\u5c11\u4e24\u4e2a\u6b63\u6574\u6570\u7684\u548c\uff0c\u6c42\u5207\u5206\u540e\u6240\u6709\u6574\u6570\u7684\u4e58\u79ef\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u56fe 15-13 \u6240\u793a\u3002

\u56fe 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u95ee\u9898\u5b9a\u4e49

\u5047\u8bbe\u6211\u4eec\u5c06 \\(n\\) \u5207\u5206\u4e3a \\(m\\) \u4e2a\u6574\u6570\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u4e2a\u56e0\u5b50\u8bb0\u4e3a \\(n_i\\) \uff0c\u5373

\\[ n = \\sum_{i=1}^{m}n_i \\]

\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u5f97\u6240\u6709\u6574\u6570\u56e0\u5b50\u7684\u6700\u5927\u4e58\u79ef\uff0c\u5373

\\[ \\max(\\prod_{i=1}^{m}n_i) \\]

\u6211\u4eec\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6570\u91cf \\(m\\) \u5e94\u8be5\u591a\u5927\uff0c\u6bcf\u4e2a \\(n_i\\) \u5e94\u8be5\u662f\u591a\u5c11\uff1f

"},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u6839\u636e\u7ecf\u9a8c\uff0c\u4e24\u4e2a\u6574\u6570\u7684\u4e58\u79ef\u5f80\u5f80\u6bd4\u5b83\u4eec\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8bbe\u4ece \\(n\\) \u4e2d\u5206\u51fa\u4e00\u4e2a\u56e0\u5b50 \\(2\\) \uff0c\u5219\u5b83\u4eec\u7684\u4e58\u79ef\u4e3a \\(2(n-2)\\) \u3002\u6211\u4eec\u5c06\u8be5\u4e58\u79ef\u4e0e \\(n\\) \u4f5c\u6bd4\u8f83\uff1a

\\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

\u5982\u56fe 15-14 \u6240\u793a\uff0c\u5f53 \\(n \\geq 4\\) \u65f6\uff0c\u5207\u5206\u51fa\u4e00\u4e2a \\(2\\) \u540e\u4e58\u79ef\u4f1a\u53d8\u5927\uff0c\u8fd9\u8bf4\u660e\u5927\u4e8e\u7b49\u4e8e \\(4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u88ab\u5207\u5206\u3002

\u8d2a\u5fc3\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u4e48\u5b83\u5c31\u5e94\u8be5\u88ab\u7ee7\u7eed\u5207\u5206\u3002\u6700\u7ec8\u7684\u5207\u5206\u65b9\u6848\u53ea\u5e94\u51fa\u73b0 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u79cd\u56e0\u5b50\u3002

\u56fe 15-14 \u00a0 \u5207\u5206\u5bfc\u81f4\u4e58\u79ef\u53d8\u5927

\u63a5\u4e0b\u6765\u601d\u8003\u54ea\u4e2a\u56e0\u5b50\u662f\u6700\u4f18\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u4e2a\u56e0\u5b50\u4e2d\uff0c\u663e\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u4e3a \\(1 \\times (n-1) < n\\) \u6052\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u4f1a\u5bfc\u81f4\u4e58\u79ef\u51cf\u5c0f\u3002

\u5982\u56fe 15-15 \u6240\u793a\uff0c\u5f53 \\(n = 6\\) \u65f6\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u8fd9\u610f\u5473\u7740\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u4f18\u3002

\u8d2a\u5fc3\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u53ea\u5e94\u5b58\u5728\u4e24\u4e2a \\(2\\) \u3002\u56e0\u4e3a\u4e09\u4e2a \\(2\\) \u603b\u662f\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002

\u56fe 15-15 \u00a0 \u6700\u4f18\u5207\u5206\u56e0\u5b50

\u7efc\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8d2a\u5fc3\u7b56\u7565\u3002

  1. \u8f93\u5165\u6574\u6570 \\(n\\) \uff0c\u4ece\u5176\u4e0d\u65ad\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u4f59\u6570\u4e3a \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
  2. \u5f53\u4f59\u6570\u4e3a \\(0\\) \u65f6\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6570\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u5904\u7406\u3002
  3. \u5f53\u4f59\u6570\u4e3a \\(2\\) \u65f6\uff0c\u4e0d\u7ee7\u7eed\u5212\u5206\uff0c\u4fdd\u7559\u3002
  4. \u5f53\u4f59\u6570\u4e3a \\(1\\) \u65f6\uff0c\u7531\u4e8e \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u5e94\u5c06\u6700\u540e\u4e00\u4e2a \\(3\\) \u66ff\u6362\u4e3a \\(2\\) \u3002
"},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5982\u56fe 15-16 \u6240\u793a\uff0c\u6211\u4eec\u65e0\u987b\u901a\u8fc7\u5faa\u73af\u6765\u5207\u5206\u6574\u6570\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u8fd0\u7b97\u5f97\u5230 \\(3\\) \u7684\u4e2a\u6570 \\(a\\) \uff0c\u7528\u53d6\u6a21\u8fd0\u7b97\u5f97\u5230\u4f59\u6570 \\(b\\) \uff0c\u6b64\u65f6\u6709\uff1a

\\[ n = 3 a + b \\]

\u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e \\(n \\leq 3\\) \u7684\u8fb9\u754c\u60c5\u51b5\uff0c\u5fc5\u987b\u62c6\u5206\u51fa\u4e00\u4e2a \\(1\\) \uff0c\u4e58\u79ef\u4e3a \\(1 \\times (n - 1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.pow(3, a)) * 2\n    # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.pow(3, a))\n
max_product_cutting.cpp
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)pow(3, a);\n}\n
max_product_cutting.java
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int) Math.pow(3, a);\n}\n
max_product_cutting.cs
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint MaxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)Math.Pow(3, a);\n}\n
max_product_cutting.go
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n int) int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
max_product_cutting.swift
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a)\n}\n
max_product_cutting.js
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.ts
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n: number): number {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.dart
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n  // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return pow(3, a).toInt();\n}\n
max_product_cutting.rs
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
max_product_cutting.c
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a);\n}\n
max_product_cutting.kt
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfun maxProductCutting(n: Int): Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return 3.0.pow(a).toInt()\n}\n
max_product_cutting.rb
[class]{}-[func]{max_product_cutting}\n
max_product_cutting.zig
[class]{}-[func]{maxProductCutting}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u8ba1\u7b97\u65b9\u6cd5

\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u5e42\u8fd0\u7b97\u7684\u5b9e\u73b0\u65b9\u6cd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5e38\u7528\u7684\u5e42\u8ba1\u7b97\u51fd\u6570\u6709\u4e09\u79cd\u3002

  • \u8fd0\u7b97\u7b26 ** \u548c\u51fd\u6570 pow() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log\u2061 a)\\) \u3002
  • \u51fd\u6570 math.pow() \u5185\u90e8\u8c03\u7528 C \u8bed\u8a00\u5e93\u7684 pow() \u51fd\u6570\uff0c\u5176\u6267\u884c\u6d6e\u70b9\u53d6\u5e42\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

\u53d8\u91cf \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u4f7f\u7528\u53cd\u8bc1\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u51b5\u3002

  1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u5c06\u5176\u7ee7\u7eed\u5212\u5206\u4e3a \\(2(x-2)\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
  2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u4e2a\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u4e48\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u5e76\u5165\u53e6\u5916\u4e00\u4e2a\u56e0\u5b50\u4e2d\uff0c\u4ee5\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
  3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u4e24\u4e2a \\(2\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u4e2a \\(2\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4e58\u79ef\u66f4\u5927\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
"},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7ed3","text":"
  • \u8d2a\u5fc3\u7b97\u6cd5\u901a\u5e38\u7528\u4e8e\u89e3\u51b3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\u90fd\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4f1a\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u4e2a\u53c8\u4e00\u4e2a\u7684\u8d2a\u5fc3\u9009\u62e9\uff0c\u6bcf\u8f6e\u90fd\u5c06\u95ee\u9898\u8f6c\u5316\u6210\u4e00\u4e2a\u89c4\u6a21\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u95ee\u9898\u88ab\u89e3\u51b3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u5b9e\u73b0\u7b80\u5355\uff0c\u8fd8\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u9898\u6548\u7387\u3002\u76f8\u6bd4\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
  • \u5728\u96f6\u94b1\u5151\u6362\u95ee\u9898\u4e2d\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1b\u5bf9\u4e8e\u53e6\u5916\u4e00\u4e9b\u786c\u5e01\u7ec4\u5408\u5219\u4e0d\u7136\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
  • \u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u7684\u95ee\u9898\u5177\u6709\u4e24\u5927\u6027\u8d28\uff1a\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u4ee3\u8868\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
  • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u8bc1\u660e\u5e76\u4e0d\u7b80\u5355\u3002\u76f8\u5bf9\u6765\u8bf4\uff0c\u8bc1\u4f2a\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002
  • \u6c42\u89e3\u8d2a\u5fc3\u95ee\u9898\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\uff1a\u95ee\u9898\u5206\u6790\u3001\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u3001\u6b63\u786e\u6027\u8bc1\u660e\u3002\u5176\u4e2d\uff0c\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9aa4\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u5f80\u5f80\u662f\u96be\u70b9\u3002
  • \u5206\u6570\u80cc\u5305\u95ee\u9898\u5728 0-1 \u80cc\u5305\u7684\u57fa\u7840\u4e0a\uff0c\u5141\u8bb8\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u3002\u8d2a\u5fc3\u7b56\u7565\u7684\u6b63\u786e\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\u3002
  • \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u53ef\u4f7f\u7528\u7a77\u4e3e\u6cd5\u6c42\u89e3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u901a\u8fc7\u8bbe\u8ba1\u8d2a\u5fc3\u7b56\u7565\uff0c\u6bcf\u8f6e\u5411\u5185\u79fb\u52a8\u77ed\u677f\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \u3002
  • \u5728\u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u63a8\u7406\u51fa\u4e24\u4e2a\u8d2a\u5fc3\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u7ee7\u7eed\u5207\u5206\uff0c\u6700\u4f18\u5207\u5206\u56e0\u5b50\u4e3a \\(3\\) \u3002\u4ee3\u7801\u4e2d\u5305\u542b\u5e42\u8fd0\u7b97\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5e42\u8fd0\u7b97\u5b9e\u73b0\u65b9\u6cd5\uff0c\u901a\u5e38\u4e3a \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
"},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u54c8\u5e0c\u8868","text":"

Abstract

\u5728\u8ba1\u7b97\u673a\u4e16\u754c\u4e2d\uff0c\u54c8\u5e0c\u8868\u5982\u540c\u4e00\u4f4d\u806a\u6167\u7684\u56fe\u4e66\u7ba1\u7406\u5458\u3002

\u4ed6\u77e5\u9053\u5982\u4f55\u8ba1\u7b97\u7d22\u4e66\u53f7\uff0c\u4ece\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6807\u56fe\u4e66\u3002

"},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 6.1 \u00a0 \u54c8\u5e0c\u8868
  • 6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81
  • 6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5
  • 6.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5","text":"

\u524d\u4e24\u8282\u4ecb\u7ecd\u4e86\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u54c8\u5e0c\u51b2\u7a81\u7684\u5904\u7406\u65b9\u6cd5\u3002\u7136\u800c\u65e0\u8bba\u662f\u5f00\u653e\u5bfb\u5740\u8fd8\u662f\u94fe\u5f0f\u5730\u5740\uff0c\u5b83\u4eec\u53ea\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u53d1\u751f\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u65e0\u6cd5\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u3002

\u5982\u679c\u54c8\u5e0c\u51b2\u7a81\u8fc7\u4e8e\u9891\u7e41\uff0c\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u5219\u4f1a\u6025\u5267\u52a3\u5316\u3002\u5982\u56fe 6-8 \u6240\u793a\uff0c\u5bf9\u4e8e\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\uff0c\u7406\u60f3\u60c5\u51b5\u4e0b\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u5404\u4e2a\u6876\u4e2d\uff0c\u8fbe\u5230\u6700\u4f73\u67e5\u8be2\u6548\u7387\uff1b\u6700\u5dee\u60c5\u51b5\u4e0b\u6240\u6709\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u56fe 6-8 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u7684\u6700\u4f73\u60c5\u51b5\u4e0e\u6700\u5dee\u60c5\u51b5

\u952e\u503c\u5bf9\u7684\u5206\u5e03\u60c5\u51b5\u7531\u54c8\u5e0c\u51fd\u6570\u51b3\u5b9a\u3002\u56de\u5fc6\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u6b65\u9aa4\uff0c\u5148\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u518d\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\uff1a

index = hash(key) % capacity\n

\u89c2\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u65f6\uff0c\u54c8\u5e0c\u7b97\u6cd5 hash() \u51b3\u5b9a\u4e86\u8f93\u51fa\u503c\uff0c\u8fdb\u800c\u51b3\u5b9a\u4e86\u952e\u503c\u5bf9\u5728\u54c8\u5e0c\u8868\u4e2d\u7684\u5206\u5e03\u60c5\u51b5\u3002

\u8fd9\u610f\u5473\u7740\uff0c\u4e3a\u4e86\u964d\u4f4e\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u6982\u7387\uff0c\u6211\u4eec\u5e94\u5f53\u5c06\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u54c8\u5e0c\u7b97\u6cd5 hash() \u7684\u8bbe\u8ba1\u4e0a\u3002

"},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u76ee\u6807","text":"

\u4e3a\u4e86\u5b9e\u73b0\u201c\u65e2\u5feb\u53c8\u7a33\u201d\u7684\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u70b9\u3002

  • \u786e\u5b9a\u6027\uff1a\u5bf9\u4e8e\u76f8\u540c\u7684\u8f93\u5165\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u7684\u8f93\u51fa\u3002\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u54c8\u5e0c\u8868\u662f\u53ef\u9760\u7684\u3002
  • \u6548\u7387\u9ad8\uff1a\u8ba1\u7b97\u54c8\u5e0c\u503c\u7684\u8fc7\u7a0b\u5e94\u8be5\u8db3\u591f\u5feb\u3002\u8ba1\u7b97\u5f00\u9500\u8d8a\u5c0f\uff0c\u54c8\u5e0c\u8868\u7684\u5b9e\u7528\u6027\u8d8a\u9ad8\u3002
  • \u5747\u5300\u5206\u5e03\uff1a\u54c8\u5e0c\u7b97\u6cd5\u5e94\u4f7f\u5f97\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u54c8\u5e0c\u8868\u4e2d\u3002\u5206\u5e03\u8d8a\u5747\u5300\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002

\u5b9e\u9645\u4e0a\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u54c8\u5e0c\u8868\uff0c\u8fd8\u5e7f\u6cdb\u5e94\u7528\u4e8e\u5176\u4ed6\u9886\u57df\u4e2d\u3002

  • \u5bc6\u7801\u5b58\u50a8\uff1a\u4e3a\u4e86\u4fdd\u62a4\u7528\u6237\u5bc6\u7801\u7684\u5b89\u5168\uff0c\u7cfb\u7edf\u901a\u5e38\u4e0d\u4f1a\u76f4\u63a5\u5b58\u50a8\u7528\u6237\u7684\u660e\u6587\u5bc6\u7801\uff0c\u800c\u662f\u5b58\u50a8\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\u3002\u5f53\u7528\u6237\u8f93\u5165\u5bc6\u7801\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5bf9\u8f93\u5165\u7684\u5bc6\u7801\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u7136\u540e\u4e0e\u5b58\u50a8\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u5bc6\u7801\u5c31\u88ab\u89c6\u4e3a\u6b63\u786e\u3002
  • \u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5\uff1a\u6570\u636e\u53d1\u9001\u65b9\u53ef\u4ee5\u8ba1\u7b97\u6570\u636e\u7684\u54c8\u5e0c\u503c\u5e76\u5c06\u5176\u4e00\u540c\u53d1\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8ba1\u7b97\u63a5\u6536\u5230\u7684\u6570\u636e\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u4e0e\u63a5\u6536\u5230\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u6570\u636e\u5c31\u88ab\u89c6\u4e3a\u5b8c\u6574\u3002

\u5bf9\u4e8e\u5bc6\u7801\u5b66\u7684\u76f8\u5173\u5e94\u7528\uff0c\u4e3a\u4e86\u9632\u6b62\u4ece\u54c8\u5e0c\u503c\u63a8\u5bfc\u51fa\u539f\u59cb\u5bc6\u7801\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9700\u8981\u5177\u5907\u66f4\u9ad8\u7b49\u7ea7\u7684\u5b89\u5168\u7279\u6027\u3002

  • \u5355\u5411\u6027\uff1a\u65e0\u6cd5\u901a\u8fc7\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u5173\u4e8e\u8f93\u5165\u6570\u636e\u7684\u4efb\u4f55\u4fe1\u606f\u3002
  • \u6297\u78b0\u649e\u6027\uff1a\u5e94\u5f53\u6781\u96be\u627e\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\uff0c\u4f7f\u5f97\u5b83\u4eec\u7684\u54c8\u5e0c\u503c\u76f8\u540c\u3002
  • \u96ea\u5d29\u6548\u5e94\uff1a\u8f93\u5165\u7684\u5fae\u5c0f\u53d8\u5316\u5e94\u5f53\u5bfc\u81f4\u8f93\u51fa\u7684\u663e\u8457\u4e14\u4e0d\u53ef\u9884\u6d4b\u7684\u53d8\u5316\u3002

\u8bf7\u6ce8\u610f\uff0c\u201c\u5747\u5300\u5206\u5e03\u201d\u4e0e\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u6982\u5ff5\uff0c\u6ee1\u8db3\u5747\u5300\u5206\u5e03\u4e0d\u4e00\u5b9a\u6ee1\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u968f\u673a\u8f93\u5165 key \u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 key % 100 \u53ef\u4ee5\u4ea7\u751f\u5747\u5300\u5206\u5e03\u7684\u8f93\u51fa\u3002\u7136\u800c\u8be5\u54c8\u5e0c\u7b97\u6cd5\u8fc7\u4e8e\u7b80\u5355\uff0c\u6240\u6709\u540e\u4e24\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f93\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u4ece\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u4ece\u800c\u7834\u89e3\u5bc6\u7801\u3002

"},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1","text":"

\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u662f\u4e00\u4e2a\u9700\u8981\u8003\u8651\u8bb8\u591a\u56e0\u7d20\u7684\u590d\u6742\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f\uff0c\u6211\u4eec\u4e5f\u80fd\u8bbe\u8ba1\u4e00\u4e9b\u7b80\u5355\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

  • \u52a0\u6cd5\u54c8\u5e0c\uff1a\u5bf9\u8f93\u5165\u7684\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u8fdb\u884c\u76f8\u52a0\uff0c\u5c06\u5f97\u5230\u7684\u603b\u548c\u4f5c\u4e3a\u54c8\u5e0c\u503c\u3002
  • \u4e58\u6cd5\u54c8\u5e0c\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u5173\u6027\uff0c\u6bcf\u8f6e\u4e58\u4ee5\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5404\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u54c8\u5e0c\u503c\u4e2d\u3002
  • \u5f02\u6216\u54c8\u5e0c\uff1a\u5c06\u8f93\u5165\u6570\u636e\u7684\u6bcf\u4e2a\u5143\u7d20\u901a\u8fc7\u5f02\u6216\u64cd\u4f5c\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\u3002
  • \u65cb\u8f6c\u54c8\u5e0c\uff1a\u5c06\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u79ef\u4e4b\u524d\u90fd\u4f1a\u5bf9\u54c8\u5e0c\u503c\u8fdb\u884c\u65cb\u8f6c\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u53d1\u73b0\uff0c\u6bcf\u79cd\u54c8\u5e0c\u7b97\u6cd5\u7684\u6700\u540e\u4e00\u6b65\u90fd\u662f\u5bf9\u5927\u8d28\u6570 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u786e\u4fdd\u54c8\u5e0c\u503c\u5728\u5408\u9002\u7684\u8303\u56f4\u5185\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u4e3a\u4ec0\u4e48\u8981\u5f3a\u8c03\u5bf9\u8d28\u6570\u53d6\u6a21\uff0c\u6216\u8005\u8bf4\u5bf9\u5408\u6570\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u4e48\uff1f\u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u95ee\u9898\u3002

\u5148\u629b\u51fa\u7ed3\u8bba\uff1a\u4f7f\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u7684\u5747\u5300\u5206\u5e03\u3002\u56e0\u4e3a\u8d28\u6570\u4e0d\u4e0e\u5176\u4ed6\u6570\u5b57\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u53ef\u4ee5\u51cf\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u4ea7\u751f\u7684\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u4ece\u800c\u907f\u514d\u54c8\u5e0c\u51b2\u7a81\u3002

\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u5408\u6570 \\(9\\) \u4f5c\u4e3a\u6a21\u6570\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u4e48\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u8fd9\u4e09\u4e2a\u54c8\u5e0c\u503c\u3002

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

\u5982\u679c\u8f93\u5165 key \u6070\u597d\u6ee1\u8db3\u8fd9\u79cd\u7b49\u5dee\u6570\u5217\u7684\u6570\u636e\u5206\u5e03\uff0c\u90a3\u4e48\u54c8\u5e0c\u503c\u5c31\u4f1a\u51fa\u73b0\u805a\u5806\uff0c\u4ece\u800c\u52a0\u91cd\u54c8\u5e0c\u51b2\u7a81\u3002\u73b0\u5728\uff0c\u5047\u8bbe\u5c06 modulus \u66ff\u6362\u4e3a\u8d28\u6570 \\(13\\) \uff0c\u7531\u4e8e key \u548c modulus \u4e4b\u95f4\u4e0d\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u56e0\u6b64\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u7684\u5747\u5300\u6027\u4f1a\u660e\u663e\u63d0\u5347\u3002

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u591f\u4fdd\u8bc1 key \u662f\u968f\u673a\u5747\u5300\u5206\u5e03\u7684\uff0c\u90a3\u4e48\u9009\u62e9\u8d28\u6570\u6216\u8005\u5408\u6570\u4f5c\u4e3a\u6a21\u6570\u90fd\u53ef\u4ee5\uff0c\u5b83\u4eec\u90fd\u80fd\u8f93\u51fa\u5747\u5300\u5206\u5e03\u7684\u54c8\u5e0c\u503c\u3002\u800c\u5f53 key \u7684\u5206\u5e03\u5b58\u5728\u67d0\u79cd\u5468\u671f\u6027\u65f6\uff0c\u5bf9\u5408\u6570\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73b0\u805a\u96c6\u73b0\u8c61\u3002

\u603b\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u901a\u5e38\u9009\u53d6\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u5e76\u4e14\u8fd9\u4e2a\u8d28\u6570\u6700\u597d\u8db3\u591f\u5927\uff0c\u4ee5\u5c3d\u53ef\u80fd\u6d88\u9664\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002

"},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u89c1\u54c8\u5e0c\u7b97\u6cd5","text":"

\u4e0d\u96be\u53d1\u73b0\uff0c\u4ee5\u4e0a\u4ecb\u7ecd\u7684\u7b80\u5355\u54c8\u5e0c\u7b97\u6cd5\u90fd\u6bd4\u8f83\u201c\u8106\u5f31\u201d\uff0c\u8fdc\u8fdc\u6ca1\u6709\u8fbe\u5230\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u76ee\u6807\u3002\u4f8b\u5982\uff0c\u7531\u4e8e\u52a0\u6cd5\u548c\u5f02\u6216\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u54c8\u5e0c\u548c\u5f02\u6216\u54c8\u5e0c\u65e0\u6cd5\u533a\u5206\u5185\u5bb9\u76f8\u540c\u4f46\u987a\u5e8f\u4e0d\u540c\u7684\u5b57\u7b26\u4e32\uff0c\u8fd9\u53ef\u80fd\u4f1a\u52a0\u5267\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e76\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u95ee\u9898\u3002

\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u7528\u4e00\u4e9b\u6807\u51c6\u54c8\u5e0c\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u4eec\u53ef\u4ee5\u5c06\u4efb\u610f\u957f\u5ea6\u7684\u8f93\u5165\u6570\u636e\u6620\u5c04\u5230\u6052\u5b9a\u957f\u5ea6\u7684\u54c8\u5e0c\u503c\u3002

\u8fd1\u4e00\u4e2a\u4e16\u7eaa\u4ee5\u6765\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5904\u5728\u4e0d\u65ad\u5347\u7ea7\u4e0e\u4f18\u5316\u7684\u8fc7\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u52aa\u529b\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u6027\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u548c\u9ed1\u5ba2\u5219\u81f4\u529b\u4e8e\u5bfb\u627e\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u95ee\u9898\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

  • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u51fb\uff0c\u56e0\u6b64\u5b83\u4eec\u88ab\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u5f03\u7528\u3002
  • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u54c8\u5e0c\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73b0\u6210\u529f\u7684\u653b\u51fb\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u4e2d\u3002
  • SHA-3 \u76f8\u8f83 SHA-2 \u7684\u5b9e\u73b0\u5f00\u9500\u66f4\u4f4e\u3001\u8ba1\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u76d6\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

\u8868 6-2 \u00a0 \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5

MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u65f6\u95f4 1992 1995 2002 2008 \u8f93\u51fa\u957f\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u54c8\u5e0c\u51b2\u7a81 \u8f83\u591a \u8f83\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7ea7 \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u9ad8 \u9ad8 \u5e94\u7528 \u5df2\u88ab\u5f03\u7528\uff0c\u4ecd\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5 \u5df2\u88ab\u5f03\u7528 \u52a0\u5bc6\u8d27\u5e01\u4ea4\u6613\u9a8c\u8bc1\u3001\u6570\u5b57\u7b7e\u540d\u7b49 \u53ef\u7528\u4e8e\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u54c8\u5e0c\u503c","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u54c8\u5e0c\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6570\u3001\u5c0f\u6570\u6216\u5b57\u7b26\u4e32\u7b49\u6570\u636e\u7c7b\u578b\u3002\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u8fd9\u4e9b\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u7528 hash() \u51fd\u6570\u6765\u8ba1\u7b97\u5404\u79cd\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u3002

  • \u6574\u6570\u548c\u5e03\u5c14\u91cf\u7684\u54c8\u5e0c\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
  • \u6d6e\u70b9\u6570\u548c\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u8f83\u4e3a\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8bf7\u81ea\u884c\u5b66\u4e60\u3002
  • \u5143\u7ec4\u7684\u54c8\u5e0c\u503c\u662f\u5bf9\u5176\u4e2d\u6bcf\u4e00\u4e2a\u5143\u7d20\u8fdb\u884c\u54c8\u5e0c\uff0c\u7136\u540e\u5c06\u8fd9\u4e9b\u54c8\u5e0c\u503c\u7ec4\u5408\u8d77\u6765\uff0c\u5f97\u5230\u5355\u4e00\u7684\u54c8\u5e0c\u503c\u3002
  • \u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u57fa\u4e8e\u5176\u5185\u5b58\u5730\u5740\u751f\u6210\u3002\u901a\u8fc7\u91cd\u5199\u5bf9\u8c61\u7684\u54c8\u5e0c\u65b9\u6cd5\uff0c\u53ef\u5b9e\u73b0\u57fa\u4e8e\u5185\u5bb9\u751f\u6210\u54c8\u5e0c\u503c\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u54c8\u5e0c\u503c\u8ba1\u7b97\u51fd\u6570\u7684\u5b9a\u4e49\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u5c14\u91cf True \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u8282\u70b9\u5bf9\u8c61 <ListNode object at 0x1058fd810> \u7684\u54c8\u5e0c\u503c\u4e3a 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u5c14\u91cf 1 \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5185\u7f6e std:hash() \u4ec5\u63d0\u4f9b\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\n// \u6570\u7ec4\u3001\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u9700\u8981\u81ea\u884c\u5b9e\u73b0\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@7dc5e7b4 \u7684\u54c8\u5e0c\u503c\u4e3a 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u8282\u70b9\u5bf9\u8c61 0 \u7684\u54c8\u5e0c\u503c\u4e3a 39053774;\n
built_in_hash.go
// Go \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u6570\u7ec4 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u54c8\u5e0c\u503c\u4e3a -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode \u7684\u54c8\u5e0c\u503c\u4e3a -2434780518035996159\n
built_in_hash.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u5c14\u503c true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u8282\u70b9\u5bf9\u8c61 Instance of 'ListNode' \u7684\u54c8\u5e0c\u503c\u4e3a 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7ec4 (12836, \"\u5c0f\u54c8\") \u7684\u54c8\u5e0c\u503c\u4e3a 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u8282\u70b9\u5bf9\u8c61 RefCell { value: ListNode { val: 42, next: None } } \u7684\u54c8\u5e0c\u503c\u4e3a15387811073369036852\n
built_in_hash.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.kt
val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nval str = \"Hello \u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@1d81eb93 \u7684\u54c8\u5e0c\u503c\u4e3a 495053715\n
built_in_hash.rb
num = 3\nhash_num = num.hash\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1479186995943067893\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u8282\u70b9\u5bf9\u8c61 #<ListNode:0x000078133140ab70> \u7684\u54c8\u5e0c\u503c\u4e3a 4302940560806366381\n
built_in_hash.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u624d\u53ef\u4f5c\u4e3a\u54c8\u5e0c\u8868\u7684 key \u3002\u5047\u5982\u6211\u4eec\u5c06\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4f5c\u4e3a key \uff0c\u5f53\u5217\u8868\u7684\u5185\u5bb9\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u7684\u54c8\u5e0c\u503c\u4e5f\u968f\u4e4b\u6539\u53d8\uff0c\u6211\u4eec\u5c31\u65e0\u6cd5\u5728\u54c8\u5e0c\u8868\u4e2d\u67e5\u8be2\u5230\u539f\u5148\u7684 value \u4e86\u3002

\u867d\u7136\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08\u6bd4\u5982\u94fe\u8868\u8282\u70b9\uff09\u7684\u6210\u5458\u53d8\u91cf\u662f\u53ef\u53d8\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u54c8\u5e0c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u901a\u5e38\u662f\u57fa\u4e8e\u5185\u5b58\u5730\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u5bf9\u8c61\u7684\u5185\u5bb9\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u4f46\u5b83\u7684\u5185\u5b58\u5730\u5740\u4e0d\u53d8\uff0c\u54c8\u5e0c\u503c\u4ecd\u7136\u662f\u4e0d\u53d8\u7684\u3002

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u53d1\u73b0\u5728\u4e0d\u540c\u63a7\u5236\u53f0\u4e2d\u8fd0\u884c\u7a0b\u5e8f\u65f6\uff0c\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u662f\u4e0d\u540c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a Python \u89e3\u91ca\u5668\u5728\u6bcf\u6b21\u542f\u52a8\u65f6\uff0c\u90fd\u4f1a\u4e3a\u5b57\u7b26\u4e32\u54c8\u5e0c\u51fd\u6570\u52a0\u5165\u4e00\u4e2a\u968f\u673a\u7684\u76d0\uff08salt\uff09\u503c\u3002\u8fd9\u79cd\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u51fb\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u4e0a\u4e00\u8282\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a\u54c8\u5e0c\u51b2\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u6570\u7ec4\u5bb9\u91cf\u5927\u5c0f\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

\u54c8\u5e0c\u51b2\u7a81\u4f1a\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6bcf\u5f53\u9047\u5230\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u6211\u4eec\u5c31\u8fdb\u884c\u54c8\u5e0c\u8868\u6269\u5bb9\uff0c\u76f4\u81f3\u51b2\u7a81\u6d88\u5931\u4e3a\u6b62\u3002\u6b64\u65b9\u6cd5\u7b80\u5355\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u8981\u8fdb\u884c\u5927\u91cf\u7684\u6570\u636e\u642c\u8fd0\u4e0e\u54c8\u5e0c\u503c\u8ba1\u7b97\u3002\u4e3a\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

  1. \u6539\u826f\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u4f7f\u5f97\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\u3002
  2. \u4ec5\u5728\u5fc5\u8981\u65f6\uff0c\u5373\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u624d\u6267\u884c\u6269\u5bb9\u64cd\u4f5c\u3002

\u54c8\u5e0c\u8868\u7684\u7ed3\u6784\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u94fe\u5f0f\u5730\u5740\u201d\u548c\u201c\u5f00\u653e\u5bfb\u5740\u201d\u3002

"},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u94fe\u5f0f\u5730\u5740","text":"

\u5728\u539f\u59cb\u54c8\u5e0c\u8868\u4e2d\uff0c\u6bcf\u4e2a\u6876\u4ec5\u80fd\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u94fe\u5f0f\u5730\u5740\uff08separate chaining\uff09\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u6362\u4e3a\u94fe\u8868\uff0c\u5c06\u952e\u503c\u5bf9\u4f5c\u4e3a\u94fe\u8868\u8282\u70b9\uff0c\u5c06\u6240\u6709\u53d1\u751f\u51b2\u7a81\u7684\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5728\u540c\u4e00\u94fe\u8868\u4e2d\u3002\u56fe 6-5 \u5c55\u793a\u4e86\u4e00\u4e2a\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u4f8b\u5b50\u3002

\u56fe 6-5 \u00a0 \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868

\u57fa\u4e8e\u94fe\u5f0f\u5730\u5740\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u53d1\u751f\u4e86\u4ee5\u4e0b\u53d8\u5316\u3002

  • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u904d\u5386\u94fe\u8868\u5e76\u5bf9\u6bd4 key \u4ee5\u67e5\u627e\u76ee\u6807\u952e\u503c\u5bf9\u3002
  • \u6dfb\u52a0\u5143\u7d20\uff1a\u9996\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u952e\u503c\u5bf9\uff09\u6dfb\u52a0\u5230\u94fe\u8868\u4e2d\u3002
  • \u5220\u9664\u5143\u7d20\uff1a\u6839\u636e\u54c8\u5e0c\u51fd\u6570\u7684\u7ed3\u679c\u8bbf\u95ee\u94fe\u8868\u5934\u90e8\uff0c\u63a5\u7740\u904d\u5386\u94fe\u8868\u4ee5\u67e5\u627e\u76ee\u6807\u8282\u70b9\u5e76\u5c06\u5176\u5220\u9664\u3002

\u94fe\u5f0f\u5730\u5740\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

  • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff1a\u94fe\u8868\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u5b83\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
  • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\u3002

\u4ee5\u4e0b\u4ee3\u7801\u7ed9\u51fa\u4e86\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u7b80\u5355\u5b9e\u73b0\uff0c\u9700\u8981\u6ce8\u610f\u4e24\u70b9\u3002

  • \u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4ee3\u66ff\u94fe\u8868\uff0c\u4ece\u800c\u7b80\u5316\u4ee3\u7801\u3002\u5728\u8fd9\u79cd\u8bbe\u5b9a\u4e0b\uff0c\u54c8\u5e0c\u8868\uff08\u6570\u7ec4\uff09\u5305\u542b\u591a\u4e2a\u6876\uff0c\u6bcf\u4e2a\u6876\u90fd\u662f\u4e00\u4e2a\u5217\u8868\u3002
  • \u4ee5\u4e0b\u5b9e\u73b0\u5305\u542b\u54c8\u5e0c\u8868\u6269\u5bb9\u65b9\u6cd5\u3002\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(\\frac{2}{3}\\) \u65f6\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u94fe\u8868\u5f88\u957f\u65f6\uff0c\u67e5\u8be2\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u65f6\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u201cAVL \u6811\u201d\u6216\u201c\u7ea2\u9ed1\u6811\u201d\uff0c\u4ece\u800c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

\u5f00\u653e\u5bfb\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\u7b49\u3002

\u4e0b\u9762\u4ee5\u7ebf\u6027\u63a2\u6d4b\u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002

"},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7ebf\u6027\u63a2\u6d4b","text":"

\u7ebf\u6027\u63a2\u6d4b\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u641c\u7d22\u6765\u8fdb\u884c\u63a2\u6d4b\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u4e0e\u666e\u901a\u54c8\u5e0c\u8868\u6709\u6240\u4e0d\u540c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u53d1\u73b0\u6876\u5185\u5df2\u6709\u5143\u7d20\uff0c\u5219\u4ece\u51b2\u7a81\u4f4d\u7f6e\u5411\u540e\u7ebf\u6027\u904d\u5386\uff08\u6b65\u957f\u901a\u5e38\u4e3a \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
  • \u67e5\u627e\u5143\u7d20\uff1a\u82e5\u53d1\u73b0\u54c8\u5e0c\u51b2\u7a81\uff0c\u5219\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u5411\u540e\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u76f4\u5230\u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8bf4\u660e\u76ee\u6807\u5143\u7d20\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

\u56fe 6-6 \u5c55\u793a\u4e86\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03\u3002\u6839\u636e\u6b64\u54c8\u5e0c\u51fd\u6570\uff0c\u6700\u540e\u4e24\u4f4d\u76f8\u540c\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u901a\u8fc7\u7ebf\u6027\u63a2\u6d4b\uff0c\u5b83\u4eec\u88ab\u4f9d\u6b21\u5b58\u50a8\u5728\u8be5\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

\u56fe 6-6 \u00a0 \u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03

\u7136\u800c\uff0c\u7ebf\u6027\u63a2\u6d4b\u5bb9\u6613\u4ea7\u751f\u201c\u805a\u96c6\u73b0\u8c61\u201d\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6570\u7ec4\u4e2d\u8fde\u7eed\u88ab\u5360\u7528\u7684\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u4ece\u800c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8be5\u4f4d\u7f6e\u7684\u805a\u5806\u751f\u957f\uff0c\u5f62\u6210\u6076\u6027\u5faa\u73af\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e0d\u80fd\u5728\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u4e2d\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u8fd9\u662f\u56e0\u4e3a\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u6876 None \uff0c\u800c\u5f53\u67e5\u8be2\u5143\u7d20\u65f6\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230\u8be5\u7a7a\u6876\u5c31\u4f1a\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8be5\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u65e0\u6cd5\u518d\u88ab\u8bbf\u95ee\u5230\uff0c\u7a0b\u5e8f\u53ef\u80fd\u8bef\u5224\u8fd9\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u56fe 6-7 \u6240\u793a\u3002

\u56fe 6-7 \u00a0 \u5728\u5f00\u653e\u5bfb\u5740\u4e2d\u5220\u9664\u5143\u7d20\u5bfc\u81f4\u7684\u67e5\u8be2\u95ee\u9898

\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u61d2\u5220\u9664\uff08lazy deletion\uff09\u673a\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u4ece\u54c8\u5e0c\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u4e2a\u5e38\u91cf TOMBSTONE \u6765\u6807\u8bb0\u8fd9\u4e2a\u6876\u3002\u5728\u8be5\u673a\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u952e\u503c\u5bf9\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230 TOMBSTONE \u65f6\u5e94\u8be5\u7ee7\u7eed\u904d\u5386\uff0c\u56e0\u4e3a\u5176\u4e4b\u4e0b\u53ef\u80fd\u8fd8\u5b58\u5728\u952e\u503c\u5bf9\u3002

\u7136\u800c\uff0c\u61d2\u5220\u9664\u53ef\u80fd\u4f1a\u52a0\u901f\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u9000\u5316\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6b21\u5220\u9664\u64cd\u4f5c\u90fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5220\u9664\u6807\u8bb0\uff0c\u968f\u7740 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u7d22\u65f6\u95f4\u4e5f\u4f1a\u589e\u52a0\uff0c\u56e0\u4e3a\u7ebf\u6027\u63a2\u6d4b\u53ef\u80fd\u9700\u8981\u8df3\u8fc7\u591a\u4e2a TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6807\u5143\u7d20\u3002

\u4e3a\u6b64\uff0c\u8003\u8651\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a TOMBSTONE \u7684\u7d22\u5f15\uff0c\u5e76\u5c06\u641c\u7d22\u5230\u7684\u76ee\u6807\u5143\u7d20\u4e0e\u8be5 TOMBSTONE \u4ea4\u6362\u4f4d\u7f6e\u3002\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\u5f53\u6bcf\u6b21\u67e5\u8be2\u6216\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u81f3\u8ddd\u79bb\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6d4b\u8d77\u59cb\u70b9\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u4ece\u800c\u4f18\u5316\u67e5\u8be2\u6548\u7387\u3002

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5305\u542b\u61d2\u5220\u9664\u7684\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u3002\u4e3a\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u770b\u4f5c\u4e00\u4e2a\u201c\u73af\u5f62\u6570\u7ec4\u201d\uff0c\u5f53\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6d4b","text":"

\u5e73\u65b9\u63a2\u6d4b\u4e0e\u7ebf\u6027\u63a2\u6d4b\u7c7b\u4f3c\uff0c\u90fd\u662f\u5f00\u653e\u5bfb\u5740\u7684\u5e38\u89c1\u7b56\u7565\u4e4b\u4e00\u3002\u5f53\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e0d\u662f\u7b80\u5355\u5730\u8df3\u8fc7\u4e00\u4e2a\u56fa\u5b9a\u7684\u6b65\u6570\uff0c\u800c\u662f\u8df3\u8fc7\u201c\u63a2\u6d4b\u6b21\u6570\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6570\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

\u5e73\u65b9\u63a2\u6d4b\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\u3002

  • \u5e73\u65b9\u63a2\u6d4b\u901a\u8fc7\u8df3\u8fc7\u63a2\u6d4b\u6b21\u6570\u5e73\u65b9\u7684\u8ddd\u79bb\uff0c\u8bd5\u56fe\u7f13\u89e3\u7ebf\u6027\u63a2\u6d4b\u7684\u805a\u96c6\u6548\u5e94\u3002
  • \u5e73\u65b9\u63a2\u6d4b\u4f1a\u8df3\u8fc7\u66f4\u5927\u7684\u8ddd\u79bb\u6765\u5bfb\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u4e8e\u6570\u636e\u5206\u5e03\u5f97\u66f4\u52a0\u5747\u5300\u3002

\u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6d4b\u5e76\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

  • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73b0\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u5360\u7528\u3002
  • \u7531\u4e8e\u5e73\u65b9\u7684\u589e\u957f\uff0c\u5e73\u65b9\u63a2\u6d4b\u53ef\u80fd\u4e0d\u4f1a\u63a2\u6d4b\u6574\u4e2a\u54c8\u5e0c\u8868\uff0c\u8fd9\u610f\u5473\u7740\u5373\u4f7f\u54c8\u5e0c\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e5f\u53ef\u80fd\u65e0\u6cd5\u8bbf\u95ee\u5230\u5b83\u3002
"},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u54c8\u5e0c","text":"

\u987e\u540d\u601d\u4e49\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u8fdb\u884c\u63a2\u6d4b\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) \u51fa\u73b0\u51b2\u7a81\uff0c\u5219\u5c1d\u8bd5 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u540e\u63d2\u5165\u5143\u7d20\u3002
  • \u67e5\u627e\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u54c8\u5e0c\u51fd\u6570\u987a\u5e8f\u4e0b\u8fdb\u884c\u67e5\u627e\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u65f6\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de None \u3002

\u4e0e\u7ebf\u6027\u63a2\u6d4b\u76f8\u6bd4\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u4f1a\u5e26\u6765\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\uff09\u54c8\u5e0c\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u201d\u7684\u95ee\u9898\u3002

"},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u9009\u62e9","text":"

\u5404\u79cd\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u7b56\u7565\uff0c\u4e0b\u9762\u4e3e\u51e0\u4e2a\u4f8b\u5b50\u3002

  • Python \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002
  • Java \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002
  • Go \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002Go \u89c4\u5b9a\u6bcf\u4e2a\u6876\u6700\u591a\u5b58\u50a8 8 \u4e2a\u952e\u503c\u5bf9\uff0c\u8d85\u51fa\u5bb9\u91cf\u5219\u8fde\u63a5\u4e00\u4e2a\u6ea2\u51fa\u6876\uff1b\u5f53\u6ea2\u51fa\u6876\u8fc7\u591a\u65f6\uff0c\u4f1a\u6267\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u6269\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u786e\u4fdd\u6027\u80fd\u3002
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u54c8\u5e0c\u8868","text":"

\u54c8\u5e0c\u8868\uff08hash table\uff09\uff0c\u53c8\u79f0\u6563\u5217\u8868\uff0c\u5b83\u901a\u8fc7\u5efa\u7acb\u952e key \u4e0e\u503c value \u4e4b\u95f4\u7684\u6620\u5c04\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8be2\u3002\u5177\u4f53\u800c\u8a00\uff0c\u6211\u4eec\u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u4e00\u4e2a\u952e key \uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684\u503c value \u3002

\u5982\u56fe 6-1 \u6240\u793a\uff0c\u7ed9\u5b9a \\(n\\) \u4e2a\u5b66\u751f\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b66\u53f7\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\u7684\u67e5\u8be2\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u56fe 6-1 \u6240\u793a\u7684\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

\u56fe 6-1 \u00a0 \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5b83\u4eec\u7684\u6548\u7387\u5bf9\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

  • \u6dfb\u52a0\u5143\u7d20\uff1a\u4ec5\u9700\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u6570\u7ec4\uff08\u94fe\u8868\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
  • \u67e5\u8be2\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\uff08\u94fe\u8868\uff09\u662f\u4e71\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u904d\u5386\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8be2\u5230\u5143\u7d20\uff0c\u518d\u4ece\u6570\u7ec4\uff08\u94fe\u8868\uff09\u4e2d\u5220\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002

\u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8be2\u6548\u7387\u5bf9\u6bd4

\u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u54c8\u5e0c\u8868\u4e2d\u8fdb\u884c\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u54c8\u5e0c\u8868\u7684\u5e38\u89c1\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u548c\u5220\u9664\u952e\u503c\u5bf9\u7b49\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap: dict = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.pop(10583)\n
hash_map.cpp
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
hash_map.java
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u5570\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.cs
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nDictionary<int, string> map = new() {\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    // \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u5570\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9e2d\" }\n};\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
hash_map_test.go
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nhmap := make(map[int]string)\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(hmap, 10583)\n
hash_map.swift
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\n
hash_map.ts
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map<number, string>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\nconsole.info('\\n\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f93\u5165\u5b66\u53f7 15937 \uff0c\u67e5\u8be2\u5230\u59d3\u540d ' + name);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\nconsole.info('\\n\u5220\u9664 10583 \u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<int, String> map = {};\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u5570\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9e2d\".to_string());\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.kt
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583)\n
hash_map.rb
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.delete(10583)\n
hash_map.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u5f0f\uff1a\u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u548c\u904d\u5386\u503c\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in hmap.keys():\n    print(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u904d\u5386 key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\n    print(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
hash_map.rs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.kt
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (key in map.keys) {\n    println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
hash_map.rb
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u5355\u72ec\u904d\u5386\u952e key\nhmap.keys.each { |key| puts key }\n\n# \u5355\u72ec\u904d\u5386\u503c value\nhmap.values.each { |val| puts val }\n
hash_map.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u54c8\u5e0c\u8868\u7b80\u5355\u5b9e\u73b0","text":"

\u6211\u4eec\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u6876\uff08bucket\uff09\uff0c\u6bcf\u4e2a\u6876\u53ef\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u56e0\u6b64\uff0c\u67e5\u8be2\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5bf9\u5e94\u7684\u6876\uff0c\u5e76\u5728\u6876\u4e2d\u83b7\u53d6 value \u3002

\u90a3\u4e48\uff0c\u5982\u4f55\u57fa\u4e8e key \u5b9a\u4f4d\u5bf9\u5e94\u7684\u6876\u5462\uff1f\u8fd9\u662f\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\uff08hash function\uff09\u5b9e\u73b0\u7684\u3002\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u8f93\u51fa\u7a7a\u95f4\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8f93\u5165\u7a7a\u95f4\u662f\u6240\u6709 key \uff0c\u8f93\u51fa\u7a7a\u95f4\u662f\u6240\u6709\u6876\uff08\u6570\u7ec4\u7d22\u5f15\uff09\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u8f93\u5165\u4e00\u4e2a key \uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u8be5 key \u5bf9\u5e94\u7684\u952e\u503c\u5bf9\u5728\u6570\u7ec4\u4e2d\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002

\u8f93\u5165\u4e00\u4e2a key \uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u8fc7\u7a0b\u5206\u4e3a\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u901a\u8fc7\u67d0\u79cd\u54c8\u5e0c\u7b97\u6cd5 hash() \u8ba1\u7b97\u5f97\u5230\u54c8\u5e0c\u503c\u3002
  2. \u5c06\u54c8\u5e0c\u503c\u5bf9\u6876\u6570\u91cf\uff08\u6570\u7ec4\u957f\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u4ece\u800c\u83b7\u53d6\u8be5 key \u5bf9\u5e94\u7684\u6570\u7ec4\u7d22\u5f15 index \u3002
index = hash(key) % capacity\n

\u968f\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u54c8\u5e0c\u8868\u4e2d\u8bbf\u95ee\u5bf9\u5e94\u7684\u6876\uff0c\u4ece\u800c\u83b7\u53d6 value \u3002

\u8bbe\u6570\u7ec4\u957f\u5ea6 capacity = 100\u3001\u54c8\u5e0c\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u54c8\u5e0c\u51fd\u6570\u4e3a key % 100 \u3002\u56fe 6-2 \u4ee5 key \u5b66\u53f7\u548c value \u59d3\u540d\u4e3a\u4f8b\uff0c\u5c55\u793a\u4e86\u54c8\u5e0c\u51fd\u6570\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u56fe 6-2 \u00a0 \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u7b80\u5355\u54c8\u5e0c\u8868\u3002\u5176\u4e2d\uff0c\u6211\u4eec\u5c06 key \u548c value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Pair \uff0c\u4ee5\u8868\u793a\u952e\u503c\u5bf9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u4e0e\u6269\u5bb9","text":"

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u6240\u6709 key \u6784\u6210\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u6570\u7ec4\u6240\u6709\u7d22\u5f15\u6784\u6210\u7684\u8f93\u51fa\u7a7a\u95f4\uff0c\u800c\u8f93\u5165\u7a7a\u95f4\u5f80\u5f80\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7406\u8bba\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u76f8\u540c\u8f93\u51fa\u201d\u7684\u60c5\u51b5\u3002

\u5bf9\u4e8e\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u51fa\u7ed3\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a 12836 \u548c 20336 \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

12836 % 100 = 36\n20336 % 100 = 36\n

\u5982\u56fe 6-3 \u6240\u793a\uff0c\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002\u6211\u4eec\u5c06\u8fd9\u79cd\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u540c\u4e00\u8f93\u51fa\u7684\u60c5\u51b5\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\uff08hash collision\uff09\u3002

\u56fe 6-3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

\u5bb9\u6613\u60f3\u5230\uff0c\u54c8\u5e0c\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u4e2a key \u88ab\u5206\u914d\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\uff0c\u51b2\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002

\u5982\u56fe 6-4 \u6240\u793a\uff0c\u6269\u5bb9\u524d\u952e\u503c\u5bf9 (136, A) \u548c (236, D) \u53d1\u751f\u51b2\u7a81\uff0c\u6269\u5bb9\u540e\u51b2\u7a81\u6d88\u5931\u3002

\u56fe 6-4 \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9

\u7c7b\u4f3c\u4e8e\u6570\u7ec4\u6269\u5bb9\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u5c06\u6240\u6709\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u8fc1\u79fb\u81f3\u65b0\u54c8\u5e0c\u8868\uff0c\u975e\u5e38\u8017\u65f6\uff1b\u5e76\u4e14\u7531\u4e8e\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u6539\u53d8\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u6765\u91cd\u65b0\u8ba1\u7b97\u6240\u6709\u952e\u503c\u5bf9\u7684\u5b58\u50a8\u4f4d\u7f6e\uff0c\u8fd9\u8fdb\u4e00\u6b65\u589e\u52a0\u4e86\u6269\u5bb9\u8fc7\u7a0b\u7684\u8ba1\u7b97\u5f00\u9500\u3002\u4e3a\u6b64\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u9884\u7559\u8db3\u591f\u5927\u7684\u54c8\u5e0c\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u9891\u7e41\u6269\u5bb9\u3002

\u8d1f\u8f7d\u56e0\u5b50\uff08load factor\uff09\u662f\u54c8\u5e0c\u8868\u7684\u4e00\u4e2a\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u7684\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u7528\u4e8e\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u8f93\u5165 key \uff0c\u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u67e5\u8be2\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u3001\u5220\u9664\u952e\u503c\u5bf9\u548c\u904d\u5386\u54c8\u5e0c\u8868\u7b49\u3002
  • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff0c\u4ece\u800c\u8bbf\u95ee\u5bf9\u5e94\u6876\u5e76\u83b7\u53d6 value \u3002
  • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u3002\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u7684\u5f00\u9500\u5f88\u5927\u3002
  • \u8d1f\u8f7d\u56e0\u5b50\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u53cd\u6620\u4e86\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89e6\u53d1\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u6761\u4ef6\u3002
  • \u94fe\u5f0f\u5730\u5740\u901a\u8fc7\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u5316\u4e3a\u94fe\u8868\uff0c\u5c06\u6240\u6709\u51b2\u7a81\u5143\u7d20\u5b58\u50a8\u5728\u540c\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002\u7136\u800c\uff0c\u94fe\u8868\u8fc7\u957f\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u8fdb\u4e00\u6b65\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6765\u63d0\u9ad8\u6548\u7387\u3002
  • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\u3002\u7ebf\u6027\u63a2\u6d4b\u4f7f\u7528\u56fa\u5b9a\u6b65\u957f\uff0c\u7f3a\u70b9\u662f\u4e0d\u80fd\u5220\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u591a\u6b21\u54c8\u5e0c\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u8fdb\u884c\u63a2\u6d4b\uff0c\u76f8\u8f83\u7ebf\u6027\u63a2\u6d4b\u66f4\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u589e\u52a0\u4e86\u8ba1\u7b97\u91cf\u3002
  • \u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
  • \u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5e0c\u671b\u54c8\u5e0c\u7b97\u6cd5\u5177\u6709\u786e\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u5300\u5206\u5e03\u7684\u7279\u70b9\u3002\u5728\u5bc6\u7801\u5b66\u4e2d\uff0c\u54c8\u5e0c\u7b97\u6cd5\u8fd8\u5e94\u8be5\u5177\u5907\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u5e94\u3002
  • \u54c8\u5e0c\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u5747\u5300\u5206\u5e03\uff0c\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u4e8e\u6821\u9a8c\u6587\u4ef6\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u4e8e\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u3002
  • \u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u662f\u53ef\u54c8\u5e0c\u7684\u3002
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f \\(O(n)\\) \uff1f

\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u5f53\u54c8\u5e0c\u51fd\u6570\u8bbe\u8ba1\u5f97\u6bd4\u8f83\u597d\u3001\u5bb9\u91cf\u8bbe\u7f6e\u6bd4\u8f83\u5408\u7406\u3001\u51b2\u7a81\u6bd4\u8f83\u5e73\u5747\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u4eec\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u54c8\u5e0c\u8868\u65f6\uff0c\u901a\u5e38\u8ba4\u4e3a\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u4e0d\u4f7f\u7528\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x\\) \u5462\uff1f\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u51b2\u7a81\u4e86\u3002

\u5728 \\(f(x) = x\\) \u54c8\u5e0c\u51fd\u6570\u4e0b\uff0c\u6bcf\u4e2a\u5143\u7d20\u5bf9\u5e94\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u8fd9\u4e0e\u6570\u7ec4\u7b49\u4ef7\u3002\u7136\u800c\uff0c\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff08\u6570\u7ec4\u957f\u5ea6\uff09\uff0c\u56e0\u6b64\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u54c8\u5e0c\u8868\u7684\u76ee\u6807\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u72b6\u6001\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u7a7a\u95f4\uff0c\u5e76\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8be2\u6548\u7387\u3002

Q\uff1a\u54c8\u5e0c\u8868\u5e95\u5c42\u5b9e\u73b0\u662f\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u4eec\u66f4\u9ad8\u5462\uff1f

\u9996\u5148\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\uff0c\u4f46\u7a7a\u95f4\u6548\u7387\u53d8\u4f4e\u4e86\u3002\u54c8\u5e0c\u8868\u6709\u76f8\u5f53\u4e00\u90e8\u5206\u5185\u5b58\u672a\u4f7f\u7528\u3002

\u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u573a\u666f\u4e0b\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u4e2a\u529f\u80fd\u80fd\u591f\u5728\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\uff0c\u90a3\u4e48\u901a\u5e38\u6bd4\u54c8\u5e0c\u8868\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u9700\u8981\u5f00\u9500\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u6570\u9879\u66f4\u5927\u3002

\u6700\u540e\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u53d1\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u94fe\u5f0f\u5730\u5740\u4e2d\uff0c\u6211\u4eec\u91c7\u53d6\u5728\u94fe\u8868\u6216\u7ea2\u9ed1\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u65f6\u95f4\u7684\u98ce\u9669\u3002

Q\uff1a\u591a\u6b21\u54c8\u5e0c\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\u5417\uff1f\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u8fd8\u80fd\u518d\u6b21\u4f7f\u7528\u5417\uff1f

\u591a\u6b21\u54c8\u5e0c\u662f\u5f00\u653e\u5bfb\u5740\u7684\u4e00\u79cd\uff0c\u5f00\u653e\u5bfb\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u901a\u8fc7\u6807\u8bb0\u5220\u9664\u3002\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u5f53\u5c06\u65b0\u5143\u7d20\u63d2\u5165\u54c8\u5e0c\u8868\uff0c\u5e76\u4e14\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u4f4d\u7f6e\u65f6\uff0c\u8be5\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u8fd9\u6837\u505a\u65e2\u80fd\u4fdd\u6301\u54c8\u5e0c\u8868\u7684\u63a2\u6d4b\u5e8f\u5217\u4e0d\u53d8\uff0c\u53c8\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\u4f7f\u7528\u7387\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\uff0c\u67e5\u627e\u5143\u7d20\u7684\u65f6\u5019\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f

\u67e5\u627e\u7684\u65f6\u5019\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u5bf9\u5e94\u7684\u6876\u548c\u952e\u503c\u5bf9\uff0c\u53d1\u73b0 key \u4e0d\u5339\u914d\uff0c\u8fd9\u5c31\u4ee3\u8868\u6709\u54c8\u5e0c\u51b2\u7a81\u3002\u56e0\u6b64\uff0c\u7ebf\u6027\u63a2\u6d4b\u6cd5\u4f1a\u6839\u636e\u9884\u5148\u8bbe\u5b9a\u7684\u6b65\u957f\u4f9d\u6b21\u5411\u4e0b\u67e5\u627e\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u786e\u7684\u952e\u503c\u5bf9\u6216\u65e0\u6cd5\u627e\u5230\u8df3\u51fa\u4e3a\u6b62\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u6269\u5bb9\u80fd\u591f\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff1f

\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\uff0c\u8ba9\u8f93\u51fa\u503c\u843d\u5728\u6570\u7ec4\u7d22\u5f15\u8303\u56f4\u5185\uff1b\u5728\u6269\u5bb9\u540e\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d1\u751f\u53d8\u5316\uff0c\u800c key \u5bf9\u5e94\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u4e2a\u6876\u7684\u591a\u4e2a key \uff0c\u5728\u6269\u5bb9\u540e\u53ef\u80fd\u4f1a\u88ab\u5206\u914d\u5230\u591a\u4e2a\u6876\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u54c8\u5e0c\u51b2\u7a81\u7684\u7f13\u89e3\u3002

"},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806","text":"

Abstract

\u5806\u5c31\u50cf\u662f\u5c71\u5cb3\u5cf0\u5ce6\uff0c\u5c42\u53e0\u8d77\u4f0f\u3001\u5f62\u6001\u5404\u5f02\u3002

\u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u9519\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u603b\u662f\u6700\u5148\u6620\u5165\u773c\u5e18\u3002

"},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 8.1 \u00a0 \u5806
  • 8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c
  • 8.3 \u00a0 Top-k \u95ee\u9898
  • 8.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c","text":"

\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u6765\u6784\u5efa\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u3002

"},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u501f\u52a9\u5165\u5806\u64cd\u4f5c\u5b9e\u73b0","text":"

\u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u904d\u5386\u5217\u8868\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u5143\u7d20\u6267\u884c\u201c\u5165\u5806\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u5806\u7684\u5c3e\u90e8\uff0c\u518d\u5bf9\u8be5\u5143\u7d20\u6267\u884c\u201c\u4ece\u5e95\u81f3\u9876\u201d\u5806\u5316\u3002

\u6bcf\u5f53\u4e00\u4e2a\u5143\u7d20\u5165\u5806\uff0c\u5806\u7684\u957f\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u4e8e\u8282\u70b9\u662f\u4ece\u9876\u5230\u5e95\u4f9d\u6b21\u88ab\u6dfb\u52a0\u8fdb\u4e8c\u53c9\u6811\u7684\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u6784\u5efa\u7684\u3002

\u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6bcf\u4e2a\u5143\u7d20\u7684\u5165\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u65f6\u95f4\uff0c\u56e0\u6b64\u8be5\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u901a\u8fc7\u904d\u5386\u5806\u5316\u5b9e\u73b0","text":"

\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u66f4\u4e3a\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5171\u5206\u4e3a\u4e24\u6b65\u3002

  1. \u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u5730\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u6b64\u65f6\u5806\u7684\u6027\u8d28\u5c1a\u672a\u5f97\u5230\u6ee1\u8db3\u3002
  2. \u5012\u5e8f\u904d\u5386\u5806\uff08\u5c42\u5e8f\u904d\u5386\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u975e\u53f6\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002

\u6bcf\u5f53\u5806\u5316\u4e00\u4e2a\u8282\u70b9\u540e\uff0c\u4ee5\u8be5\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\u5c31\u5f62\u6210\u4e00\u4e2a\u5408\u6cd5\u7684\u5b50\u5806\u3002\u800c\u7531\u4e8e\u662f\u5012\u5e8f\u904d\u5386\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u6784\u5efa\u7684\u3002

\u4e4b\u6240\u4ee5\u9009\u62e9\u5012\u5e8f\u904d\u5386\uff0c\u662f\u56e0\u4e3a\u8fd9\u6837\u80fd\u591f\u4fdd\u8bc1\u5f53\u524d\u8282\u70b9\u4e4b\u4e0b\u7684\u5b50\u6811\u5df2\u7ecf\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u8fd9\u6837\u5806\u5316\u5f53\u524d\u8282\u70b9\u624d\u662f\u6709\u6548\u7684\u3002

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u7531\u4e8e\u53f6\u8282\u70b9\u6ca1\u6709\u5b50\u8282\u70b9\uff0c\u56e0\u6b64\u5b83\u4eec\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u65e0\u987b\u5806\u5316\u3002\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6700\u540e\u4e00\u4e2a\u975e\u53f6\u8282\u70b9\u662f\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u6211\u4eec\u4ece\u5b83\u5f00\u59cb\u5012\u5e8f\u904d\u5386\u5e76\u6267\u884c\u5806\u5316\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u4e0b\u9762\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u63a8\u7b97\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

  • \u5047\u8bbe\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1) / 2\\) \u3002
  • \u5728\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e2a\u8282\u70b9\u6700\u591a\u5806\u5316\u5230\u53f6\u8282\u70b9\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u4e3a\u4e8c\u53c9\u6811\u9ad8\u5ea6 \\(\\log n\\) \u3002

\u5c06\u4e0a\u8ff0\u4e24\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u8fc7\u7a0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u4f46\u8fd9\u4e2a\u4f30\u7b97\u7ed3\u679c\u5e76\u4e0d\u51c6\u786e\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u8003\u8651\u5230\u4e8c\u53c9\u6811\u5e95\u5c42\u8282\u70b9\u6570\u91cf\u8fdc\u591a\u4e8e\u9876\u5c42\u8282\u70b9\u7684\u6027\u8d28\u3002

\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u51c6\u786e\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u964d\u4f4e\u8ba1\u7b97\u96be\u5ea6\uff0c\u5047\u8bbe\u7ed9\u5b9a\u4e00\u4e2a\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \u3001\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002

\u56fe 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

\u5982\u56fe 8-5 \u6240\u793a\uff0c\u8282\u70b9\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u7b49\u4e8e\u8be5\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u800c\u8be5\u8ddd\u79bb\u6b63\u662f\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u8282\u70b9\u7684\u5806\u5316\u8fed\u4ee3\u6b21\u6570\u7684\u603b\u548c\u3002

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

\u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5c06 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

\u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

\u89c2\u5bdf\u4e0a\u5f0f\uff0c\u53d1\u73b0 \\(T(h)\\) \u662f\u4e00\u4e2a\u7b49\u6bd4\u6570\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

\u8fdb\u4e00\u6b65\uff0c\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u590d\u6742\u5ea6\u4e3a \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806","text":"

\u5806\uff08heap\uff09\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u4e3b\u8981\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff0c\u5982\u56fe 8-1 \u6240\u793a\u3002

  • \u5c0f\u9876\u5806\uff08min heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002
  • \u5927\u9876\u5806\uff08max heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002

\u56fe 8-1 \u00a0 \u5c0f\u9876\u5806\u4e0e\u5927\u9876\u5806

\u5806\u4f5c\u4e3a\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u6700\u5e95\u5c42\u8282\u70b9\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u3002
  • \u6211\u4eec\u5c06\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u9876\u201d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u5e95\u201d\u3002
  • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u6839\u8282\u70b9\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u4f18\u5148\u961f\u5217\uff08priority queue\uff09\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b9a\u4e49\u4e3a\u5177\u6709\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u961f\u5217\u3002

\u5b9e\u9645\u4e0a\uff0c\u5806\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u7684\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u201c\u4f18\u5148\u961f\u5217\u201d\u548c\u201c\u5806\u201d\u770b\u4f5c\u7b49\u4ef7\u7684\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u672c\u4e66\u5bf9\u4e24\u8005\u4e0d\u505a\u7279\u522b\u533a\u5206\uff0c\u7edf\u4e00\u79f0\u4f5c\u201c\u5806\u201d\u3002

\u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\u8868 8-1 \u00a0 \u5806\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u5806 \\(O(\\log n)\\) pop() \u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) peek() \u8bbf\u95ee\u5806\u9876\u5143\u7d20\uff08\u5bf9\u4e8e\u5927 / \u5c0f\u9876\u5806\u5206\u522b\u4e3a\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u83b7\u53d6\u5806\u7684\u5143\u7d20\u6570\u91cf \\(O(1)\\) isEmpty() \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a \\(O(1)\\)

\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u5806\u7c7b\uff08\u6216\u4f18\u5148\u961f\u5217\u7c7b\uff09\u3002

\u7c7b\u4f3c\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u201c\u4ece\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u4ece\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e2a flag \u6216\u4fee\u6539 Comparator \u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.kt
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

\u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\u8fdb\u884c\u9006\u8f6c\uff08\u4f8b\u5982\uff0c\u5c06 \\(\\geq\\) \u66ff\u6362\u4e3a \\(\\leq\\) \uff09\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

"},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u8bb2\u8fc7\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u7531\u4e8e\u5806\u6b63\u662f\u4e00\u79cd\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u91c7\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002

\u5f53\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u4e8c\u53c9\u6811\u65f6\uff0c\u5143\u7d20\u4ee3\u8868\u8282\u70b9\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u8282\u70b9\u5728\u4e8c\u53c9\u6811\u4e2d\u7684\u4f4d\u7f6e\u3002\u8282\u70b9\u6307\u9488\u901a\u8fc7\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u6765\u5b9e\u73b0\u3002

\u5982\u56fe 8-2 \u6240\u793a\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

\u56fe 8-2 \u00a0 \u5806\u7684\u8868\u793a\u4e0e\u5b58\u50a8

\u6211\u4eec\u53ef\u4ee5\u5c06\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8bbf\u95ee\u5806\u9876\u5143\u7d20","text":"

\u5806\u9876\u5143\u7d20\u5373\u4e3a\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u4e5f\u5c31\u662f\u5217\u8868\u7684\u9996\u4e2a\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806","text":"

\u7ed9\u5b9a\u5143\u7d20 val \uff0c\u6211\u4eec\u9996\u5148\u5c06\u5176\u6dfb\u52a0\u5230\u5806\u5e95\u3002\u6dfb\u52a0\u4e4b\u540e\uff0c\u7531\u4e8e val \u53ef\u80fd\u5927\u4e8e\u5806\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7684\u6210\u7acb\u6761\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u574f\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u590d\u4ece\u63d2\u5165\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u88ab\u79f0\u4e3a\u5806\u5316\uff08heapify\uff09\u3002

\u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5982\u56fe 8-3 \u6240\u793a\uff0c\u6211\u4eec\u6bd4\u8f83\u63d2\u5165\u8282\u70b9\u4e0e\u5176\u7236\u8282\u70b9\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u8282\u70b9\u66f4\u5927\uff0c\u5219\u5c06\u5b83\u4eec\u4ea4\u6362\u3002\u7136\u540e\u7ee7\u7eed\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4ece\u5e95\u81f3\u9876\u4fee\u590d\u5806\u4e2d\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u76f4\u81f3\u8d8a\u8fc7\u6839\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6><7><8><9>

\u56fe 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u6b65\u9aa4

\u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u6811\u7684\u9ad8\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u5316\u64cd\u4f5c\u7684\u5faa\u73af\u8f6e\u6570\u6700\u591a\u4e3a \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806","text":"

\u5806\u9876\u5143\u7d20\u662f\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u5373\u5217\u8868\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u4ece\u5217\u8868\u4e2d\u5220\u9664\u9996\u5143\u7d20\uff0c\u90a3\u4e48\u4e8c\u53c9\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u7d22\u5f15\u90fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u8fd9\u5c06\u4f7f\u5f97\u540e\u7eed\u4f7f\u7528\u5806\u5316\u8fdb\u884c\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\u3002

  1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\u3002
  2. \u4ea4\u6362\u5b8c\u6210\u540e\uff0c\u5c06\u5806\u5e95\u4ece\u5217\u8868\u4e2d\u5220\u9664\uff08\u6ce8\u610f\uff0c\u7531\u4e8e\u5df2\u7ecf\u4ea4\u6362\uff0c\u56e0\u6b64\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\u3002
  3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\u3002

\u5982\u56fe 8-4 \u6240\u793a\uff0c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u201c\u4ece\u5e95\u81f3\u9876\u5806\u5316\u201d\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u8282\u70b9\u7684\u503c\u4e0e\u5176\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u503c\u8fdb\u884c\u6bd4\u8f83\uff0c\u5c06\u6700\u5927\u7684\u5b50\u8282\u70b9\u4e0e\u6839\u8282\u70b9\u4ea4\u6362\u3002\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6><7><8><9><10>

\u56fe 8-4 \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806\u6b65\u9aa4

\u4e0e\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u9876\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7684\u5e38\u89c1\u5e94\u7528","text":"
  • \u4f18\u5148\u961f\u5217\uff1a\u5806\u901a\u5e38\u4f5c\u4e3a\u5b9e\u73b0\u4f18\u5148\u961f\u5217\u7684\u9996\u9009\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \uff0c\u800c\u5efa\u961f\u64cd\u4f5c\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
  • \u5806\u6392\u5e8f\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u4eec\u5efa\u7acb\u4e00\u4e2a\u5806\uff0c\u7136\u540e\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u201c\u5806\u6392\u5e8f\u201d\u7ae0\u8282\u3002
  • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u5806\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u6839\u636e\u6210\u7acb\u6761\u4ef6\u53ef\u5206\u4e3a\u5927\u9876\u5806\u548c\u5c0f\u9876\u5806\u3002\u5927\uff08\u5c0f\uff09\u9876\u5806\u7684\u5806\u9876\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
  • \u4f18\u5148\u961f\u5217\u7684\u5b9a\u4e49\u662f\u5177\u6709\u51fa\u961f\u4f18\u5148\u7ea7\u7684\u961f\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u6765\u5b9e\u73b0\u3002
  • \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806 \\(O(\\log n)\\)\u3001\u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) \u548c\u8bbf\u95ee\u5806\u9876\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
  • \u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u8868\u793a\uff0c\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002
  • \u5806\u5316\u64cd\u4f5c\u7528\u4e8e\u7ef4\u62a4\u5806\u7684\u6027\u8d28\uff0c\u5728\u5165\u5806\u548c\u51fa\u5806\u64cd\u4f5c\u4e2d\u90fd\u4f1a\u7528\u5230\u3002
  • \u8f93\u5165 \\(n\\) \u4e2a\u5143\u7d20\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
  • Top-k \u662f\u4e00\u4e2a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u6570\u636e\u7ed3\u6784\u9ad8\u6548\u89e3\u51b3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6570\u636e\u7ed3\u6784\u7684\u201c\u5806\u201d\u4e0e\u5185\u5b58\u7ba1\u7406\u7684\u201c\u5806\u201d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\u5417\uff1f

\u4e24\u8005\u4e0d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u201d\u3002\u8ba1\u7b97\u673a\u7cfb\u7edf\u5185\u5b58\u4e2d\u7684\u5806\u662f\u52a8\u6001\u5185\u5b58\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5b58\u50a8\u6570\u636e\u3002\u7a0b\u5e8f\u53ef\u4ee5\u8bf7\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u5185\u5b58\uff0c\u7528\u4e8e\u5b58\u50a8\u5982\u5bf9\u8c61\u548c\u6570\u7ec4\u7b49\u590d\u6742\u7ed3\u6784\u3002\u5f53\u8fd9\u4e9b\u6570\u636e\u4e0d\u518d\u9700\u8981\u65f6\uff0c\u7a0b\u5e8f\u9700\u8981\u91ca\u653e\u8fd9\u4e9b\u5185\u5b58\uff0c\u4ee5\u9632\u6b62\u5185\u5b58\u6cc4\u6f0f\u3002\u76f8\u8f83\u4e8e\u6808\u5185\u5b58\uff0c\u5806\u5185\u5b58\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8c28\u614e\uff0c\u4f7f\u7528\u4e0d\u5f53\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u548c\u91ce\u6307\u9488\u7b49\u95ee\u9898\u3002

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u65e0\u5e8f\u6570\u7ec4 nums \uff0c\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002

\u5bf9\u4e8e\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u5148\u4ecb\u7ecd\u4e24\u79cd\u601d\u8def\u6bd4\u8f83\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7ecd\u6548\u7387\u66f4\u9ad8\u7684\u5806\u89e3\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u904d\u5386\u9009\u62e9","text":"

\u6211\u4eec\u53ef\u4ee5\u8fdb\u884c\u56fe 8-6 \u6240\u793a\u7684 \\(k\\) \u8f6e\u904d\u5386\uff0c\u5206\u522b\u5728\u6bcf\u8f6e\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\) \u3002

\u6b64\u65b9\u6cd5\u53ea\u9002\u7528\u4e8e \\(k \\ll n\\) \u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u5f53 \\(k\\) \u4e0e \\(n\\) \u6bd4\u8f83\u63a5\u8fd1\u65f6\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411\u4e8e \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u65f6\u3002

\u56fe 8-6 \u00a0 \u904d\u5386\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

Tip

\u5f53 \\(k = n\\) \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u65f6\u7b49\u4ef7\u4e8e\u201c\u9009\u62e9\u6392\u5e8f\u201d\u7b97\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

\u5982\u56fe 8-7 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u5bf9\u6570\u7ec4 nums \u8fdb\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u8fb9\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u663e\u7136\uff0c\u8be5\u65b9\u6cd5\u201c\u8d85\u989d\u201d\u5b8c\u6210\u4efb\u52a1\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

\u56fe 8-7 \u00a0 \u6392\u5e8f\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

"},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806","text":"

\u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u5806\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u51b3 Top-k \u95ee\u9898\uff0c\u6d41\u7a0b\u5982\u56fe 8-8 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5176\u5806\u9876\u5143\u7d20\u6700\u5c0f\u3002
  2. \u5148\u5c06\u6570\u7ec4\u7684\u524d \\(k\\) \u4e2a\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u3002
  3. \u4ece\u7b2c \\(k + 1\\) \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\uff0c\u5e76\u5c06\u5f53\u524d\u5143\u7d20\u5165\u5806\u3002
  4. \u904d\u5386\u5b8c\u6210\u540e\uff0c\u5806\u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 8-8 \u00a0 \u57fa\u4e8e\u5806\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u5171\u6267\u884c\u4e86 \\(n\\) \u8f6e\u5165\u5806\u548c\u51fa\u5806\uff0c\u5806\u7684\u6700\u5927\u957f\u5ea6\u4e3a \\(k\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002\u8be5\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u5f53 \\(k\\) \u8f83\u5c0f\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \uff1b\u5f53 \\(k\\) \u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(O(n \\log n)\\) \u3002

\u53e6\u5916\uff0c\u8be5\u65b9\u6cd5\u9002\u7528\u4e8e\u52a8\u6001\u6570\u636e\u6d41\u7684\u4f7f\u7528\u573a\u666f\u3002\u5728\u4e0d\u65ad\u52a0\u5165\u6570\u636e\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u6301\u7eed\u7ef4\u62a4\u5806\u5185\u7684\u5143\u7d20\uff0c\u4ece\u800c\u5b9e\u73b0\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u7684\u52a8\u6001\u66f4\u65b0\u3002

"},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

\u51e0\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u5251\u6307 Offer\u201d\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u8bfb\u8005\u7684\u9f13\u52b1\u548c\u652f\u6301\u3002\u5728\u4e0e\u8bfb\u8005\u4ea4\u6d41\u671f\u95f4\uff0c\u6211\u6700\u5e38\u88ab\u95ee\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u7b97\u6cd5\u201d\u3002\u9010\u6e10\u5730\uff0c\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u4ea7\u751f\u4e86\u6d53\u539a\u7684\u5174\u8da3\u3002

\u4e24\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u9898\u4f3c\u4e4e\u662f\u6700\u53d7\u6b22\u8fce\u7684\u65b9\u6cd5\uff0c\u7b80\u5355\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u4eba\u80fd\u591f\u987a\u5229\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u4eba\u6765\u8bf4\uff0c\u6bd5\u4e1a\u8bba\u6587\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u548c\u9762\u8bd5\u5df2\u7ecf\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u4e66\u5f80\u5f80\u53d8\u6210\u4e86\u4e00\u9879\u8270\u5de8\u7684\u6311\u6218\u3002

\u5982\u679c\u4f60\u4e5f\u9762\u4e34\u7c7b\u4f3c\u7684\u56f0\u6270\uff0c\u90a3\u4e48\u5f88\u5e78\u8fd0\u8fd9\u672c\u4e66\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u4f18\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u672c\u4e66\u867d\u7136\u4e0d\u8db3\u4ee5\u8ba9\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u4f1a\u5f15\u5bfc\u4f60\u63a2\u7d22\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u201c\u77e5\u8bc6\u5730\u56fe\u201d\uff0c\u5e26\u4f60\u4e86\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72b6\u3001\u5927\u5c0f\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8ba9\u4f60\u638c\u63e1\u5404\u79cd\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u8fd9\u4e9b\u672c\u9886\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

\u6211\u6df1\u6df1\u8d5e\u540c\u8d39\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u4ece\u8fd9\u4e2a\u610f\u4e49\u4e0a\u770b\uff0c\u8fd9\u672c\u4e66\u5e76\u975e\u5b8c\u5168\u201c\u514d\u8d39\u201d\u3002\u4e3a\u4e86\u4e0d\u8f9c\u8d1f\u4f60\u4e3a\u672c\u4e66\u6240\u4ed8\u51fa\u7684\u5b9d\u8d35\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u4f1a\u7aed\u5c3d\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u6765\u5b8c\u6210\u672c\u4e66\u7684\u521b\u4f5c\u3002

\u672c\u4eba\u81ea\u77e5\u5b66\u758f\u624d\u6d45\uff0c\u4e66\u4e2d\u5185\u5bb9\u867d\u7136\u5df2\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8bb8\u591a\u9519\u8bef\uff0c\u6073\u8bf7\u5404\u4f4d\u8001\u5e08\u548c\u540c\u5b66\u6279\u8bc4\u6307\u6b63\u3002

Hello\uff0c\u7b97\u6cd5\uff01

\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u7ed9\u4e16\u754c\u5e26\u6765\u4e86\u5de8\u5927\u53d8\u9769\uff0c\u5b83\u51ed\u501f\u9ad8\u901f\u7684\u8ba1\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7f16\u7a0b\u6027\uff0c\u6210\u4e3a\u4e86\u6267\u884c\u7b97\u6cd5\u4e0e\u5904\u7406\u6570\u636e\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u65e0\u8bba\u662f\u7535\u5b50\u6e38\u620f\u7684\u903c\u771f\u753b\u9762\u3001\u81ea\u52a8\u9a7e\u9a76\u7684\u667a\u80fd\u51b3\u7b56\uff0c\u8fd8\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4ea4\u4e92\uff0c\u8fd9\u4e9b\u5e94\u7528\u90fd\u662f\u7b97\u6cd5\u5728\u8ba1\u7b97\u673a\u4e0a\u7684\u7cbe\u5999\u6f14\u7ece\u3002

\u4e8b\u5b9e\u4e0a\uff0c\u5728\u8ba1\u7b97\u673a\u95ee\u4e16\u4e4b\u524d\uff0c\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u5c31\u5df2\u7ecf\u5b58\u5728\u4e8e\u4e16\u754c\u7684\u5404\u4e2a\u89d2\u843d\u3002\u65e9\u671f\u7684\u7b97\u6cd5\u76f8\u5bf9\u7b80\u5355\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8ba1\u6570\u65b9\u6cd5\u548c\u5de5\u5177\u5236\u4f5c\u6b65\u9aa4\u7b49\u3002\u968f\u7740\u6587\u660e\u7684\u8fdb\u6b65\uff0c\u7b97\u6cd5\u9010\u6e10\u53d8\u5f97\u66f4\u52a0\u7cbe\u7ec6\u548c\u590d\u6742\u3002\u4ece\u5de7\u593a\u5929\u5de5\u7684\u5320\u4eba\u6280\u827a\u3001\u5230\u89e3\u653e\u751f\u4ea7\u529b\u7684\u5de5\u4e1a\u4ea7\u54c1\u3001\u518d\u5230\u5b87\u5b99\u8fd0\u884c\u7684\u79d1\u5b66\u89c4\u5f8b\uff0c\u51e0\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u60ca\u53f9\u7684\u4e8b\u7269\u80cc\u540e\uff0c\u90fd\u9690\u85cf\u7740\u7cbe\u5999\u7684\u7b97\u6cd5\u601d\u60f3\u3002

\u540c\u6837\uff0c\u6570\u636e\u7ed3\u6784\u65e0\u5904\u4e0d\u5728\uff1a\u5927\u5230\u793e\u4f1a\u7f51\u7edc\uff0c\u5c0f\u5230\u5730\u94c1\u7ebf\u8def\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u5efa\u6a21\u4e3a\u201c\u56fe\u201d\uff1b\u5927\u5230\u4e00\u4e2a\u56fd\u5bb6\uff0c\u5c0f\u5230\u4e00\u4e2a\u5bb6\u5ead\uff0c\u793e\u4f1a\u7684\u4e3b\u8981\u7ec4\u7ec7\u5f62\u5f0f\u5448\u73b0\u51fa\u201c\u6811\u201d\u7684\u7279\u5f81\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u6808\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u540e\u624d\u80fd\u8131\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5219\u5982\u540c\u201c\u961f\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u4e2a\u201c\u54c8\u5e0c\u8868\u201d\uff0c\u80fd\u591f\u5feb\u901f\u67e5\u627e\u76ee\u6807\u8bcd\u6761\u3002

\u672c\u4e66\u65e8\u5728\u901a\u8fc7\u6e05\u6670\u6613\u61c2\u7684\u52a8\u753b\u56fe\u89e3\u548c\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u4f7f\u8bfb\u8005\u7406\u89e3\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u6765\u5b9e\u73b0\u5b83\u4eec\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u672c\u4e66\u81f4\u529b\u4e8e\u63ed\u793a\u7b97\u6cd5\u5728\u590d\u6742\u4e16\u754c\u4e2d\u7684\u751f\u52a8\u4f53\u73b0\uff0c\u5c55\u73b0\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8bc6\u7b97\u6cd5","text":"

Abstract

\u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u4e0e\u6570\u636e\u4ea4\u7ec7\u5728\u4e00\u8d77\uff0c\u88d9\u6446\u4e0a\u98d8\u626c\u7740\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

\u5979\u9080\u8bf7\u4f60\u5171\u821e\uff0c\u8bf7\u7d27\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6ee1\u903b\u8f91\u4e0e\u7f8e\u611f\u7684\u7b97\u6cd5\u4e16\u754c\u3002

"},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728
  • 1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48
  • 1.3 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728","text":"

\u5f53\u6211\u4eec\u542c\u5230\u201c\u7b97\u6cd5\u201d\u8fd9\u4e2a\u8bcd\u65f6\uff0c\u5f88\u81ea\u7136\u5730\u4f1a\u60f3\u5230\u6570\u5b66\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7b97\u6cd5\u5e76\u4e0d\u6d89\u53ca\u590d\u6742\u6570\u5b66\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8d56\u57fa\u672c\u903b\u8f91\uff0c\u8fd9\u4e9b\u903b\u8f91\u5728\u6211\u4eec\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u5904\u5904\u53ef\u89c1\u3002

\u5728\u6b63\u5f0f\u63a2\u8ba8\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u4e2a\u6709\u8da3\u7684\u4e8b\u5b9e\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u5b83\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c06\u4e3e\u51e0\u4e2a\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

\u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u91cc\uff0c\u6bcf\u4e2a\u6c49\u5b57\u90fd\u5bf9\u5e94\u4e00\u4e2a\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\u7684\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2a\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u4f1a\u6309\u7167\u56fe 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002

  1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff0c\u5047\u8bbe\u9996\u5b57\u6bcd\u4e3a \\(m\\) \u3002
  2. \u7531\u4e8e\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u4e8e \\(m\\) \u4e4b\u540e\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u627e\u8303\u56f4\u7f29\u5c0f\u5230\u540e\u534a\u90e8\u5206\u3002
  3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1. \u548c \u6b65\u9aa4 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
<1><2><3><4><5>

\u56fe 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9aa4

\u67e5\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u7b97\u6cd5\u3002\u4ece\u6570\u636e\u7ed3\u6784\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b57\u5178\u89c6\u4e3a\u4e00\u4e2a\u5df2\u6392\u5e8f\u7684\u201c\u6570\u7ec4\u201d\uff1b\u4ece\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u67e5\u627e\u201d\u3002

\u4f8b\u4e8c\uff1a\u6574\u7406\u6251\u514b\u3002\u6211\u4eec\u5728\u6253\u724c\u65f6\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u6251\u514b\u724c\uff0c\u4f7f\u5176\u4ece\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5b9e\u73b0\u6d41\u7a0b\u5982\u56fe 1-2 \u6240\u793a\u3002

  1. \u5c06\u6251\u514b\u724c\u5212\u5206\u4e3a\u201c\u6709\u5e8f\u201d\u548c\u201c\u65e0\u5e8f\u201d\u4e24\u90e8\u5206\uff0c\u5e76\u5047\u8bbe\u521d\u59cb\u72b6\u6001\u4e0b\u6700\u5de6 1 \u5f20\u6251\u514b\u724c\u5df2\u7ecf\u6709\u5e8f\u3002
  2. \u5728\u65e0\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f20\u6251\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\uff1b\u5b8c\u6210\u540e\u6700\u5de6 2 \u5f20\u6251\u514b\u5df2\u7ecf\u6709\u5e8f\u3002
  3. \u4e0d\u65ad\u5faa\u73af\u6b65\u9aa4 2. \uff0c\u6bcf\u4e00\u8f6e\u5c06\u4e00\u5f20\u6251\u514b\u724c\u4ece\u65e0\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u6251\u514b\u724c\u90fd\u6709\u5e8f\u3002

\u56fe 1-2 \u00a0 \u6251\u514b\u6392\u5e8f\u6b65\u9aa4

\u4e0a\u8ff0\u6574\u7406\u6251\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u5b83\u5728\u5904\u7406\u5c0f\u578b\u6570\u636e\u96c6\u65f6\u975e\u5e38\u9ad8\u6548\u3002\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u7684\u6392\u5e8f\u5e93\u51fd\u6570\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

\u4f8b\u4e09\uff1a\u8d27\u5e01\u627e\u96f6\u3002\u5047\u8bbe\u6211\u4eec\u5728\u8d85\u5e02\u8d2d\u4e70\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7ed9\u4e86\u6536\u94f6\u5458 \\(100\\) \u5143\uff0c\u5219\u6536\u94f6\u5458\u9700\u8981\u627e\u6211\u4eec \\(31\\) \u5143\u3002\u4ed6\u4f1a\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u56fe 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

  1. \u53ef\u9009\u9879\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8d27\u5e01\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
  2. \u4ece\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u4f59 \\(31 - 20 = 11\\) \u5143\u3002
  3. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u4f59 \\(11 - 10 = 1\\) \u5143\u3002
  4. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u4f59 \\(1 - 1 = 0\\) \u5143\u3002
  5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u4e3a \\(20 + 10 + 1 = 31\\) \u5143\u3002

\u56fe 1-3 \u00a0 \u8d27\u5e01\u627e\u96f6\u8fc7\u7a0b

\u5728\u4ee5\u4e0a\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\uff08\u5c3d\u53ef\u80fd\u7528\u5927\u9762\u989d\u7684\u8d27\u5e01\uff09\uff0c\u6700\u7ec8\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u8d2a\u5fc3\u201d\u7b97\u6cd5\u3002

\u5c0f\u5230\u70f9\u996a\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u9645\u822a\u884c\uff0c\u51e0\u4e4e\u6240\u6709\u95ee\u9898\u7684\u89e3\u51b3\u90fd\u79bb\u4e0d\u5f00\u7b97\u6cd5\u3002\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u4f7f\u5f97\u6211\u4eec\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u5c06\u6570\u636e\u7ed3\u6784\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\uff0c\u540c\u65f6\u7f16\u5199\u4ee3\u7801\u8c03\u7528 CPU \u548c GPU \u6267\u884c\u7b97\u6cd5\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u95ee\u9898\u8f6c\u79fb\u5230\u8ba1\u7b97\u673a\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u51b3\u5404\u79cd\u590d\u6742\u95ee\u9898\u3002

Tip

\u5982\u679c\u4f60\u5bf9\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u3001\u6570\u7ec4\u548c\u4e8c\u5206\u67e5\u627e\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8bf7\u7ee7\u7eed\u5f80\u4e0b\u9605\u8bfb\uff0c\u672c\u4e66\u5c06\u5f15\u5bfc\u4f60\u8fc8\u5165\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u77e5\u8bc6\u6bbf\u5802\u3002

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7ed3","text":"
  • \u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u65e0\u5904\u4e0d\u5728\uff0c\u5e76\u4e0d\u662f\u9065\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8bc6\u3002\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
  • \u67e5\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\u3002
  • \u6574\u7406\u6251\u514b\u7684\u8fc7\u7a0b\u4e0e\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u975e\u5e38\u7c7b\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u9002\u5408\u6392\u5e8f\u5c0f\u578b\u6570\u636e\u96c6\u3002
  • \u8d27\u5e01\u627e\u96f6\u7684\u6b65\u9aa4\u672c\u8d28\u4e0a\u662f\u8d2a\u5fc3\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\u3002
  • \u7b97\u6cd5\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u800c\u6570\u636e\u7ed3\u6784\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002
  • \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7d27\u5bc6\u76f8\u8fde\u3002\u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002
  • \u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728\uff0c\u79ef\u6728\u4ee3\u8868\u6570\u636e\uff0c\u79ef\u6728\u7684\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u7b49\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\u3002
"},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

Q\uff1a\u4f5c\u4e3a\u4e00\u540d\u7a0b\u5e8f\u5458\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u4ece\u672a\u7528\u7b97\u6cd5\u89e3\u51b3\u8fc7\u95ee\u9898\uff0c\u5e38\u7528\u7b97\u6cd5\u90fd\u88ab\u7f16\u7a0b\u8bed\u8a00\u5c01\u88c5\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u8fd9\u662f\u5426\u610f\u5473\u7740\u6211\u4eec\u5de5\u4f5c\u4e2d\u7684\u95ee\u9898\u8fd8\u6ca1\u6709\u5230\u8fbe\u9700\u8981\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

\u5982\u679c\u628a\u5177\u4f53\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8bdd\uff0c\u90a3\u4e48\u57fa\u7840\u79d1\u76ee\u5e94\u8be5\u66f4\u50cf\u662f\u201c\u5185\u529f\u201d\u3002

\u6211\u8ba4\u4e3a\u5b66\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u7840\u79d1\u76ee\uff09\u7684\u610f\u4e49\u4e0d\u662f\u5728\u4e8e\u5728\u5de5\u4f5c\u4e2d\u4ece\u96f6\u5b9e\u73b0\u5b83\uff0c\u800c\u662f\u57fa\u4e8e\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5728\u89e3\u51b3\u95ee\u9898\u65f6\u80fd\u591f\u4f5c\u51fa\u4e13\u4e1a\u7684\u53cd\u5e94\u548c\u5224\u65ad\uff0c\u4ece\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u4f53\u8d28\u91cf\u3002\u4e3e\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff0c\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u5185\u7f6e\u4e86\u6392\u5e8f\u51fd\u6570\uff1a

  • \u5982\u679c\u6211\u4eec\u6ca1\u6709\u5b66\u8fc7\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff0c\u90a3\u4e48\u7ed9\u5b9a\u4efb\u4f55\u6570\u636e\uff0c\u6211\u4eec\u53ef\u80fd\u90fd\u585e\u7ed9\u8fd9\u4e2a\u6392\u5e8f\u51fd\u6570\u53bb\u505a\u4e86\u3002\u8fd0\u884c\u987a\u7545\u3001\u6027\u80fd\u4e0d\u9519\uff0c\u770b\u4e0a\u53bb\u5e76\u6ca1\u6709\u4ec0\u4e48\u95ee\u9898\u3002
  • \u4f46\u5982\u679c\u5b66\u8fc7\u7b97\u6cd5\uff0c\u6211\u4eec\u5c31\u4f1a\u77e5\u9053\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7ed9\u5b9a\u7684\u6570\u636e\u662f\u56fa\u5b9a\u4f4d\u6570\u7684\u6574\u6570\uff08\u4f8b\u5982\u5b66\u53f7\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6570\u6392\u5e8f\u201d\u6765\u505a\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4e3a \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u4e3a\u4f4d\u6570\u3002\u5f53\u6570\u636e\u4f53\u91cf\u5f88\u5927\u65f6\uff0c\u8282\u7701\u51fa\u6765\u7684\u8fd0\u884c\u65f6\u95f4\u5c31\u80fd\u521b\u9020\u8f83\u5927\u4ef7\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u4f53\u9a8c\u53d8\u597d\u7b49\uff09\u3002

\u5728\u5de5\u7a0b\u9886\u57df\u4e2d\uff0c\u5927\u91cf\u95ee\u9898\u662f\u96be\u4ee5\u8fbe\u5230\u6700\u4f18\u89e3\u7684\uff0c\u8bb8\u591a\u95ee\u9898\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u51b3\u4e86\u3002\u95ee\u9898\u7684\u96be\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u51b3\u4e8e\u95ee\u9898\u672c\u8eab\u7684\u6027\u8d28\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u51b3\u4e8e\u89c2\u6d4b\u95ee\u9898\u7684\u4eba\u7684\u77e5\u8bc6\u50a8\u5907\u3002\u4eba\u7684\u77e5\u8bc6\u8d8a\u5b8c\u5907\u3001\u7ecf\u9a8c\u8d8a\u591a\uff0c\u5206\u6790\u95ee\u9898\u5c31\u4f1a\u8d8a\u6df1\u5165\uff0c\u95ee\u9898\u5c31\u80fd\u88ab\u89e3\u51b3\u5f97\u66f4\u4f18\u96c5\u3002

"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u7b97\u6cd5\u5b9a\u4e49","text":"

\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u591f\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u5b8c\u6210\u3002
  • \u5404\u6b65\u9aa4\u90fd\u6709\u786e\u5b9a\u7684\u542b\u4e49\uff0c\u5728\u76f8\u540c\u7684\u8f93\u5165\u548c\u8fd0\u884c\u6761\u4ef6\u4e0b\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

\u6570\u636e\u7ed3\u6784\uff08data structure\uff09\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8bbe\u8ba1\u76ee\u6807\u3002

  • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u5c11\uff0c\u4ee5\u8282\u7701\u8ba1\u7b97\u673a\u5185\u5b58\u3002
  • \u6570\u636e\u64cd\u4f5c\u5c3d\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u76d6\u6570\u636e\u8bbf\u95ee\u3001\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66f4\u65b0\u7b49\u3002
  • \u63d0\u4f9b\u7b80\u6d01\u7684\u6570\u636e\u8868\u793a\u548c\u903b\u8f91\u4fe1\u606f\uff0c\u4ee5\u4fbf\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

\u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4e0b\u9762\u4e3e\u4e24\u4e2a\u4f8b\u5b50\u3002

  • \u94fe\u8868\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5728\u6570\u636e\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u727a\u7272\u4e86\u6570\u636e\u8bbf\u95ee\u901f\u5ea6\u3002
  • \u56fe\u76f8\u8f83\u4e8e\u94fe\u8868\uff0c\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u903b\u8f91\u4fe1\u606f\uff0c\u4f46\u9700\u8981\u5360\u7528\u66f4\u5927\u7684\u5185\u5b58\u7a7a\u95f4\u3002
"},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb","text":"

\u5982\u56fe 1-4 \u6240\u793a\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u5173\u3001\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\u4ee5\u4e0b\u4e09\u4e2a\u65b9\u9762\u3002

  • \u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u6570\u636e\u7ed3\u6784\u4e3a\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7ed3\u6784\u5316\u5b58\u50a8\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
  • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
  • \u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u4f46\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9009\u62e9\u5408\u9002\u7684\u6570\u636e\u7ed3\u6784\u662f\u5173\u952e\u3002

\u56fe 1-4 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72b9\u5982\u56fe 1-5 \u6240\u793a\u7684\u62fc\u88c5\u79ef\u6728\u3002\u4e00\u5957\u79ef\u6728\uff0c\u9664\u4e86\u5305\u542b\u8bb8\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u8fd8\u9644\u6709\u8be6\u7ec6\u7684\u7ec4\u88c5\u8bf4\u660e\u4e66\u3002\u6211\u4eec\u6309\u7167\u8bf4\u660e\u4e66\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7ec4\u88c5\u51fa\u7cbe\u7f8e\u7684\u79ef\u6728\u6a21\u578b\u3002

\u56fe 1-5 \u00a0 \u62fc\u88c5\u79ef\u6728

\u4e24\u8005\u7684\u8be6\u7ec6\u5bf9\u5e94\u5173\u7cfb\u5982\u8868 1-1 \u6240\u793a\u3002

\u8868 1-1 \u00a0 \u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u62fc\u88c5\u79ef\u6728 \u8f93\u5165\u6570\u636e \u672a\u62fc\u88c5\u7684\u79ef\u6728 \u6570\u636e\u7ed3\u6784 \u79ef\u6728\u7ec4\u7ec7\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72b6\u3001\u5927\u5c0f\u3001\u8fde\u63a5\u65b9\u5f0f\u7b49 \u7b97\u6cd5 \u628a\u79ef\u6728\u62fc\u6210\u76ee\u6807\u5f62\u6001\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9aa4 \u8f93\u51fa\u6570\u636e \u79ef\u6728\u6a21\u578b

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u662f\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\u57fa\u4e8e\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u5b9e\u73b0\u3002

\u7ea6\u5b9a\u4fd7\u6210\u7684\u7b80\u79f0

\u5728\u5b9e\u9645\u8ba8\u8bba\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u201c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u201d\u7b80\u79f0\u4e3a\u201c\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u67e5\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

"},{"location":"chapter_paperbook/","title":"\u7eb8\u8d28\u4e66","text":"

\u7ecf\u8fc7\u957f\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u300aHello \u7b97\u6cd5\u300b\u7eb8\u8d28\u4e66\u7ec8\u4e8e\u53d1\u5e03\u4e86\uff01\u6b64\u65f6\u7684\u5fc3\u60c5\u53ef\u4ee5\u7528\u4e00\u53e5\u8bd7\u6765\u5f62\u5bb9\uff1a

\u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u3002

\u4ee5\u4e0b\u89c6\u9891\u5c55\u793a\u4e86\u7eb8\u8d28\u4e66\uff0c\u5e76\u4e14\u5305\u542b\u6211\u7684\u4e00\u4e9b\u601d\u8003\uff1a

  • \u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u6027\u3002
  • \u4e3a\u4ec0\u4e48\u5728\u7eb8\u8d28\u4e66\u4e2d\u9009\u62e9 Python\u3002
  • \u5bf9\u77e5\u8bc6\u5206\u4eab\u7684\u7406\u89e3\u3002

\u65b0\u4eba UP \u4e3b\uff0c\u8bf7\u591a\u591a\u5173\u7167\u3001\u4e00\u952e\u4e09\u8fde\uff5e\u8c22\u8c22\uff01

\u9644\u7eb8\u8d28\u4e66\u5feb\u7167\uff1a

"},{"location":"chapter_paperbook/#_2","title":"\u4f18\u52bf\u4e0e\u4e0d\u8db3","text":"

\u603b\u7ed3\u4e00\u4e0b\u7eb8\u8d28\u4e66\u53ef\u80fd\u4f1a\u7ed9\u5927\u5bb6\u5e26\u6765\u60ca\u559c\u7684\u5730\u65b9\uff1a

  • \u91c7\u7528\u5168\u5f69\u5370\u5237\uff0c\u80fd\u591f\u539f\u6c41\u539f\u5473\u5730\u53d1\u6325\u51fa\u672c\u4e66\u201c\u52a8\u753b\u56fe\u89e3\u201d\u7684\u4f18\u52bf\u3002
  • \u8003\u7a76\u7eb8\u5f20\u6750\u8d28\uff0c\u65e2\u4fdd\u8bc1\u8272\u5f69\u9ad8\u5ea6\u8fd8\u539f\uff0c\u4e5f\u4fdd\u7559\u7eb8\u8d28\u4e66\u7279\u6709\u7684\u8d28\u611f\u3002
  • \u7eb8\u8d28\u7248\u6bd4\u7f51\u9875\u7248\u7684\u683c\u5f0f\u66f4\u52a0\u89c4\u8303\uff0c\u4f8b\u5982\u56fe\u4e2d\u7684\u516c\u5f0f\u4f7f\u7528\u659c\u4f53\u3002
  • \u5728\u4e0d\u63d0\u5347\u5b9a\u4ef7\u7684\u524d\u63d0\u4e0b\uff0c\u9644\u8d60\u601d\u7ef4\u5bfc\u56fe\u6298\u9875\u3001\u4e66\u7b7e\u3002
  • \u7eb8\u8d28\u4e66\u3001\u7f51\u9875\u7248\u3001PDF \u7248\u5185\u5bb9\u540c\u6b65\uff0c\u968f\u610f\u5207\u6362\u9605\u8bfb\u3002

Tip

\u7531\u4e8e\u7eb8\u8d28\u4e66\u548c\u7f51\u9875\u7248\u7684\u540c\u6b65\u96be\u5ea6\u8f83\u5927\uff0c\u56e0\u6b64\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u7ec6\u8282\u4e0a\u7684\u4e0d\u540c\uff0c\u8bf7\u60a8\u89c1\u8c05\uff01

\u5f53\u7136\uff0c\u7eb8\u8d28\u4e66\u4e5f\u6709\u4e00\u4e9b\u503c\u5f97\u5927\u5bb6\u5165\u624b\u524d\u8003\u8651\u7684\u5730\u65b9\uff1a

  • \u4f7f\u7528 Python \u8bed\u8a00\uff0c\u53ef\u80fd\u4e0d\u5339\u914d\u4f60\u7684\u4e3b\u8bed\u8a00\uff08\u53ef\u4ee5\u628a Python \u770b\u4f5c\u4f2a\u4ee3\u7801\uff0c\u91cd\u5728\u7406\u89e3\u601d\u8def\uff09\u3002
  • \u5168\u5f69\u5370\u5237\u867d\u7136\u5927\u5e45\u63d0\u5347\u4e86\u56fe\u89e3\u548c\u4ee3\u7801\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u4f46\u4ef7\u683c\u4f1a\u6bd4\u9ed1\u767d\u5370\u5237\u9ad8\u4e00\u4e9b\u3002

Tip

\u201c\u5370\u5237\u8d28\u91cf\u201d\u548c\u201c\u4ef7\u683c\u201d\u5c31\u50cf\u7b97\u6cd5\u4e2d\u7684\u201c\u65f6\u95f4\u6548\u7387\u201d\u548c\u201c\u7a7a\u95f4\u6548\u7387\u201d\uff0c\u96be\u4ee5\u4e24\u5168\u3002\u800c\u6211\u8ba4\u4e3a\uff0c\u201c\u5370\u5237\u8d28\u91cf\u201d\u5bf9\u5e94\u7684\u662f\u201c\u65f6\u95f4\u6548\u7387\u201d\uff0c\u66f4\u5e94\u8be5\u88ab\u6ce8\u91cd\u3002

"},{"location":"chapter_paperbook/#_3","title":"\u8d2d\u4e70\u94fe\u63a5","text":"

\u5982\u679c\u4f60\u5bf9\u7eb8\u8d28\u4e66\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8003\u8651\u5165\u624b\u4e00\u672c\u3002\u6211\u4eec\u4e3a\u5927\u5bb6\u4e89\u53d6\u5230\u4e86\u65b0\u4e66 5 \u6298\u4f18\u60e0\uff0c\u8bf7\u89c1\u6b64\u94fe\u63a5\u6216\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff1a

"},{"location":"chapter_paperbook/#_4","title":"\u5c3e\u8bb0","text":"

\u8d77\u521d\uff0c\u6211\u4f4e\u4f30\u4e86\u7eb8\u8d28\u4e66\u51fa\u7248\u7684\u5de5\u4f5c\u91cf\uff0c\u4ee5\u4e3a\u53ea\u8981\u7ef4\u62a4\u597d\u4e86\u5f00\u6e90\u9879\u76ee\uff0c\u7eb8\u8d28\u7248\u5c31\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e9b\u81ea\u52a8\u5316\u624b\u6bb5\u751f\u6210\u51fa\u6765\u3002\u5b9e\u8df5\u8bc1\u660e\uff0c\u7eb8\u8d28\u4e66\u7684\u751f\u4ea7\u6d41\u7a0b\u4e0e\u5f00\u6e90\u9879\u76ee\u7684\u66f4\u65b0\u673a\u5236\u5b58\u5728\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u4e24\u8005\u4e4b\u95f4\u7684\u8f6c\u5316\u9700\u8981\u505a\u8bb8\u591a\u989d\u5916\u5de5\u4f5c\u3002

\u4e00\u672c\u4e66\u7684\u521d\u7a3f\u4e0e\u8fbe\u5230\u51fa\u7248\u6807\u51c6\u7684\u5b9a\u7a3f\u4e4b\u95f4\u4ecd\u6709\u8f83\u957f\u8ddd\u79bb\uff0c\u9700\u8981\u51fa\u7248\u793e\uff08\u7b56\u5212\u3001\u7f16\u8f91\u3001\u8bbe\u8ba1\u3001\u5e02\u573a\u7b49\uff09\u4e0e\u4f5c\u8005\u7684\u901a\u529b\u5408\u4f5c\u3001\u957f\u671f\u96d5\u7422\u3002\u5728\u6b64\u611f\u8c22\u56fe\u7075\u7b56\u5212\u7f16\u8f91\u738b\u519b\u82b1\u3001\u4ee5\u53ca\u4eba\u6c11\u90ae\u7535\u51fa\u7248\u793e\u548c\u56fe\u7075\u793e\u533a\u6bcf\u4f4d\u53c2\u4e0e\u672c\u4e66\u51fa\u7248\u6d41\u7a0b\u7684\u5de5\u4f5c\u4eba\u5458\uff01

\u5e0c\u671b\u8fd9\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

Abstract

\u7b97\u6cd5\u72b9\u5982\u7f8e\u5999\u7684\u4ea4\u54cd\u4e50\uff0c\u6bcf\u4e00\u884c\u4ee3\u7801\u90fd\u50cf\u97f5\u5f8b\u822c\u6d41\u6dcc\u3002

\u613f\u8fd9\u672c\u4e66\u5728\u4f60\u7684\u8111\u6d77\u4e2d\u8f7b\u8f7b\u54cd\u8d77\uff0c\u7559\u4e0b\u72ec\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

"},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 0.1 \u00a0 \u5173\u4e8e\u672c\u4e66
  • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66
  • 0.3 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u5173\u4e8e\u672c\u4e66","text":"

\u672c\u9879\u76ee\u65e8\u5728\u521b\u5efa\u4e00\u672c\u5f00\u6e90\u3001\u514d\u8d39\u3001\u5bf9\u65b0\u624b\u53cb\u597d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u6559\u7a0b\u3002

  • \u5168\u4e66\u91c7\u7528\u52a8\u753b\u56fe\u89e3\uff0c\u7ed3\u6784\u5316\u5730\u8bb2\u89e3\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u5185\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u3002
  • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8bed\u8a00\u3002
  • \u9f13\u52b1\u8bfb\u8005\u5728\u7ebf\u4e0a\u7ae0\u8282\u8bc4\u8bba\u533a\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u8fdb\u6b65\uff0c\u63d0\u95ee\u4e0e\u8bc4\u8bba\u901a\u5e38\u53ef\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d\u3002
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

\u82e5\u4f60\u662f\u7b97\u6cd5\u521d\u5b66\u8005\uff0c\u4ece\u672a\u63a5\u89e6\u8fc7\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7ecf\u6709\u4e00\u4e9b\u5237\u9898\u7ecf\u9a8c\uff0c\u5bf9\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8ba4\u8bc6\uff0c\u5728\u4f1a\u4e0e\u4e0d\u4f1a\u4e4b\u95f4\u53cd\u590d\u6a2a\u8df3\uff0c\u90a3\u4e48\u672c\u4e66\u6b63\u662f\u4e3a\u4f60\u91cf\u8eab\u5b9a\u5236\u7684\uff01

\u5982\u679c\u4f60\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u7684\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u4f60\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

\u82e5\u4f60\u662f\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u4f60\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

\u524d\u7f6e\u6761\u4ef6

\u4f60\u9700\u8981\u81f3\u5c11\u5177\u5907\u4efb\u4e00\u8bed\u8a00\u7684\u7f16\u7a0b\u57fa\u7840\uff0c\u80fd\u591f\u9605\u8bfb\u548c\u7f16\u5199\u7b80\u5355\u4ee3\u7801\u3002

"},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5185\u5bb9\u7ed3\u6784","text":"

\u672c\u4e66\u7684\u4e3b\u8981\u5185\u5bb9\u5982\u56fe 0-1 \u6240\u793a\u3002

  • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u4e0e\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
  • \u6570\u636e\u7ed3\u6784\uff1a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u5178\u578b\u5e94\u7528\u3001\u5b9e\u73b0\u65b9\u6cd5\u7b49\u3002
  • \u7b97\u6cd5\uff1a\u641c\u7d22\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u6548\u7387\u3001\u5e94\u7528\u573a\u666f\u3001\u89e3\u9898\u6b65\u9aa4\u548c\u793a\u4f8b\u95ee\u9898\u7b49\u3002

\u56fe 0-1 \u00a0 \u672c\u4e66\u4e3b\u8981\u5185\u5bb9

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8c22","text":"

\u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u5b8c\u5584\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

\u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

\u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\u3002

  • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u7545\u8c08\u4e2d\u4f60\u9f13\u52b1\u6211\u201c\u5feb\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\uff1b
  • \u611f\u8c22\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u4e3a\u672c\u4e66\u7684\u9996\u4f4d\u8bfb\u8005\uff0c\u4ece\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8bb8\u591a\u5b9d\u8d35\u5efa\u8bae\uff0c\u4f7f\u5f97\u672c\u4e66\u66f4\u9002\u5408\u65b0\u624b\u9605\u8bfb\uff1b
  • \u611f\u8c22\u817e\u5b9d\u3001\u7426\u5b9d\u3001\u98de\u5b9d\u4e3a\u672c\u4e66\u8d77\u4e86\u4e00\u4e2a\u5bcc\u6709\u521b\u610f\u7684\u540d\u5b57\uff0c\u5524\u8d77\u5927\u5bb6\u5199\u4e0b\u7b2c\u4e00\u884c\u4ee3\u7801\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u5fc6\uff1b
  • \u611f\u8c22\u6821\u94e8\u5728\u77e5\u8bc6\u4ea7\u6743\u65b9\u9762\u63d0\u4f9b\u7684\u4e13\u4e1a\u5e2e\u52a9\uff0c\u8fd9\u5bf9\u672c\u5f00\u6e90\u4e66\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
  • \u611f\u8c22\u82cf\u6f7c\u4e3a\u672c\u4e66\u8bbe\u8ba1\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u5e76\u5728\u6211\u7684\u5f3a\u8feb\u75c7\u7684\u9a71\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
  • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u4ed6\u5f00\u53d1\u7684\u5f00\u6e90\u6587\u6863\u4e3b\u9898 Material-for-MkDocs \u3002

\u5728\u5199\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u9605\u8bfb\u4e86\u8bb8\u591a\u5173\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u8fd9\u4e9b\u4f5c\u54c1\u4e3a\u672c\u4e66\u63d0\u4f9b\u4e86\u4f18\u79c0\u7684\u8303\u672c\uff0c\u786e\u4fdd\u4e86\u672c\u4e66\u5185\u5bb9\u7684\u51c6\u786e\u6027\u4e0e\u54c1\u8d28\u3002\u5728\u6b64\u611f\u8c22\u6240\u6709\u8001\u5e08\u548c\u524d\u8f88\u7684\u6770\u51fa\u8d21\u732e\uff01

\u672c\u4e66\u5021\u5bfc\u624b\u8111\u5e76\u7528\u7684\u5b66\u4e60\u65b9\u5f0f\uff0c\u5728\u8fd9\u4e00\u70b9\u4e0a\u6211\u6df1\u53d7\u300a\u52a8\u624b\u5b66\u6df1\u5ea6\u5b66\u4e60\u300b\u7684\u542f\u53d1\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8bfb\u8005\u5f3a\u70c8\u63a8\u8350\u8fd9\u672c\u4f18\u79c0\u7684\u8457\u4f5c\u3002

\u8877\u5fc3\u611f\u8c22\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u4eec\u4e00\u76f4\u4ee5\u6765\u7684\u652f\u6301\u4e0e\u9f13\u52b1\uff0c\u8ba9\u6211\u6709\u673a\u4f1a\u505a\u8fd9\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66","text":"

Tip

\u4e3a\u4e86\u83b7\u5f97\u6700\u4f73\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u5efa\u8bae\u4f60\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98ce\u683c\u7ea6\u5b9a","text":"
  • \u6807\u9898\u540e\u6807\u6ce8 * \u7684\u662f\u9009\u8bfb\u7ae0\u8282\uff0c\u5185\u5bb9\u76f8\u5bf9\u56f0\u96be\u3002\u5982\u679c\u4f60\u7684\u65f6\u95f4\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002
  • \u4e13\u4e1a\u672f\u8bed\u4f1a\u4f7f\u7528\u9ed1\u4f53\uff08\u7eb8\u8d28\u7248\u548c PDF \u7248\uff09\u6216\u6dfb\u52a0\u4e0b\u5212\u7ebf\uff08\u7f51\u9875\u7248\uff09\uff0c\u4f8b\u5982\u6570\u7ec4\uff08array\uff09\u3002\u5efa\u8bae\u8bb0\u4f4f\u5b83\u4eec\uff0c\u4ee5\u4fbf\u9605\u8bfb\u6587\u732e\u3002
  • \u91cd\u70b9\u5185\u5bb9\u548c\u603b\u7ed3\u6027\u8bed\u53e5\u4f1a \u52a0\u7c97\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002
  • \u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528\u201c\u5f15\u53f7\u201d\u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\u3002
  • \u5f53\u6d89\u53ca\u7f16\u7a0b\u8bed\u8a00\u4e4b\u95f4\u4e0d\u4e00\u81f4\u7684\u540d\u8bcd\u65f6\uff0c\u672c\u4e66\u5747\u4ee5 Python \u4e3a\u51c6\uff0c\u4f8b\u5982\u4f7f\u7528 None \u6765\u8868\u793a\u201c\u7a7a\u201d\u3002
  • \u672c\u4e66\u90e8\u5206\u653e\u5f03\u4e86\u7f16\u7a0b\u8bed\u8a00\u7684\u6ce8\u91ca\u89c4\u8303\uff0c\u4ee5\u6362\u53d6\u66f4\u52a0\u7d27\u51d1\u7684\u5185\u5bb9\u6392\u7248\u3002\u6ce8\u91ca\u4e3b\u8981\u5206\u4e3a\u4e09\u79cd\u7c7b\u578b\uff1a\u6807\u9898\u6ce8\u91ca\u3001\u5185\u5bb9\u6ce8\u91ca\u3001\u591a\u884c\u6ce8\u91ca\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
\"\"\"\u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\"\"\"\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n\"\"\"\n\u591a\u884c\n\u6ce8\u91ca\n\"\"\"\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
### \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 ###\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n# \u591a\u884c\n# \u6ce8\u91ca\n
// \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n// \u591a\u884c\n// \u6ce8\u91ca\n
"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52a8\u753b\u56fe\u89e3\u4e2d\u9ad8\u6548\u5b66\u4e60","text":"

\u76f8\u8f83\u4e8e\u6587\u5b57\uff0c\u89c6\u9891\u548c\u56fe\u7247\u5177\u6709\u66f4\u9ad8\u7684\u4fe1\u606f\u5bc6\u5ea6\u548c\u7ed3\u6784\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u4e8e\u7406\u89e3\u3002\u5728\u672c\u4e66\u4e2d\uff0c\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u5c06\u4e3b\u8981\u901a\u8fc7\u52a8\u753b\u4ee5\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u89e3\u91ca\u4e0e\u8865\u5145\u3002

\u5982\u679c\u4f60\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u5982\u56fe 0-2 \u6240\u793a\u7684\u52a8\u753b\u56fe\u89e3\uff0c\u8bf7\u4ee5\u56fe\u4e3a\u4e3b\u3001\u4ee5\u6587\u5b57\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

\u56fe 0-2 \u00a0 \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728 GitHub \u4ed3\u5e93\u3002\u5982\u56fe 0-3 \u6240\u793a\uff0c\u6e90\u4ee3\u7801\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u4e00\u952e\u8fd0\u884c\u3002

\u5982\u679c\u65f6\u95f4\u5141\u8bb8\uff0c\u5efa\u8bae\u4f60\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u8bf7\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002

\u4e0e\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002\u52a8\u624b\u5b66\uff0c\u624d\u662f\u771f\u7684\u5b66\u3002

\u56fe 0-3 \u00a0 \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

\u8fd0\u884c\u4ee3\u7801\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\u3002

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6240\u793a\u7684\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\uff0c\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

\u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u5e93\u3002\u524d\u5f80 GitHub \u4ed3\u5e93\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\uff1a

git clone https://github.com/krahets/hello-algo.git\n

\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u56fe 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u70b9\u51fb\u201cDownload ZIP\u201d\u6309\u94ae\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

\u56fe 0-4 \u00a0 \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

\u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u56fe 0-5 \u6240\u793a\uff0c\u5bf9\u4e8e\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\u7684\u4ee3\u7801\u5757\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u5185\u627e\u5230\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u5c06\u5e2e\u52a9\u4f60\u8282\u7701\u4e0d\u5fc5\u8981\u7684\u8c03\u8bd5\u65f6\u95f4\uff0c\u8ba9\u4f60\u80fd\u591f\u4e13\u6ce8\u4e8e\u5b66\u4e60\u5185\u5bb9\u3002

\u56fe 0-5 \u00a0 \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

\u9664\u4e86\u672c\u5730\u8fd0\u884c\u4ee3\u7801\uff0c\u7f51\u9875\u7248\u8fd8\u652f\u6301 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c\uff08\u57fa\u4e8e pythontutor \u5b9e\u73b0\uff09\u3002\u5982\u56fe 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u70b9\u51fb\u4ee3\u7801\u5757\u4e0b\u65b9\u7684\u201c\u53ef\u89c6\u5316\u8fd0\u884c\u201d\u6765\u5c55\u5f00\u89c6\u56fe\uff0c\u89c2\u5bdf\u7b97\u6cd5\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201c\u5168\u5c4f\u89c2\u770b\u201d\uff0c\u4ee5\u83b7\u5f97\u66f4\u597d\u7684\u9605\u89c8\u4f53\u9a8c\u3002

\u56fe 0-6 \u00a0 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u8f7b\u6613\u8df3\u8fc7\u90a3\u4e9b\u6ca1\u5b66\u660e\u767d\u7684\u77e5\u8bc6\u70b9\u3002\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u63d0\u51fa\u4f60\u7684\u95ee\u9898\uff0c\u6211\u548c\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u56de\u590d\u3002

\u5982\u56fe 0-7 \u6240\u793a\uff0c\u7f51\u9875\u7248\u6bcf\u4e2a\u7ae0\u8282\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8bc4\u8bba\u533a\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u5173\u6ce8\u8bc4\u8bba\u533a\u7684\u5185\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\uff0c\u5206\u4eab\u4f60\u7684\u89c1\u89e3\uff0c\u5e2e\u52a9\u4ed6\u4eba\u8fdb\u6b65\u3002

\u56fe 0-7 \u00a0 \u8bc4\u8bba\u533a\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf","text":"

\u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8fc7\u7a0b\u5212\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002

  1. \u9636\u6bb5\u4e00\uff1a\u7b97\u6cd5\u5165\u95e8\u3002\u6211\u4eec\u9700\u8981\u719f\u6089\u5404\u79cd\u6570\u636e\u7ed3\u6784\u7684\u7279\u70b9\u548c\u7528\u6cd5\uff0c\u5b66\u4e60\u4e0d\u540c\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5185\u5bb9\u3002
  2. \u9636\u6bb5\u4e8c\uff1a\u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5148\u79ef\u7d2f\u81f3\u5c11 100 \u9053\u9898\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u7b97\u6cd5\u95ee\u9898\u3002\u521d\u6b21\u5237\u9898\u65f6\uff0c\u201c\u77e5\u8bc6\u9057\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u4e2a\u6311\u6218\uff0c\u4f46\u8bf7\u653e\u5fc3\uff0c\u8fd9\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u4eec\u53ef\u4ee5\u6309\u7167\u201c\u827e\u5bbe\u6d69\u65af\u9057\u5fd8\u66f2\u7ebf\u201d\u6765\u590d\u4e60\u9898\u76ee\uff0c\u901a\u5e38\u5728\u8fdb\u884c 3\uff5e5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002\u63a8\u8350\u7684\u9898\u5355\u548c\u5237\u9898\u8ba1\u5212\u8bf7\u89c1\u6b64 GitHub \u4ed3\u5e93\u3002
  3. \u9636\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5b66\u4e60\u65b9\u9762\uff0c\u6211\u4eec\u53ef\u4ee5\u9605\u8bfb\u7b97\u6cd5\u4e13\u680f\u6587\u7ae0\u3001\u89e3\u9898\u6846\u67b6\u548c\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65ad\u4e30\u5bcc\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5237\u9898\u65b9\u9762\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u91c7\u7528\u8fdb\u9636\u5237\u9898\u7b56\u7565\uff0c\u5982\u6309\u4e13\u9898\u5206\u7c7b\u3001\u4e00\u9898\u591a\u89e3\u3001\u4e00\u89e3\u591a\u9898\u7b49\uff0c\u76f8\u5173\u7684\u5237\u9898\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u4e2a\u793e\u533a\u627e\u5230\u3002

\u5982\u56fe 0-8 \u6240\u793a\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u9636\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u9636\u6bb5\u4e8c\u548c\u9636\u6bb5\u4e09\u7684\u5b66\u4e60\u3002

\u56fe 0-8 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7ed3","text":"
  • \u672c\u4e66\u7684\u4e3b\u8981\u53d7\u4f17\u662f\u7b97\u6cd5\u521d\u5b66\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u4f60\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u4e2d\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
  • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
  • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
  • \u4e66\u4e2d\u7684\u52a8\u753b\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
  • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u4ee3\u7801\u3002
  • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8bc4\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
"},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

[1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

[2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

[3] Robert Sedgewick, et al. Algorithms (4th Edition).

[4] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

[5] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[6] \u9a6c\u514b \u827e\u4f26 \u7ef4\u65af\u8457\uff0c\u9648\u8d8a\u8bd1. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5206\u6790\uff1aJava\u8bed\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

[7] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

[8] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

[9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[10] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u7d22","text":"

Abstract

\u641c\u7d22\u662f\u4e00\u573a\u672a\u77e5\u7684\u5192\u9669\uff0c\u6211\u4eec\u6216\u8bb8\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u95f4\u7684\u6bcf\u4e2a\u89d2\u843d\uff0c\u53c8\u6216\u8bb8\u53ef\u4ee5\u5feb\u901f\u9501\u5b9a\u76ee\u6807\u3002

\u5728\u8fd9\u573a\u5bfb\u89c5\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u4e2a\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

"},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 10.1 \u00a0 \u4e8c\u5206\u67e5\u627e
  • 10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9
  • 10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c
  • 10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565
  • 10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5
  • 10.6 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

\u4e8c\u5206\u67e5\u627e\uff08binary search\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u590d\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 10-1 \u6240\u793a\u3002

\u56fe 10-1 \u00a0 \u4e8c\u5206\u67e5\u627e\u793a\u4f8b\u6570\u636e

\u5982\u56fe 10-2 \u6240\u793a\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u95ed\u533a\u95f4\uff0c\u5176\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

\u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
  2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e09\u79cd\u60c5\u51b5\u3002
    1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \u3002
    2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \u3002
    3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

<1><2><3><4><5><6><7>

\u56fe 10-2 \u00a0 \u4e8c\u5206\u67e5\u627e\u6d41\u7a0b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while i <= j\n    # \u7406\u8bba\u4e0a Ruby \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n    m = (i + j) / 2   # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u5faa\u73af\u4e2d\uff0c\u533a\u95f4\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

"},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

\u9664\u4e86\u4e0a\u8ff0\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j)\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

\u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while i < j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 10-3 \u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

\u7531\u4e8e\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u901a\u8fc7\u6307\u9488 \\(i\\) \u548c\u6307\u9488 \\(j\\) \u7f29\u5c0f\u533a\u95f4\u7684\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

\u56fe 10-3 \u00a0 \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

"},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\u3002

  • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
  • \u4e8c\u5206\u67e5\u627e\u65e0\u987b\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

\u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6709\u5e8f\u6570\u636e\u3002\u82e5\u8f93\u5165\u6570\u636e\u65e0\u5e8f\uff0c\u4e3a\u4e86\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u800c\u4e13\u95e8\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u507f\u5931\u3002\u56e0\u4e3a\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u6bd4\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u90fd\u66f4\u9ad8\u3002\u5bf9\u4e8e\u9891\u7e41\u63d2\u5165\u5143\u7d20\u7684\u573a\u666f\uff0c\u4e3a\u4fdd\u6301\u6570\u7ec4\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c06\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8d35\u7684\u3002
  • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002\u4e8c\u5206\u67e5\u627e\u9700\u8981\u8df3\u8dc3\u5f0f\uff08\u975e\u8fde\u7eed\u5730\uff09\u8bbf\u95ee\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u6267\u884c\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u7684\u6548\u7387\u8f83\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5e94\u7528\u5728\u94fe\u8868\u6216\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u5c0f\u6570\u636e\u91cf\u4e0b\uff0c\u7ebf\u6027\u67e5\u627e\u6027\u80fd\u66f4\u4f73\u3002\u5728\u7ebf\u6027\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u9700 1 \u6b21\u5224\u65ad\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65ad\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u51cf\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u5f53\u6570\u636e\u91cf \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u53cd\u800c\u6bd4\u4e8c\u5206\u67e5\u627e\u66f4\u5feb\u3002
"},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u627e\u5de6\u8fb9\u754c","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

\u56de\u5fc6\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u7684\u65b9\u6cd5\uff0c\u641c\u7d22\u5b8c\u6210\u540e \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target \uff0c\u56e0\u6b64\u67e5\u627e\u63d2\u5165\u70b9\u672c\u8d28\u4e0a\u662f\u5728\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002

\u8003\u8651\u901a\u8fc7\u67e5\u627e\u63d2\u5165\u70b9\u7684\u51fd\u6570\u5b9e\u73b0\u67e5\u627e\u5de6\u8fb9\u754c\u3002\u8bf7\u6ce8\u610f\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u5bfc\u81f4\u4ee5\u4e0b\u4e24\u79cd\u7ed3\u679c\u3002

  • \u63d2\u5165\u70b9\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
  • \u5143\u7d20 nums[i] \u4e0e target \u4e0d\u76f8\u7b49\u3002

\u5f53\u9047\u5230\u4ee5\u4e0a\u4e24\u79cd\u60c5\u51b5\u65f6\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target\"\"\"\n    # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
binary_search_edge.cpp
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchLeftEdge}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

\u90a3\u4e48\u5982\u4f55\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u4ee3\u7801\uff0c\u66ff\u6362\u5728 nums[m] == target \u60c5\u51b5\u4e0b\u7684\u6307\u9488\u6536\u7f29\u64cd\u4f5c\u3002\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

\u4e0b\u9762\u6211\u4eec\u4ecb\u7ecd\u4e24\u79cd\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

"},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u590d\u7528\u67e5\u627e\u5de6\u8fb9\u754c","text":"

\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u67e5\u627e\u6700\u5de6\u5143\u7d20\u7684\u51fd\u6570\u6765\u67e5\u627e\u6700\u53f3\u5143\u7d20\uff0c\u5177\u4f53\u65b9\u6cd5\u4e3a\uff1a\u5c06\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\u3002

\u5982\u56fe 10-7 \u6240\u793a\uff0c\u67e5\u627e\u5b8c\u6210\u540e\uff0c\u6307\u9488 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

\u56fe 10-7 \u00a0 \u5c06\u67e5\u627e\u53f3\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5de6\u8fb9\u754c

\u8bf7\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u70b9\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c06\u5176\u51cf \\(1\\) \uff0c\u4ece\u800c\u83b7\u5f97 \\(j\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target\"\"\"\n    # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
binary_search_edge.cpp
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchRightEdge}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u6700\u7ec8 \\(i\\) \u548c \\(j\\) \u4f1a\u5206\u522b\u6307\u5411\u9996\u4e2a\u5927\u4e8e\u3001\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002

\u56e0\u6b64\uff0c\u5982\u56fe 10-8 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u4e8e\u67e5\u627e\u5de6\u53f3\u8fb9\u754c\u3002

  • \u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target - 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(i\\) \u3002
  • \u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target + 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(j\\) \u3002

\u56fe 10-8 \u00a0 \u5c06\u67e5\u627e\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20

\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u4e24\u70b9\u503c\u5f97\u6ce8\u610f\u3002

  • \u7ed9\u5b9a\u6570\u7ec4\u4e0d\u5305\u542b\u5c0f\u6570\uff0c\u8fd9\u610f\u5473\u7740\u6211\u4eec\u65e0\u987b\u5173\u5fc3\u5982\u4f55\u5904\u7406\u76f8\u7b49\u7684\u60c5\u51b5\u3002
  • \u56e0\u4e3a\u8be5\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6570\uff0c\u6240\u4ee5\u9700\u8981\u5c06\u51fd\u6570\u4e2d\u7684\u53d8\u91cf target \u6539\u4e3a\u6d6e\u70b9\u6570\u7c7b\u578b\uff08Python \u65e0\u987b\u6539\u52a8\uff09\u3002
"},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9","text":"

\u4e8c\u5206\u67e5\u627e\u4e0d\u4ec5\u53ef\u7528\u4e8e\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff0c\u8fd8\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u53d8\u79cd\u95ee\u9898\uff0c\u6bd4\u5982\u641c\u7d22\u76ee\u6807\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

"},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u5143\u7d20 target \uff0c\u6570\u7ec4\u4e0d\u5b58\u5728\u91cd\u590d\u5143\u7d20\u3002\u73b0\u5c06 target \u63d2\u5165\u6570\u7ec4 nums \u4e2d\uff0c\u5e76\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u6570\u7ec4\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5219\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8bf7\u8fd4\u56de\u63d2\u5165\u540e target \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u56fe 10-4 \u6240\u793a\u3002

\u56fe 10-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u793a\u4f8b\u6570\u636e

\u5982\u679c\u60f3\u590d\u7528\u4e0a\u4e00\u8282\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\uff0c\u5219\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\u3002

\u95ee\u9898\u4e00\uff1a\u5f53\u6570\u7ec4\u4e2d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u662f\u5426\u662f\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u9898\u76ee\u8981\u6c42\u5c06 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u8fb9\uff0c\u8fd9\u610f\u5473\u7740\u65b0\u63d2\u5165\u7684 target \u66ff\u6362\u4e86\u539f\u6765 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u6570\u7ec4\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u5c31\u662f\u8be5 target \u7684\u7d22\u5f15\u3002

\u95ee\u9898\u4e8c\uff1a\u5f53\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728 target \u65f6\uff0c\u63d2\u5165\u70b9\u662f\u54ea\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u8fdb\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u67e5\u627e\u8fc7\u7a0b\uff1a\u5f53 nums[m] < target \u65f6 \\(i\\) \u79fb\u52a8\uff0c\u8fd9\u610f\u5473\u7740\u6307\u9488 \\(i\\) \u5728\u5411\u5927\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u9488 \\(j\\) \u59cb\u7ec8\u5728\u5411\u5c0f\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u56e0\u6b64\u4e8c\u5206\u7ed3\u675f\u65f6\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002\u6613\u5f97\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u7d22\u5f15\u4e3a \\(i\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertionSimple}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u5728\u4e0a\u4e00\u9898\u7684\u57fa\u7840\u4e0a\uff0c\u89c4\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u5176\u4f59\u4e0d\u53d8\u3002

\u5047\u8bbe\u6570\u7ec4\u4e2d\u5b58\u5728\u591a\u4e2a target \uff0c\u5219\u666e\u901a\u4e8c\u5206\u67e5\u627e\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u5143\u7d20\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11 target\u3002

\u9898\u76ee\u8981\u6c42\u5c06\u76ee\u6807\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u8fb9\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u8651\u901a\u8fc7\u56fe 10-5 \u6240\u793a\u7684\u6b65\u9aa4\u5b9e\u73b0\u3002

  1. \u6267\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \u3002
  2. \u4ece\u7d22\u5f15 \\(k\\) \u5f00\u59cb\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u5f53\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u65f6\u8fd4\u56de\u3002

\u56fe 10-5 \u00a0 \u7ebf\u6027\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9

\u6b64\u65b9\u6cd5\u867d\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5f53\u6570\u7ec4\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u590d\u7684 target \u65f6\uff0c\u8be5\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

\u73b0\u8003\u8651\u62d3\u5c55\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002\u5982\u56fe 10-6 \u6240\u793a\uff0c\u6574\u4f53\u6d41\u7a0b\u4fdd\u6301\u4e0d\u53d8\uff0c\u6bcf\u8f6e\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u51e0\u79cd\u60c5\u51b5\u3002

  • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u7528\u666e\u901a\u4e8c\u5206\u67e5\u627e\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
  • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u5faa\u73af\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u70b9\u3002

<1><2><3><4><5><6><7><8>

\u56fe 10-6 \u00a0 \u4e8c\u5206\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9\u7684\u6b65\u9aa4

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5224\u65ad\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u4e24\u8005\u53ef\u4ee5\u5408\u5e76\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5c06\u5224\u65ad\u6761\u4ef6\u4fdd\u6301\u5c55\u5f00\uff0c\u56e0\u4e3a\u5176\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8bfb\u6027\u66f4\u597d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertion}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u672c\u8282\u7684\u4ee3\u7801\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

\u603b\u7684\u6765\u770b\uff0c\u4e8c\u5206\u67e5\u627e\u65e0\u975e\u5c31\u662f\u7ed9\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u522b\u8bbe\u5b9a\u641c\u7d22\u76ee\u6807\uff0c\u76ee\u6807\u53ef\u80fd\u662f\u4e00\u4e2a\u5177\u4f53\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u4e2a\u5143\u7d20\u8303\u56f4\uff08\u4f8b\u5982\u5c0f\u4e8e target \u7684\u5143\u7d20\uff09\u3002

\u5728\u4e0d\u65ad\u7684\u5faa\u73af\u4e8c\u5206\u4e2d\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6e10\u903c\u8fd1\u9884\u5148\u8bbe\u5b9a\u7684\u76ee\u6807\u3002\u6700\u7ec8\uff0c\u5b83\u4eec\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u8fc7\u8fb9\u754c\u540e\u505c\u6b62\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

\u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7ebf\u6027\u67e5\u627e\uff1a\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4","text":"

\u8003\u8651\u76f4\u63a5\u904d\u5386\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\u3002\u5982\u56fe 10-9 \u6240\u793a\uff0c\u6211\u4eec\u5f00\u542f\u4e00\u4e2a\u4e24\u5c42\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u5224\u65ad\u4e24\u4e2a\u6574\u6570\u7684\u548c\u662f\u5426\u4e3a target \uff0c\u82e5\u662f\uff0c\u5219\u8fd4\u56de\u5b83\u4eec\u7684\u7d22\u5f15\u3002

\u56fe 10-9 \u00a0 \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\"\"\"\n    # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u679a\u4e3e */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e ###\ndef two_sum_brute_force(nums, target)\n  # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6b64\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u975e\u5e38\u8017\u65f6\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\u56fe 10-10 \u6240\u793a\u7684\u6b65\u9aa4\u3002

  1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002
  2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\u3002
<1><2><3>

\u56fe 10-10 \u00a0 \u8f85\u52a9\u54c8\u5e0c\u8868\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\"\"\"\n    # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    dic = {}\n    # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    unordered_map<int, int> dic;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Dictionary<int, int> dic = [];\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    hashTable := map[int]int{}\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic: [Int: Int] = [:]\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m = {};\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m: Map<number, number> = new Map();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e8c\uff1a \u8f85\u52a9\u54c8\u5e0c\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  Map<int, int> dic = HashMap();\n  // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let mut dic = HashMap::new();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
two_sum.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    val dic = HashMap<Int, Int>()\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  dic = {}\n  # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u8fd0\u884c\u6548\u7387\u3002

\u7531\u4e8e\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u989d\u5916\u7684\u54c8\u5e0c\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5c3d\u7ba1\u5982\u6b64\uff0c\u8be5\u65b9\u6cd5\u7684\u6574\u4f53\u65f6\u7a7a\u6548\u7387\u66f4\u4e3a\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u9898\u7684\u6700\u4f18\u89e3\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5","text":"

\u641c\u7d22\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u4e8e\u5728\u6570\u636e\u7ed3\u6784\uff08\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u6216\u56fe\uff09\u4e2d\u641c\u7d22\u4e00\u4e2a\u6216\u4e00\u7ec4\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5143\u7d20\u3002

\u641c\u7d22\u7b97\u6cd5\u53ef\u6839\u636e\u5b9e\u73b0\u601d\u8def\u5206\u4e3a\u4ee5\u4e0b\u4e24\u7c7b\u3002

  • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
  • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

\u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u7d22","text":"

\u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u7684\u6bcf\u4e2a\u5143\u7d20\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

  • \u201c\u7ebf\u6027\u641c\u7d22\u201d\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\u7b49\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u5b83\u4ece\u6570\u636e\u7ed3\u6784\u7684\u4e00\u7aef\u5f00\u59cb\uff0c\u9010\u4e2a\u8bbf\u95ee\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u5230\u8fbe\u53e6\u4e00\u7aef\u4ecd\u6ca1\u6709\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
  • \u201c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u548c\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u662f\u56fe\u548c\u6811\u7684\u4e24\u79cd\u904d\u5386\u7b56\u7565\u3002\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\u9010\u5c42\u641c\u7d22\uff0c\u7531\u8fd1\u53ca\u8fdc\u5730\u8bbf\u95ee\u5404\u4e2a\u8282\u70b9\u3002\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\uff0c\u518d\u56de\u6eaf\u5e76\u5c1d\u8bd5\u5176\u4ed6\u8def\u5f84\uff0c\u76f4\u5230\u904d\u5386\u5b8c\u6574\u4e2a\u6570\u636e\u7ed3\u6784\u3002

\u66b4\u529b\u641c\u7d22\u7684\u4f18\u70b9\u662f\u7b80\u5355\u4e14\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u505a\u9884\u5904\u7406\u548c\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\u3002

\u7136\u800c\uff0c\u6b64\u7c7b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u5143\u7d20\u6570\u91cf\uff0c\u56e0\u6b64\u5728\u6570\u636e\u91cf\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u8f83\u5dee\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9002\u5e94\u641c\u7d22","text":"

\u81ea\u9002\u5e94\u641c\u7d22\u5229\u7528\u6570\u636e\u7684\u7279\u6709\u5c5e\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u6765\u4f18\u5316\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ece\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

  • \u201c\u4e8c\u5206\u67e5\u627e\u201d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
  • \u201c\u54c8\u5e0c\u67e5\u627e\u201d\u5229\u7528\u54c8\u5e0c\u8868\u5c06\u641c\u7d22\u6570\u636e\u548c\u76ee\u6807\u6570\u636e\u5efa\u7acb\u4e3a\u952e\u503c\u5bf9\u6620\u5c04\uff0c\u4ece\u800c\u5b9e\u73b0\u67e5\u8be2\u64cd\u4f5c\u3002
  • \u201c\u6811\u67e5\u627e\u201d\u5728\u7279\u5b9a\u7684\u6811\u7ed3\u6784\uff08\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\uff09\u4e2d\uff0c\u57fa\u4e8e\u6bd4\u8f83\u8282\u70b9\u503c\u6765\u5feb\u901f\u6392\u9664\u8282\u70b9\uff0c\u4ece\u800c\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

\u6b64\u7c7b\u7b97\u6cd5\u7684\u4f18\u70b9\u662f\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u7136\u800c\uff0c\u4f7f\u7528\u8fd9\u4e9b\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u67e5\u627e\u9700\u8981\u9884\u5148\u5bf9\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\uff0c\u54c8\u5e0c\u67e5\u627e\u548c\u6811\u67e5\u627e\u90fd\u9700\u8981\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u7ef4\u62a4\u8fd9\u4e9b\u6570\u636e\u7ed3\u6784\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u5f00\u9500\u3002

Tip

\u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u4e8e\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u7d22\u65b9\u6cd5\u9009\u53d6","text":"

\u7ed9\u5b9a\u5927\u5c0f\u4e3a \\(n\\) \u7684\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u7ebf\u6027\u641c\u7d22\u3001\u4e8c\u5206\u67e5\u627e\u3001\u6811\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u7b49\u591a\u79cd\u65b9\u6cd5\u4ece\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u56fe 10-11 \u6240\u793a\u3002

\u56fe 10-11 \u00a0 \u591a\u79cd\u641c\u7d22\u7b56\u7565

\u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

\u8868 10-1 \u00a0 \u67e5\u627e\u7b97\u6cd5\u6548\u7387\u5bf9\u6bd4

\u7ebf\u6027\u641c\u7d22 \u4e8c\u5206\u67e5\u627e \u6811\u67e5\u627e \u54c8\u5e0c\u67e5\u627e \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u989d\u5916\u7a7a\u95f4 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u6570\u636e\u9884\u5904\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6811 \\(O(n \\log n)\\) \u5efa\u54c8\u5e0c\u8868 \\(O(n)\\) \u6570\u636e\u662f\u5426\u6709\u5e8f \u65e0\u5e8f \u6709\u5e8f \u6709\u5e8f \u65e0\u5e8f

\u641c\u7d22\u7b97\u6cd5\u7684\u9009\u62e9\u8fd8\u53d6\u51b3\u4e8e\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u4e0e\u66f4\u65b0\u9891\u7387\u7b49\u3002

\u7ebf\u6027\u641c\u7d22

  • \u901a\u7528\u6027\u8f83\u597d\uff0c\u65e0\u987b\u4efb\u4f55\u6570\u636e\u9884\u5904\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u4eec\u4ec5\u9700\u67e5\u8be2\u4e00\u6b21\u6570\u636e\uff0c\u90a3\u4e48\u5176\u4ed6\u4e09\u79cd\u65b9\u6cd5\u7684\u6570\u636e\u9884\u5904\u7406\u7684\u65f6\u95f4\u6bd4\u7ebf\u6027\u641c\u7d22\u7684\u65f6\u95f4\u8fd8\u8981\u66f4\u957f\u3002
  • \u9002\u7528\u4e8e\u4f53\u91cf\u8f83\u5c0f\u7684\u6570\u636e\uff0c\u6b64\u60c5\u51b5\u4e0b\u65f6\u95f4\u590d\u6742\u5ea6\u5bf9\u6548\u7387\u5f71\u54cd\u8f83\u5c0f\u3002
  • \u9002\u7528\u4e8e\u6570\u636e\u66f4\u65b0\u9891\u7387\u8f83\u9ad8\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u8be5\u65b9\u6cd5\u4e0d\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u4efb\u4f55\u989d\u5916\u7ef4\u62a4\u3002

\u4e8c\u5206\u67e5\u627e

  • \u9002\u7528\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u6548\u7387\u8868\u73b0\u7a33\u5b9a\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002
  • \u6570\u636e\u91cf\u4e0d\u80fd\u8fc7\u5927\uff0c\u56e0\u4e3a\u5b58\u50a8\u6570\u7ec4\u9700\u8981\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u3002
  • \u4e0d\u9002\u7528\u4e8e\u9ad8\u9891\u589e\u5220\u6570\u636e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u7ef4\u62a4\u6709\u5e8f\u6570\u7ec4\u7684\u5f00\u9500\u8f83\u5927\u3002

\u54c8\u5e0c\u67e5\u627e

  • \u9002\u5408\u5bf9\u67e5\u8be2\u6027\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u573a\u666f\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002
  • \u4e0d\u9002\u5408\u9700\u8981\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u65e0\u6cd5\u7ef4\u62a4\u6570\u636e\u7684\u6709\u5e8f\u6027\u3002
  • \u5bf9\u54c8\u5e0c\u51fd\u6570\u548c\u54c8\u5e0c\u51b2\u7a81\u5904\u7406\u7b56\u7565\u7684\u4f9d\u8d56\u6027\u8f83\u9ad8\uff0c\u5177\u6709\u8f83\u5927\u7684\u6027\u80fd\u52a3\u5316\u98ce\u9669\u3002
  • \u4e0d\u9002\u5408\u6570\u636e\u91cf\u8fc7\u5927\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u9700\u8981\u989d\u5916\u7a7a\u95f4\u6765\u6700\u5927\u7a0b\u5ea6\u5730\u51cf\u5c11\u51b2\u7a81\uff0c\u4ece\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8be2\u6027\u80fd\u3002

\u6811\u67e5\u627e

  • \u9002\u7528\u4e8e\u6d77\u91cf\u6570\u636e\uff0c\u56e0\u4e3a\u6811\u8282\u70b9\u5728\u5185\u5b58\u4e2d\u662f\u5206\u6563\u5b58\u50a8\u7684\u3002
  • \u9002\u5408\u9700\u8981\u7ef4\u62a4\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\u3002
  • \u5728\u6301\u7eed\u589e\u5220\u8282\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u4ea7\u751f\u503e\u659c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • \u82e5\u4f7f\u7528 AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u5219\u5404\u9879\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a33\u5b9a\u8fd0\u884c\uff0c\u4f46\u7ef4\u62a4\u6811\u5e73\u8861\u7684\u64cd\u4f5c\u4f1a\u589e\u52a0\u989d\u5916\u7684\u5f00\u9500\u3002
"},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7ed3","text":"
  • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u8fdb\u884c\u67e5\u627e\u3002\u5b83\u8981\u6c42\u8f93\u5165\u6570\u636e\u6709\u5e8f\uff0c\u4e14\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u6216\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u6570\u636e\u3002\u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\uff0c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u548c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u9002\u7528\u4e8e\u56fe\u548c\u6811\u3002\u6b64\u7c7b\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\uff0c\u4f46\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u8f83\u9ad8\u3002
  • \u54c8\u5e0c\u67e5\u627e\u3001\u6811\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u5c5e\u4e8e\u9ad8\u6548\u641c\u7d22\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002\u6b64\u7c7b\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u501f\u52a9\u989d\u5916\u6570\u636e\u7ed3\u6784\u3002
  • \u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5bf9\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u548c\u66f4\u65b0\u9891\u7387\u7b49\u56e0\u7d20\u8fdb\u884c\u5177\u4f53\u5206\u6790\uff0c\u4ece\u800c\u9009\u62e9\u5408\u9002\u7684\u641c\u7d22\u65b9\u6cd5\u3002
  • \u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u5c0f\u578b\u6216\u9891\u7e41\u66f4\u65b0\u7684\u6570\u636e\uff1b\u4e8c\u5206\u67e5\u627e\u9002\u7528\u4e8e\u5927\u578b\u3001\u6392\u5e8f\u7684\u6570\u636e\uff1b\u54c8\u5e0c\u67e5\u627e\u9002\u7528\u4e8e\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u987b\u8303\u56f4\u67e5\u8be2\u7684\u6570\u636e\uff1b\u6811\u67e5\u627e\u9002\u7528\u4e8e\u9700\u8981\u7ef4\u62a4\u987a\u5e8f\u548c\u652f\u6301\u8303\u56f4\u67e5\u8be2\u7684\u5927\u578b\u52a8\u6001\u6570\u636e\u3002
  • \u7528\u54c8\u5e0c\u67e5\u627e\u66ff\u6362\u7ebf\u6027\u67e5\u627e\u662f\u4e00\u79cd\u5e38\u7528\u7684\u4f18\u5316\u8fd0\u884c\u65f6\u95f4\u7684\u7b56\u7565\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

Abstract

\u6392\u5e8f\u72b9\u5982\u4e00\u628a\u5c06\u6df7\u4e71\u53d8\u4e3a\u79e9\u5e8f\u7684\u9b54\u6cd5\u94a5\u5319\uff0c\u4f7f\u6211\u4eec\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u4e0e\u5904\u7406\u6570\u636e\u3002

\u65e0\u8bba\u662f\u7b80\u5355\u7684\u5347\u5e8f\uff0c\u8fd8\u662f\u590d\u6742\u7684\u5206\u7c7b\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u4eec\u5c55\u793a\u4e86\u6570\u636e\u7684\u548c\u8c10\u7f8e\u611f\u3002

"},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5
  • 11.2 \u00a0 \u9009\u62e9\u6392\u5e8f
  • 11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f
  • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
  • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
  • 11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f
  • 11.7 \u00a0 \u5806\u6392\u5e8f
  • 11.8 \u00a0 \u6876\u6392\u5e8f
  • 11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f
  • 11.10 \u00a0 \u57fa\u6570\u6392\u5e8f
  • 11.11 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

\u5192\u6ce1\u6392\u5e8f\uff08bubble sort\uff09\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

\u5982\u56fe 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u8fc7\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6765\u6a21\u62df\uff1a\u4ece\u6570\u7ec4\u6700\u5de6\u7aef\u5f00\u59cb\u5411\u53f3\u904d\u5386\uff0c\u4f9d\u6b21\u6bd4\u8f83\u76f8\u90bb\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u6362\u4e8c\u8005\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

<1><2><3><4><5><6><7>

\u56fe 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u5192\u6ce1

"},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u5982\u56fe 11-5 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

\u56fe 11-5 \u00a0 \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.ts
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.dart
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
bubble_sort.rs
/* \u5192\u6ce1\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.c
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
bubble_sort.kt
/* \u5192\u6ce1\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u4f18\u5316","text":"

\u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

\u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(n^2)\\) \uff1b\u4f46\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u53ef\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.ts
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.dart
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
bubble_sort.rs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
bubble_sort.c
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
bubble_sort.kt
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort_with_flag}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u603b\u548c\u4e3a \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
"},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u51e0\u79cd\u6392\u5e8f\u7b97\u6cd5\u90fd\u5c5e\u4e8e\u201c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u901a\u8fc7\u6bd4\u8f83\u5143\u7d20\u95f4\u7684\u5927\u5c0f\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u6b64\u7c7b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u65e0\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u63a2\u8ba8\u51e0\u79cd\u201c\u975e\u6bd4\u8f83\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u7ebf\u6027\u9636\u3002

\u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u987a\u5e8f\u7684\u6876\uff0c\u6bcf\u4e2a\u6876\u5bf9\u5e94\u4e00\u4e2a\u6570\u636e\u8303\u56f4\uff0c\u5c06\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff1b\u7136\u540e\uff0c\u5728\u6bcf\u4e2a\u6876\u5185\u90e8\u5206\u522b\u6267\u884c\u6392\u5e8f\uff1b\u6700\u7ec8\u6309\u7167\u6876\u7684\u987a\u5e8f\u5c06\u6240\u6709\u6570\u636e\u5408\u5e76\u3002

"},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5176\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u5185\u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-13 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\u3002
  2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u8fd9\u91cc\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\u3002
  3. \u6309\u7167\u6876\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u5408\u5e76\u7ed3\u679c\u3002

\u56fe 11-13 \u00a0 \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums:\n        # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i = int(num * k)\n        # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
bucket_sort.cpp
/* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = num * k;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.java
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int) (num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int)(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
bucket_sort.go
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i := int(num * float64(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5185\u7f6e\u5207\u7247\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
bucket_sort.swift
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
bucket_sort.js
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.ts
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.dart
/* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 _num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c06 _num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
bucket_sort.rs
/* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
bucket_sort.c
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8bb0\u5f55\u6bcf\u4e2a\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52a8\u6001\u6570\u7ec4\u7684\u6570\u7ec4\uff08\u6876\uff09\n    // \u4e3a\u6bcf\u4e2a\u6876\u9884\u5206\u914d\u8db3\u591f\u7684\u7a7a\u95f4\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u5e76\u6392\u5e8f\u540e\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(buckets[i]);\n    }\n}\n
bucket_sort.kt
/* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
bucket_sort.rb
[class]{}-[func]{bucket_sort}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u6876\u6392\u5e8f\u9002\u7528\u4e8e\u5904\u7406\u4f53\u91cf\u5f88\u5927\u7684\u6570\u636e\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u5305\u542b 100 \u4e07\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\u7a7a\u95f4\u9650\u5236\uff0c\u7cfb\u7edf\u5185\u5b58\u65e0\u6cd5\u4e00\u6b21\u6027\u52a0\u8f7d\u6240\u6709\u6570\u636e\u3002\u6b64\u65f6\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u6210 1000 \u4e2a\u6876\uff0c\u7136\u540e\u5206\u522b\u5bf9\u6bcf\u4e2a\u6876\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u7ed3\u679c\u5408\u5e76\u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\) \uff1a\u5047\u8bbe\u5143\u7d20\u5728\u5404\u4e2a\u6876\u5185\u5e73\u5747\u5206\u5e03\uff0c\u90a3\u4e48\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u6570\u91cf\u4e3a \\(\\frac{n}{k}\\) \u3002\u5047\u8bbe\u6392\u5e8f\u5355\u4e2a\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u65f6\u95f4\uff0c\u5219\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u65f6\u95f4\u3002\u5f53\u6876\u6570\u91cf \\(k\\) \u6bd4\u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5219\u8d8b\u5411\u4e8e \\(O(n)\\) \u3002\u5408\u5e76\u7ed3\u679c\u65f6\u9700\u8981\u904d\u5386\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8d39 \\(O(n + k)\\) \u65f6\u95f4\u3002
  • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u6570\u636e\u88ab\u5206\u914d\u5230\u4e00\u4e2a\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8be5\u6876\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
"},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

\u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \u4e2a\uff0c\u5404\u4e2a\u6876\u4e2d\u7684\u5546\u54c1\u6570\u91cf\u5dee\u8ddd\u4f1a\u975e\u5e38\u5927\u3002

\u4e3a\u5b9e\u73b0\u5e73\u5747\u5206\u914d\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u8bbe\u5b9a\u4e00\u6761\u5927\u81f4\u7684\u5206\u754c\u7ebf\uff0c\u5c06\u6570\u636e\u7c97\u7565\u5730\u5206\u5230 3 \u4e2a\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u6bd5\u540e\uff0c\u518d\u5c06\u5546\u54c1\u8f83\u591a\u7684\u6876\u7ee7\u7eed\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6570\u91cf\u5927\u81f4\u76f8\u7b49\u3002

\u5982\u56fe 11-14 \u6240\u793a\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u76ee\u6807\u662f\u8ba9\u53f6\u8282\u70b9\u7684\u503c\u5c3d\u53ef\u80fd\u5e73\u5747\u3002\u5f53\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f6e\u5c06\u6570\u636e\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u5177\u4f53\u5212\u5206\u65b9\u5f0f\u53ef\u6839\u636e\u6570\u636e\u7279\u70b9\u7075\u6d3b\u9009\u62e9\u3002

\u56fe 11-14 \u00a0 \u9012\u5f52\u5212\u5206\u6876

\u5982\u679c\u6211\u4eec\u63d0\u524d\u77e5\u9053\u5546\u54c1\u4ef7\u683c\u7684\u6982\u7387\u5206\u5e03\uff0c\u5219\u53ef\u4ee5\u6839\u636e\u6570\u636e\u6982\u7387\u5206\u5e03\u8bbe\u7f6e\u6bcf\u4e2a\u6876\u7684\u4ef7\u683c\u5206\u754c\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u5206\u5e03\u5e76\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7edf\u8ba1\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u6570\u636e\u7279\u70b9\u91c7\u7528\u67d0\u79cd\u6982\u7387\u6a21\u578b\u8fdb\u884c\u8fd1\u4f3c\u3002

\u5982\u56fe 11-15 \u6240\u793a\uff0c\u6211\u4eec\u5047\u8bbe\u5546\u54c1\u4ef7\u683c\u670d\u4ece\u6b63\u6001\u5206\u5e03\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8bbe\u5b9a\u4ef7\u683c\u533a\u95f4\uff0c\u4ece\u800c\u5c06\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\u3002

\u56fe 11-15 \u00a0 \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

\u8ba1\u6570\u6392\u5e8f\uff08counting sort\uff09\u901a\u8fc7\u7edf\u8ba1\u5143\u7d20\u6570\u91cf\u6765\u5b9e\u73b0\u6392\u5e8f\uff0c\u901a\u5e38\u5e94\u7528\u4e8e\u6574\u6570\u6570\u7ec4\u3002

"},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

\u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\uff0c\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-16 \u6240\u793a\u3002

  1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6570\u5b57\uff0c\u8bb0\u4e3a \\(m\\) \uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(m + 1\\) \u7684\u8f85\u52a9\u6570\u7ec4 counter \u3002
  2. \u501f\u52a9 counter \u7edf\u8ba1 nums \u4e2d\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5176\u4e2d counter[num] \u5bf9\u5e94\u6570\u5b57 num \u7684\u51fa\u73b0\u6b21\u6570\u3002\u7edf\u8ba1\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u904d\u5386 nums\uff08\u8bbe\u5f53\u524d\u6570\u5b57\u4e3a num\uff09\uff0c\u6bcf\u8f6e\u5c06 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
  3. \u7531\u4e8e counter \u7684\u5404\u4e2a\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u5f53\u4e8e\u6240\u6709\u6570\u5b57\u5df2\u7ecf\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u51fa\u73b0\u6b21\u6570\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

\u56fe 11-16 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
counting_sort.cpp
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.java
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.cs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.go
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
counting_sort.swift
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
counting_sort.js
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.ts
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.dart
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
counting_sort.rs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
counting_sort.c
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
counting_sort.kt
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort_naive}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u8ba1\u6570\u6392\u5e8f\u4e0e\u6876\u6392\u5e8f\u7684\u8054\u7cfb

\u4ece\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u6570\u6392\u5e8f\u4e2d\u7684\u8ba1\u6570\u6570\u7ec4 counter \u7684\u6bcf\u4e2a\u7d22\u5f15\u89c6\u4e3a\u4e00\u4e2a\u6876\uff0c\u5c06\u7edf\u8ba1\u6570\u91cf\u7684\u8fc7\u7a0b\u770b\u4f5c\u5c06\u5404\u4e2a\u5143\u7d20\u5206\u914d\u5230\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u672c\u8d28\u4e0a\uff0c\u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u6570\u636e\u4e0b\u7684\u4e00\u4e2a\u7279\u4f8b\u3002

"},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

\u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u6309\u7167\u5546\u54c1\u4ef7\u683c\uff08\u7c7b\u7684\u6210\u5458\u53d8\u91cf\uff09\u5bf9\u5546\u54c1\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u7b97\u6cd5\u53ea\u80fd\u7ed9\u51fa\u4ef7\u683c\u7684\u6392\u5e8f\u7ed3\u679c\u3002

\u90a3\u4e48\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u6570\u636e\u7684\u6392\u5e8f\u7ed3\u679c\u5462\uff1f\u6211\u4eec\u9996\u5148\u8ba1\u7b97 counter \u7684\u201c\u524d\u7f00\u548c\u201d\u3002\u987e\u540d\u601d\u4e49\uff0c\u7d22\u5f15 i \u5904\u7684\u524d\u7f00\u548c prefix[i] \u7b49\u4e8e\u6570\u7ec4\u524d i \u4e2a\u5143\u7d20\u4e4b\u548c\uff1a

\\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

\u524d\u7f00\u548c\u5177\u6709\u660e\u786e\u7684\u610f\u4e49\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7ed3\u679c\u6570\u7ec4 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u8fd9\u4e2a\u4fe1\u606f\u975e\u5e38\u5173\u952e\uff0c\u56e0\u4e3a\u5b83\u544a\u8bc9\u6211\u4eec\u5404\u4e2a\u5143\u7d20\u5e94\u8be5\u51fa\u73b0\u5728\u7ed3\u679c\u6570\u7ec4\u7684\u54ea\u4e2a\u4f4d\u7f6e\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5012\u5e8f\u904d\u5386\u539f\u6570\u7ec4 nums \u7684\u6bcf\u4e2a\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\u3002
  2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6570\u7ec4 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7ed3\u679c\uff0c\u6700\u540e\u4f7f\u7528 res \u8986\u76d6\u539f\u6570\u7ec4 nums \u5373\u53ef\u3002\u56fe 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b\u3002

<1><2><3><4><5><6><7><8>

\u56fe 11-17 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6b65\u9aa4

\u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1  # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n
counting_sort.cpp
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums = res;\n}\n
counting_sort.java
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.cs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.go
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    copy(nums, res)\n}\n
counting_sort.swift
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1 // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.js
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.ts
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.dart
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c06 _num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[_num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  nums.setAll(0, res);\n}\n
counting_sort.rs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.c
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
counting_sort.kt
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]-- // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u6d89\u53ca\u904d\u5386 nums \u548c\u904d\u5386 counter \uff0c\u90fd\u4f7f\u7528\u7ebf\u6027\u65f6\u95f4\u3002\u4e00\u822c\u60c5\u51b5\u4e0b \\(n \\gg m\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u4e8e \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
"},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u5c40\u9650\u6027","text":"

\u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\u76f8\u5bf9\u8f83\u4e3a\u4e25\u683c\u3002

\u8ba1\u6570\u6392\u5e8f\u53ea\u9002\u7528\u4e8e\u975e\u8d1f\u6574\u6570\u3002\u82e5\u60f3\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u8f6c\u6362\u4e3a\u975e\u8d1f\u6574\u6570\uff0c\u5e76\u4e14\u5728\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u4e0d\u80fd\u6539\u53d8\u5404\u4e2a\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u5927\u5c0f\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u5bf9\u4e8e\u5305\u542b\u8d1f\u6570\u7684\u6574\u6570\u6570\u7ec4\uff0c\u53ef\u4ee5\u5148\u7ed9\u6240\u6709\u6570\u5b57\u52a0\u4e0a\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5168\u90e8\u6570\u5b57\u8f6c\u5316\u4e3a\u6b63\u6570\uff0c\u6392\u5e8f\u5b8c\u6210\u540e\u518d\u8f6c\u6362\u56de\u53bb\u3002

\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5219\u4f1a\u5360\u7528\u8fc7\u591a\u7a7a\u95f4\u3002\u800c\u5f53 \\(n \\ll m\\) \u65f6\uff0c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u7b97\u6cd5\u8fd8\u8981\u6162\u3002

"},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u6392\u5e8f","text":"

Tip

\u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u201c\u5806\u201c\u7ae0\u8282\u3002

\u5806\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\u3002

  1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
  2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

\u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

"},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-12 \u6240\u793a\u3002

  1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
  2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
  3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
  4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

Tip

\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u56fe 11-12 \u00a0 \u5806\u6392\u5e8f\u6b65\u9aa4

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u201c\u5806\u201d\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316 sift_down() \u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 sift_down() \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0)\n
heap_sort.cpp
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.java
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.cs
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
heap_sort.go
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.swift
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swapAt(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
heap_sort.js
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.ts
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.dart
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
heap_sort.rs
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
heap_sort.c
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.kt
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.rb
[class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
heap_sort.zig
[class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
"},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

\u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

\u56fe 11-6 \u5c55\u793a\u4e86\u6570\u7ec4\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

\u56fe 11-6 \u00a0 \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-7 \u6240\u793a\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
  2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

\u56fe 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.swift
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.js
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.ts
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.dart
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  }\n}\n
insertion_sort.rs
/* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.c
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
insertion_sort.kt
/* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u5faa\u73af: \u5df2\u6392\u5e8f\u5143\u7d20\u4e3a 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.rb
### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  end\nend\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
"},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u4f18\u52bf","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

\u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u5730\u4f4d\uff0c\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u4f5c\u7528\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u91c7\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u4e3a\uff1a\u5bf9\u4e8e\u957f\u6570\u7ec4\uff0c\u91c7\u7528\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

\u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
  • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
  • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
"},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

\u5f52\u5e76\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5305\u542b\u56fe 11-10 \u6240\u793a\u7684\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u9636\u6bb5\u3002

  1. \u5212\u5206\u9636\u6bb5\uff1a\u901a\u8fc7\u9012\u5f52\u4e0d\u65ad\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u5f00\uff0c\u5c06\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u8f6c\u6362\u4e3a\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002
  2. \u5408\u5e76\u9636\u6bb5\uff1a\u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u5212\u5206\uff0c\u5f00\u59cb\u5408\u5e76\uff0c\u6301\u7eed\u5730\u5c06\u5de6\u53f3\u4e24\u4e2a\u8f83\u77ed\u7684\u6709\u5e8f\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u8f83\u957f\u7684\u6709\u5e8f\u6570\u7ec4\uff0c\u76f4\u81f3\u7ed3\u675f\u3002

\u56fe 11-10 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u5982\u56fe 11-11 \u6240\u793a\uff0c\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002

  1. \u8ba1\u7b97\u6570\u7ec4\u4e2d\u70b9 mid \uff0c\u9012\u5f52\u5212\u5206\u5de6\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [left, mid] \uff09\u548c\u53f3\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [mid + 1, right] \uff09\u3002
  2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u3002

\u201c\u5408\u5e76\u9636\u6bb5\u201d\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ece\u957f\u5ea6\u4e3a 1 \u7684\u5b50\u6570\u7ec4\u5f00\u59cb\u5408\u5e76\uff0c\u5408\u5e76\u9636\u6bb5\u4e2d\u7684\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u662f\u6709\u5e8f\u7684\u3002

<1><2><3><4><5><6><7><8><9><10>

\u56fe 11-11 \u00a0 \u5f52\u5e76\u6392\u5e8f\u6b65\u9aa4

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u4e0e\u4e8c\u53c9\u6811\u540e\u5e8f\u904d\u5386\u7684\u9012\u5f52\u987a\u5e8f\u662f\u4e00\u81f4\u7684\u3002

  • \u540e\u5e8f\u904d\u5386\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6811\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6811\uff0c\u6700\u540e\u5904\u7406\u6839\u8282\u70b9\u3002
  • \u5f52\u5e76\u6392\u5e8f\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6570\u7ec4\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6570\u7ec4\uff0c\u6700\u540e\u5904\u7406\u5408\u5e76\u3002

\u5f52\u5e76\u6392\u5e8f\u7684\u5b9e\u73b0\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\u3002\u8bf7\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u800c tmp \u7684\u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\"\"\"\n    # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if left >= right:\n        return  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    # \u5212\u5206\u9636\u6bb5\n    mid = (left + right) // 2  # \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    # \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n
merge_sort.cpp
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.java
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    MergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    MergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    Merge(nums, left, mid, right);\n}\n
merge_sort.go
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.swift
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    let mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
merge_sort.js
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.dart
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  // \u5212\u5206\u9636\u6bb5\n  int mid = (left + right) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\n  mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  // \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right);\n}\n
merge_sort.rs
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    }\n\n    // \u5212\u5206\u9636\u6bb5\n    let mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.c
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.kt
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else \n            tmp[k++] = nums[j++]\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return  // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    val mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.rb
[class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
merge_sort.zig
// \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n// \u5de6\u5b50\u6570\u7ec4\u533a\u95f4 [left, mid]\n// \u53f3\u5b50\u6570\u7ec4\u533a\u95f4 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u53f3\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 <= \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u5de6\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u672a\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 > \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    var mid = (left + right) / 2;           // \u8ba1\u7b97\u4e2d\u70b9\n    try mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    try mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    try merge(nums, left, mid, right);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
"},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u94fe\u8868\u6392\u5e8f","text":"

\u5bf9\u4e8e\u94fe\u8868\uff0c\u5f52\u5e76\u6392\u5e8f\u76f8\u8f83\u4e8e\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u6392\u5e8f\u4efb\u52a1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(1)\\) \u3002

  • \u5212\u5206\u9636\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u201d\u6765\u5b9e\u73b0\u94fe\u8868\u5212\u5206\u5de5\u4f5c\uff0c\u4ece\u800c\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\u3002
  • \u5408\u5e76\u9636\u6bb5\uff1a\u5728\u94fe\u8868\u4e2d\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4ec5\u9700\u6539\u53d8\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u5b9e\u73b0\uff0c\u56e0\u6b64\u5408\u5e76\u9636\u6bb5\uff08\u5c06\u4e24\u4e2a\u77ed\u6709\u5e8f\u94fe\u8868\u5408\u5e76\u4e3a\u4e00\u4e2a\u957f\u6709\u5e8f\u94fe\u8868\uff09\u65e0\u987b\u521b\u5efa\u989d\u5916\u94fe\u8868\u3002

\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u8fd0\u884c\u9ad8\u6548\uff0c\u5e94\u7528\u5e7f\u6cdb\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5176\u76ee\u6807\u662f\uff1a\u9009\u62e9\u6570\u7ec4\u4e2d\u7684\u67d0\u4e2a\u5143\u7d20\u4f5c\u4e3a\u201c\u57fa\u51c6\u6570\u201d\uff0c\u5c06\u6240\u6709\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u4fa7\uff0c\u800c\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u4fa7\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u54e8\u5175\u5212\u5206\u7684\u6d41\u7a0b\u5982\u56fe 11-8 \u6240\u793a\u3002

  1. \u9009\u53d6\u6570\u7ec4\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u521d\u59cb\u5316\u4e24\u4e2a\u6307\u9488 i \u548c j \u5206\u522b\u6307\u5411\u6570\u7ec4\u7684\u4e24\u7aef\u3002
  2. \u8bbe\u7f6e\u4e00\u4e2a\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u522b\u5bfb\u627e\u7b2c\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u540e\u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\u3002
  3. \u5faa\u73af\u6267\u884c\u6b65\u9aa4 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u65f6\u505c\u6b62\uff0c\u6700\u540e\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 11-8 \u00a0 \u54e8\u5175\u5212\u5206\u6b65\u9aa4

\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u539f\u6570\u7ec4\u88ab\u5212\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u6570\u7ec4\u3001\u57fa\u51c6\u6570\u3001\u53f3\u5b50\u6570\u7ec4\uff0c\u4e14\u6ee1\u8db3\u201c\u5de6\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u51c6\u6570 \\(\\leq\\) \u53f3\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u8fd9\u4e24\u4e2a\u5b50\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

\u54e8\u5175\u5212\u5206\u7684\u5b9e\u8d28\u662f\u5c06\u4e00\u4e2a\u8f83\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u7b80\u5316\u4e3a\u4e24\u4e2a\u8f83\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u6362 */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u5143\u7d20\u4ea4\u6362 */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u54e8\u5175\u5212\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n    return i;\n}\n
quick_sort.kt
/* \u5143\u7d20\u4ea4\u6362 */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i              // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{partition}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u5feb\u901f\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-9 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u3002
  2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u201c\u54e8\u5175\u5212\u5206\u201d\u3002
  3. \u6301\u7eed\u9012\u5f52\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\uff0c\u4ece\u800c\u5b8c\u6210\u6574\u4e2a\u6570\u7ec4\u7684\u6392\u5e8f\u3002

\u56fe 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right:\n        return\n    # \u54e8\u5175\u5212\u5206\n    pivot = self.partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = Partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    pivot := q.partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  if (left >= right) return;\n  // \u54e8\u5175\u5212\u5206\n  int pivot = _partition(nums, left, right);\n  // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return\n    // \u54e8\u5175\u5212\u5206\n    val pivot = partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    var pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
"},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u4e3a\u4ec0\u4e48\u5feb","text":"

\u4ece\u540d\u79f0\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u5e94\u8be5\u5177\u6709\u4e00\u5b9a\u7684\u4f18\u52bf\u3002\u5c3d\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e0e\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u548c\u201c\u5806\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u51fa\u73b0\u6700\u5dee\u60c5\u51b5\u7684\u6982\u7387\u5f88\u4f4e\uff1a\u867d\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u6ca1\u6709\u5f52\u5e76\u6392\u5e8f\u7a33\u5b9a\uff0c\u4f46\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fd0\u884c\u3002
  • \u7f13\u5b58\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u6267\u884c\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u65f6\uff0c\u7cfb\u7edf\u53ef\u5c06\u6574\u4e2a\u5b50\u6570\u7ec4\u52a0\u8f7d\u5230\u7f13\u5b58\uff0c\u56e0\u6b64\u8bbf\u95ee\u5143\u7d20\u7684\u6548\u7387\u8f83\u9ad8\u3002\u800c\u50cf\u201c\u5806\u6392\u5e8f\u201d\u8fd9\u7c7b\u7b97\u6cd5\u9700\u8981\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u5143\u7d20\uff0c\u4ece\u800c\u7f3a\u4e4f\u8fd9\u4e00\u7279\u6027\u3002
  • \u590d\u6742\u5ea6\u7684\u5e38\u6570\u7cfb\u6570\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u79cd\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f83\u3001\u8d4b\u503c\u3001\u4ea4\u6362\u7b49\u64cd\u4f5c\u7684\u603b\u6570\u91cf\u6700\u5c11\u3002\u8fd9\u4e0e\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

\u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\)\u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u90fd\u6709\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

\u4e3a\u4e86\u5c3d\u91cf\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u53d1\u751f\uff0c\u6211\u4eec\u53ef\u4ee5\u4f18\u5316\u54e8\u5175\u5212\u5206\u4e2d\u7684\u57fa\u51c6\u6570\u7684\u9009\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u968f\u673a\u9009\u53d6\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u8fd0\u6c14\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9009\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u51c6\u6570\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u5c3d\u5982\u4eba\u610f\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u4f2a\u968f\u673a\u6570\u201d\u3002\u5982\u679c\u6211\u4eec\u9488\u5bf9\u4f2a\u968f\u673a\u6570\u5e8f\u5217\u6784\u5efa\u4e00\u4e2a\u7279\u5b9a\u7684\u6d4b\u8bd5\u6837\u4f8b\uff0c\u90a3\u4e48\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

\u4e3a\u4e86\u8fdb\u4e00\u6b65\u6539\u8fdb\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6570\u7ec4\u4e2d\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\uff08\u901a\u5e38\u4e3a\u6570\u7ec4\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u70b9\u5143\u7d20\uff09\uff0c\u5e76\u5c06\u8fd9\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u57fa\u51c6\u6570\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6982\u7387\u5c06\u5927\u5e45\u63d0\u5347\u3002\u5f53\u7136\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u9009\u53d6\u66f4\u591a\u5019\u9009\u5143\u7d20\uff0c\u4ee5\u8fdb\u4e00\u6b65\u63d0\u9ad8\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002\u91c7\u7528\u8fd9\u79cd\u65b9\u6cd5\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6982\u7387\u5927\u5927\u964d\u4f4e\u3002

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u95f4\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.js
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u95f4\n  return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.kt
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i                         // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
quick_sort.zig
// \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n// \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u8bbe\u9012\u5f52\u4e2d\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(m\\) \uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u4ea7\u751f\u957f\u5ea6\u4e3a \\(0\\) \u7684\u5de6\u5b50\u6570\u7ec4\u548c\u957f\u5ea6\u4e3a \\(m - 1\\) \u7684\u53f3\u5b50\u6570\u7ec4\uff0c\u8fd9\u610f\u5473\u7740\u6bcf\u4e00\u5c42\u9012\u5f52\u8c03\u7528\u51cf\u5c11\u7684\u95ee\u9898\u89c4\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u51cf\u5c11\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u9012\u5f52\u6811\u7684\u9ad8\u5ea6\u4f1a\u8fbe\u5230 \\(n - 1\\) \uff0c\u6b64\u65f6\u9700\u8981\u5360\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

\u4e3a\u4e86\u9632\u6b62\u6808\u5e27\u7a7a\u95f4\u7684\u7d2f\u79ef\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6bcf\u8f6e\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u540e\uff0c\u6bd4\u8f83\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u4ec5\u5bf9\u8f83\u77ed\u7684\u5b50\u6570\u7ec4\u8fdb\u884c\u9012\u5f52\u3002\u7531\u4e8e\u8f83\u77ed\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(n / 2\\) \uff0c\u56e0\u6b64\u8fd9\u79cd\u65b9\u6cd5\u80fd\u786e\u4fdd\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff0c\u4ece\u800c\u5c06\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right:\n        # \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    for left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n      left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n      right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    }\n  }\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            l = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            r = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.rb
[class]{QuickSortTailCall}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                   // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u8ba1\u6570\u6392\u5e8f\uff0c\u5b83\u9002\u7528\u4e8e\u6570\u636e\u91cf \\(n\\) \u8f83\u5927\u4f46\u6570\u636e\u8303\u56f4 \\(m\\) \u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u5bf9 \\(n = 10^6\\) \u4e2a\u5b66\u53f7\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u5b66\u53f7\u662f\u4e00\u4e2a \\(8\\) \u4f4d\u6570\u5b57\uff0c\u8fd9\u610f\u5473\u7740\u6570\u636e\u8303\u56f4 \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u5185\u5b58\u7a7a\u95f4\uff0c\u800c\u57fa\u6570\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002

\u57fa\u6570\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u901a\u8fc7\u7edf\u8ba1\u4e2a\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u57fa\u6570\u6392\u5e8f\u5229\u7528\u6570\u5b57\u5404\u4f4d\u4e4b\u95f4\u7684\u9012\u8fdb\u5173\u7cfb\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e00\u4f4d\u8fdb\u884c\u6392\u5e8f\uff0c\u4ece\u800c\u5f97\u5230\u6700\u7ec8\u7684\u6392\u5e8f\u7ed3\u679c\u3002

"},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-18 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \u3002
  2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u201c\u8ba1\u6570\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u3002
  3. \u5c06 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u540e\u8fd4\u56de\u6b65\u9aa4 2. \u7ee7\u7eed\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u540e\u7ed3\u675f\u3002

\u56fe 11-18 \u00a0 \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u5256\u6790\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u4e8e\u4e00\u4e2a \\(d\\) \u8fdb\u5236\u7684\u6570\u5b57 \\(x\\) \uff0c\u8981\u83b7\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8ba1\u7b97\u516c\u5f0f\uff1a

\\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\u3002\u5bf9\u4e8e\u5b66\u53f7\u6570\u636e\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

\u6b64\u5916\uff0c\u6211\u4eec\u9700\u8981\u5c0f\u5e45\u6539\u52a8\u8ba1\u6570\u6392\u5e8f\u4ee3\u7801\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u636e\u6570\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u8fdb\u884c\u6392\u5e8f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
def digit(num: int, exp: int) -> int:\n    \"\"\"\u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter = [0] * 10\n    n = len(nums)\n    # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1  # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n    # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    m = max(nums)\n    # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    exp = 1\n    while exp <= m:\n        # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
radix_sort.cpp
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
radix_sort.java
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.cs
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
radix_sort.go
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++             // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
radix_sort.swift
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var counter = Array(repeating: 0, count: 10)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1 // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
radix_sort.js
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.ts
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.dart
/* \u83b7\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  }\n  // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  // dart \u4e2d int \u7684\u957f\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
radix_sort.rs
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
radix_sort.c
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < size; i++) {\n        // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        int d = digit(nums[i], exp);\n        // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
radix_sort.kt
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    while (exp <= m) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
radix_sort.rb
[class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
radix_sort.zig
// \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6570\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4e3a\u4ec0\u4e48\u4ece\u6700\u4f4e\u4f4d\u5f00\u59cb\u6392\u5e8f\uff1f

\u5728\u8fde\u7eed\u7684\u6392\u5e8f\u8f6e\u6b21\u4e2d\uff0c\u540e\u4e00\u8f6e\u6392\u5e8f\u4f1a\u8986\u76d6\u524d\u4e00\u8f6e\u6392\u5e8f\u7684\u7ed3\u679c\u3002\u4e3e\u4f8b\u6765\u8bf4\uff0c\u5982\u679c\u7b2c\u4e00\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a > b\\) \uff0c\u90a3\u4e48\u7b2c\u4e8c\u8f6e\u7684\u7ed3\u679c\u5c06\u53d6\u4ee3\u7b2c\u4e00\u8f6e\u7684\u7ed3\u679c\u3002\u7531\u4e8e\u6570\u5b57\u7684\u9ad8\u4f4d\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4f4e\u4f4d\uff0c\u56e0\u6b64\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u8bbe\u6570\u636e\u91cf\u4e3a \\(n\\)\u3001\u6570\u636e\u4e3a \\(d\\) \u8fdb\u5236\u3001\u6700\u5927\u4f4d\u6570\u4e3a \\(k\\) \uff0c\u5219\u5bf9\u67d0\u4e00\u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u65f6\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5bf9\u8f83\u5c0f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5f53\u8ba1\u6570\u6392\u5e8f\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u4e5f\u7a33\u5b9a\uff1b\u5f53\u8ba1\u6570\u6392\u5e8f\u4e0d\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u65e0\u6cd5\u4fdd\u8bc1\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\u3002
"},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

\u9009\u62e9\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7b80\u5355\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 11-2 \u6240\u793a\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
  2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 11-2 \u00a0 \u9009\u62e9\u6392\u5e8f\u6b65\u9aa4

\u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
def selection_sort(nums: list[int]):\n    \"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in range(n - 1):\n        # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n
selection_sort.cpp
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        swap(nums[i], nums[k]);\n    }\n}\n
selection_sort.java
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.cs
/* \u9009\u62e9\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
selection_sort.go
/* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
selection_sort.swift
/* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swapAt(i, k)\n    }\n}\n
selection_sort.js
/* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.ts
/* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.dart
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
selection_sort.rs
/* \u9009\u62e9\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in 0..n - 1 {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swap(i, k);\n    }\n}\n
selection_sort.c
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.kt
/* \u9009\u62e9\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
selection_sort.rb
[class]{}-[func]{selection_sort}\n
selection_sort.zig
[class]{}-[func]{selectionSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5982\u56fe 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u6362\u81f3\u4e0e\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

\u56fe 11-3 \u00a0 \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

\u6392\u5e8f\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u4e8e\u5bf9\u4e00\u7ec4\u6570\u636e\u6309\u7167\u7279\u5b9a\u987a\u5e8f\u8fdb\u884c\u6392\u5217\u3002\u6392\u5e8f\u7b97\u6cd5\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u56e0\u4e3a\u6709\u5e8f\u6570\u636e\u901a\u5e38\u80fd\u591f\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

\u5982\u56fe 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65ad\u89c4\u5219\u53ef\u6839\u636e\u9700\u6c42\u8bbe\u5b9a\uff0c\u5982\u6570\u5b57\u5927\u5c0f\u3001\u5b57\u7b26 ASCII \u7801\u987a\u5e8f\u6216\u81ea\u5b9a\u4e49\u89c4\u5219\u3002

\u56fe 11-1 \u00a0 \u6570\u636e\u7c7b\u578b\u548c\u5224\u65ad\u89c4\u5219\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8bc4\u4ef7\u7ef4\u5ea6","text":"

\u8fd0\u884c\u6548\u7387\uff1a\u6211\u4eec\u671f\u671b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c3d\u91cf\u4f4e\uff0c\u4e14\u603b\u4f53\u64cd\u4f5c\u6570\u91cf\u8f83\u5c11\uff08\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u539f\u5730\u6392\u5e8f\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u987b\u501f\u52a9\u989d\u5916\u7684\u8f85\u52a9\u6570\u7ec4\uff0c\u4ece\u800c\u8282\u7701\u5185\u5b58\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u6570\u636e\u642c\u8fd0\u64cd\u4f5c\u8f83\u5c11\uff0c\u8fd0\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

\u7a33\u5b9a\u6027\uff1a\u7a33\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u540e\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u76f8\u5bf9\u987a\u5e8f\u4e0d\u53d1\u751f\u6539\u53d8\u3002

\u7a33\u5b9a\u6392\u5e8f\u662f\u591a\u7ea7\u6392\u5e8f\u573a\u666f\u7684\u5fc5\u8981\u6761\u4ef6\u3002\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u5b58\u50a8\u5b66\u751f\u4fe1\u606f\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u975e\u7a33\u5b9a\u6392\u5e8f\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\uff1a

# \u8f93\u5165\u6570\u636e\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8bbe\u4f7f\u7528\u975e\u7a33\u5b9a\u6392\u5e8f\u7b97\u6cd5\u6309\u5e74\u9f84\u6392\u5e8f\u5217\u8868\uff0c\n# \u7ed3\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5bf9\u4f4d\u7f6e\u6539\u53d8\uff0c\n# \u8f93\u5165\u6570\u636e\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8d28\u4e22\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

\u81ea\u9002\u5e94\u6027\uff1a\u81ea\u9002\u5e94\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5e76\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

\u81ea\u9002\u5e94\u6027\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u6765\u8bc4\u4f30\u3002\u5982\u679c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u5dee\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8bf4\u660e\u6392\u5e8f\u7b97\u6cd5\u5728\u67d0\u4e9b\u6570\u636e\u4e0b\u6027\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u89c6\u4e3a\u8d1f\u9762\u5c5e\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u5219\u88ab\u89c6\u4e3a\u6b63\u9762\u5c5e\u6027\u3002

\u662f\u5426\u57fa\u4e8e\u6bd4\u8f83\uff1a\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u4f9d\u8d56\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u6765\u5224\u65ad\u5143\u7d20\u7684\u76f8\u5bf9\u987a\u5e8f\uff0c\u4ece\u800c\u6392\u5e8f\u6574\u4e2a\u6570\u7ec4\uff0c\u7406\u8bba\u6700\u4f18\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f83\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5bf9\u8f83\u5dee\u3002

"},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u7b97\u6cd5","text":"

\u8fd0\u884c\u5feb\u3001\u539f\u5730\u3001\u7a33\u5b9a\u3001\u6b63\u5411\u81ea\u9002\u5e94\u3001\u901a\u7528\u6027\u597d\u3002\u663e\u7136\uff0c\u8fc4\u4eca\u4e3a\u6b62\u5c1a\u672a\u53d1\u73b0\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\u65f6\uff0c\u9700\u8981\u6839\u636e\u5177\u4f53\u7684\u6570\u636e\u7279\u70b9\u548c\u95ee\u9898\u9700\u6c42\u6765\u51b3\u5b9a\u3002

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5171\u540c\u5b66\u4e60\u5404\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5e76\u57fa\u4e8e\u4e0a\u8ff0\u8bc4\u4ef7\u7ef4\u5ea6\u5bf9\u5404\u4e2a\u6392\u5e8f\u7b97\u6cd5\u7684\u4f18\u7f3a\u70b9\u8fdb\u884c\u5206\u6790\u3002

"},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u5192\u6ce1\u6392\u5e8f\u901a\u8fc7\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u5b9e\u73b0\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(n)\\) \u3002
  • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f6e\u5c06\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u6570\u636e\u91cf\u7684\u6392\u5e8f\u4efb\u52a1\u4e2d\u975e\u5e38\u53d7\u6b22\u8fce\u3002
  • \u5feb\u901f\u6392\u5e8f\u57fa\u4e8e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5212\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9009\u53d6\u5230\u6700\u5dee\u7684\u57fa\u51c6\u6570\uff0c\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6570\u57fa\u51c6\u6570\u6216\u968f\u673a\u57fa\u51c6\u6570\u53ef\u4ee5\u964d\u4f4e\u8fd9\u79cd\u52a3\u5316\u7684\u6982\u7387\u3002\u5c3e\u9012\u5f52\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u51cf\u5c11\u9012\u5f52\u6df1\u5ea6\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(\\log n)\\) \u3002
  • \u5f52\u5e76\u6392\u5e8f\u5305\u62ec\u5212\u5206\u548c\u5408\u5e76\u4e24\u4e2a\u9636\u6bb5\uff0c\u5178\u578b\u5730\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5f52\u5e76\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u6570\u7ec4\u9700\u8981\u521b\u5efa\u8f85\u52a9\u6570\u7ec4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u94fe\u8868\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002
  • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u4e2a\u6b65\u9aa4\uff1a\u6570\u636e\u5206\u6876\u3001\u6876\u5185\u6392\u5e8f\u548c\u5408\u5e76\u7ed3\u679c\u3002\u5b83\u540c\u6837\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9002\u7528\u4e8e\u6570\u636e\u4f53\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u3002\u6876\u6392\u5e8f\u7684\u5173\u952e\u5728\u4e8e\u5bf9\u6570\u636e\u8fdb\u884c\u5e73\u5747\u5206\u914d\u3002
  • \u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5b83\u901a\u8fc7\u7edf\u8ba1\u6570\u636e\u51fa\u73b0\u7684\u6b21\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u6709\u9650\u7684\u60c5\u51b5\uff0c\u5e76\u4e14\u8981\u6c42\u6570\u636e\u80fd\u591f\u8f6c\u6362\u4e3a\u6b63\u6574\u6570\u3002
  • \u57fa\u6570\u6392\u5e8f\u901a\u8fc7\u9010\u4f4d\u6392\u5e8f\u6765\u5b9e\u73b0\u6570\u636e\u6392\u5e8f\uff0c\u8981\u6c42\u6570\u636e\u80fd\u591f\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u6570\u5b57\u3002
  • \u603b\u7684\u6765\u8bf4\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a33\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7b49\u4f18\u70b9\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e00\u6837\uff0c\u6ca1\u6709\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\u80fd\u591f\u540c\u65f6\u6ee1\u8db3\u6240\u6709\u8fd9\u4e9b\u6761\u4ef6\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u6570\u636e\u7684\u7279\u6027\u6765\u9009\u62e9\u5408\u9002\u7684\u6392\u5e8f\u7b97\u6cd5\u3002
  • \u56fe 11-19 \u5bf9\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a33\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9002\u5e94\u6027\u7b49\u3002

\u56fe 11-19 \u00a0 \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

"},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6392\u5e8f\u7b97\u6cd5\u7a33\u5b9a\u6027\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

\u5728\u73b0\u5b9e\u4e2d\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u57fa\u4e8e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u8fdb\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b66\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u4e24\u4e2a\u5c5e\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u4e00\u4e2a\u591a\u7ea7\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5bf9\u8eab\u9ad8\u8fdb\u884c\u6392\u5e8f\u3002\u7531\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e0d\u7a33\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

\u53ef\u4ee5\u53d1\u73b0\uff0c\u5b66\u751f D \u548c C \u7684\u4f4d\u7f6e\u53d1\u751f\u4e86\u4ea4\u6362\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u574f\u4e86\uff0c\u800c\u8fd9\u662f\u6211\u4eec\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

Q\uff1a\u54e8\u5175\u5212\u5206\u4e2d\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u4e0e\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u7684\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u5417\uff1f

\u4e0d\u884c\uff0c\u5f53\u6211\u4eec\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u4e3a\u57fa\u51c6\u6570\u65f6\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u518d\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002\u8fd9\u4e2a\u7ed3\u8bba\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u6211\u4eec\u6765\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

\u54e8\u5175\u5212\u5206 partition() \u7684\u6700\u540e\u4e00\u6b65\u662f\u4ea4\u6362 nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u57fa\u51c6\u6570\u5de6\u8fb9\u7684\u5143\u7d20\u90fd <= \u57fa\u51c6\u6570\uff0c\u8fd9\u5c31\u8981\u6c42\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u524d nums[left] >= nums[i] \u5fc5\u987b\u6210\u7acb\u3002\u5047\u8bbe\u6211\u4eec\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\uff0c\u90a3\u4e48\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5219\u4f1a\u5728 i == j \u65f6\u8df3\u51fa\u5faa\u73af\uff0c\u6b64\u65f6\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6b64\u65f6\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u64cd\u4f5c\u4f1a\u628a\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\uff0c\u5bfc\u81f4\u54e8\u5175\u5212\u5206\u5931\u8d25\u3002

\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u6570\u7ec4 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u4ece\u5de6\u5411\u53f3\u67e5\u627e\u201d\uff0c\u54e8\u5175\u5212\u5206\u540e\u6570\u7ec4\u4e3a [1, 0, 0, 0, 0] \uff0c\u8fd9\u4e2a\u7ed3\u679c\u662f\u4e0d\u6b63\u786e\u7684\u3002

\u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u9009\u62e9 nums[right] \u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u6b63\u597d\u53cd\u8fc7\u6765\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002

Q\uff1a\u5173\u4e8e\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u4e3a\u4ec0\u4e48\u9009\u77ed\u7684\u6570\u7ec4\u80fd\u4fdd\u8bc1\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff1f

\u9012\u5f52\u6df1\u5ea6\u5c31\u662f\u5f53\u524d\u672a\u8fd4\u56de\u7684\u9012\u5f52\u65b9\u6cd5\u7684\u6570\u91cf\u3002\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u6211\u4eec\u5c06\u539f\u6570\u7ec4\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002\u5728\u5c3e\u9012\u5f52\u4f18\u5316\u540e\uff0c\u5411\u4e0b\u9012\u5f52\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u6700\u5927\u4e3a\u539f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8bbe\u6700\u5dee\u60c5\u51b5\uff0c\u4e00\u76f4\u4e3a\u4e00\u534a\u957f\u5ea6\uff0c\u90a3\u4e48\u6700\u7ec8\u7684\u9012\u5f52\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

\u56de\u987e\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u4f1a\u8fde\u7eed\u5730\u9012\u5f52\u957f\u5ea6\u8f83\u5927\u7684\u6570\u7ec4\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u4e3a \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002\u5c3e\u9012\u5f52\u4f18\u5316\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u3002

Q\uff1a\u5f53\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u65f6\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n^2)\\) \u5417\uff1f\u8be5\u5982\u4f55\u5904\u7406\u8fd9\u79cd\u9000\u5316\u60c5\u51b5\uff1f

\u662f\u7684\u3002\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u54e8\u5175\u5212\u5206\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a\u5c0f\u4e8e\u3001\u7b49\u4e8e\u3001\u5927\u4e8e\u57fa\u51c6\u6570\u3002\u4ec5\u5411\u4e0b\u9012\u5f52\u5c0f\u4e8e\u548c\u5927\u4e8e\u7684\u4e24\u90e8\u5206\u3002\u5728\u8be5\u65b9\u6cd5\u4e0b\uff0c\u8f93\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u6570\u7ec4\uff0c\u4ec5\u4e00\u8f6e\u54e8\u5175\u5212\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u4ec0\u4e48\u662f \\(O(n^2)\\) \uff1f

\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u4e2a\u6876\u4e2d\u3002\u5982\u679c\u6211\u4eec\u91c7\u7528\u4e00\u4e2a \\(O(n^2)\\) \u7b97\u6cd5\u6765\u6392\u5e8f\u8fd9\u4e9b\u5143\u7d20\uff0c\u5219\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u6808\u4e0e\u961f\u5217","text":"

Abstract

\u6808\u5982\u540c\u53e0\u732b\u732b\uff0c\u800c\u961f\u5217\u5c31\u50cf\u732b\u732b\u6392\u961f\u3002

\u4e24\u8005\u5206\u522b\u4ee3\u8868\u5148\u5165\u540e\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u903b\u8f91\u5173\u7cfb\u3002

"},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 5.1 \u00a0 \u6808
  • 5.2 \u00a0 \u961f\u5217
  • 5.3 \u00a0 \u53cc\u5411\u961f\u5217
  • 5.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u53cc\u5411\u961f\u5217","text":"

\u5728\u961f\u5217\u4e2d\uff0c\u6211\u4eec\u4ec5\u80fd\u5220\u9664\u5934\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u5982\u56fe 5-7 \u6240\u793a\uff0c\u53cc\u5411\u961f\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u7075\u6d3b\u6027\uff0c\u5141\u8bb8\u5728\u5934\u90e8\u548c\u5c3e\u90e8\u6267\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u6216\u5220\u9664\u64cd\u4f5c\u3002

\u56fe 5-7 \u00a0 \u53cc\u5411\u961f\u5217\u7684\u64cd\u4f5c

"},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u53cc\u5411\u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u53cc\u5411\u961f\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u79f0\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\u8868 5-3 \u00a0 \u53cc\u5411\u961f\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push_first() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) push_last() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop_first() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 \\(O(1)\\)

\u540c\u6837\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u5df2\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
from collections import deque\n\n# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeque.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deque[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deque.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deque.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deque) == 0\n
deque.cpp
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
deque.java
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.pollFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.pollLast();    // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c06\u94fe\u8868 LinkedList \u770b\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.AddLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.AddFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.PushBack(2)      // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.PushFront(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\n
deque.swift
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.append(2) // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.insert(1, at: 0)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u4f7f\u7528 Array \u6a21\u62df\u65f6 popFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet popFirst = deque.removeFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nlet popLast = deque.removeLast() // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.js
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\n
deque.ts
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u4e49\u4e3a\u53cc\u5411\u961f\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.addLast(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.addFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.first; // \u961f\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.removeFirst(); // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.removeLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u961f\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u961f\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop_front) = deque.pop_front() { // \u961f\u9996\u5143\u7d20\u51fa\u961f\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
deque.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\n
deque.kt
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2)  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u961f\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nval popFirst = deque.pollFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nval popLast = deque.pollLast()   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = deque.isEmpty()\n
deque.rb
# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\n# Ruby \u6ca1\u6709\u5185\u76f4\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u961f\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#unshift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8bbf\u95ee\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u961f\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0c Array#shift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize = deque.length\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = size.zero?\n
deque.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u53cc\u5411\u961f\u5217\u5b9e\u73b0 *","text":"

\u53cc\u5411\u961f\u5217\u7684\u5b9e\u73b0\u4e0e\u961f\u5217\u7c7b\u4f3c\uff0c\u53ef\u4ee5\u9009\u62e9\u94fe\u8868\u6216\u6570\u7ec4\u4f5c\u4e3a\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

"},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u56de\u987e\u4e0a\u4e00\u8282\u5185\u5bb9\uff0c\u6211\u4eec\u4f7f\u7528\u666e\u901a\u5355\u5411\u94fe\u8868\u6765\u5b9e\u73b0\u961f\u5217\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u5220\u9664\u5934\u8282\u70b9\uff08\u5bf9\u5e94\u51fa\u961f\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0\u65b0\u8282\u70b9\uff08\u5bf9\u5e94\u5165\u961f\u64cd\u4f5c\uff09\u3002

\u5bf9\u4e8e\u53cc\u5411\u961f\u5217\u800c\u8a00\uff0c\u5934\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u6267\u884c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u53cc\u5411\u961f\u5217\u9700\u8981\u5b9e\u73b0\u53e6\u4e00\u4e2a\u5bf9\u79f0\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u5411\u94fe\u8868\u201d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

\u5982\u56fe 5-8 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u53cc\u5411\u94fe\u8868\u7684\u5934\u8282\u70b9\u548c\u5c3e\u8282\u70b9\u89c6\u4e3a\u53cc\u5411\u961f\u5217\u7684\u961f\u9996\u548c\u961f\u5c3e\uff0c\u540c\u65f6\u5b9e\u73b0\u5728\u4e24\u7aef\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u7684\u529f\u80fd\u3002

LinkedListDequepush_last()push_first()pop_last()pop_first()

\u56fe 5-8 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5982\u56fe 5-9 \u6240\u793a\uff0c\u4e0e\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7c7b\u4f3c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u73af\u5f62\u6570\u7ec4\u6765\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u3002

ArrayDequepush_last()push_first()pop_last()pop_first()

\u56fe 5-9 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u5728\u961f\u5217\u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\uff0c\u4ec5\u9700\u589e\u52a0\u201c\u961f\u9996\u5165\u961f\u201d\u548c\u201c\u961f\u5c3e\u51fa\u961f\u201d\u7684\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u53cc\u5411\u961f\u5217\u5e94\u7528","text":"

\u53cc\u5411\u961f\u5217\u517c\u5177\u6808\u4e0e\u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5b9e\u73b0\u8fd9\u4e24\u8005\u7684\u6240\u6709\u5e94\u7528\u573a\u666f\uff0c\u540c\u65f6\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

\u6211\u4eec\u77e5\u9053\uff0c\u8f6f\u4ef6\u7684\u201c\u64a4\u9500\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u6808\u6765\u5b9e\u73b0\uff1a\u7cfb\u7edf\u5c06\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u6808\u4e2d\uff0c\u7136\u540e\u901a\u8fc7 pop \u5b9e\u73b0\u64a4\u9500\u3002\u7136\u800c\uff0c\u8003\u8651\u5230\u7cfb\u7edf\u8d44\u6e90\u7684\u9650\u5236\uff0c\u8f6f\u4ef6\u901a\u5e38\u4f1a\u9650\u5236\u64a4\u9500\u7684\u6b65\u6570\uff08\u4f8b\u5982\u4ec5\u5141\u8bb8\u4fdd\u5b58 \\(50\\) \u6b65\uff09\u3002\u5f53\u6808\u7684\u957f\u5ea6\u8d85\u8fc7 \\(50\\) \u65f6\uff0c\u8f6f\u4ef6\u9700\u8981\u5728\u6808\u5e95\uff08\u961f\u9996\uff09\u6267\u884c\u5220\u9664\u64cd\u4f5c\u3002\u4f46\u6808\u65e0\u6cd5\u5b9e\u73b0\u8be5\u529f\u80fd\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u4f7f\u7528\u53cc\u5411\u961f\u5217\u6765\u66ff\u4ee3\u6808\u3002\u8bf7\u6ce8\u610f\uff0c\u201c\u64a4\u9500\u201d\u7684\u6838\u5fc3\u903b\u8f91\u4ecd\u7136\u9075\u5faa\u6808\u7684\u5148\u5165\u540e\u51fa\u539f\u5219\uff0c\u53ea\u662f\u53cc\u5411\u961f\u5217\u80fd\u591f\u66f4\u52a0\u7075\u6d3b\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u903b\u8f91\u3002

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u961f\u5217","text":"

\u961f\u5217\uff08queue\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u89c4\u5219\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u987e\u540d\u601d\u4e49\uff0c\u961f\u5217\u6a21\u62df\u4e86\u6392\u961f\u73b0\u8c61\uff0c\u5373\u65b0\u6765\u7684\u4eba\u4e0d\u65ad\u52a0\u5165\u961f\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

\u5982\u56fe 5-4 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u961f\u5217\u5934\u90e8\u79f0\u4e3a\u201c\u961f\u9996\u201d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u201c\u961f\u5c3e\u201d\uff0c\u5c06\u628a\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u5165\u961f\u201d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u51fa\u961f\u201d\u3002

\u56fe 5-4 \u00a0 \u961f\u5217\u7684\u5148\u5165\u5148\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u961f\u5217\u7684\u5e38\u89c1\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u65b9\u6cd5\u540d\u79f0\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u6211\u4eec\u5728\u6b64\u91c7\u7528\u4e0e\u6808\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

\u8868 5-2 \u00a0 \u961f\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u961f\uff0c\u5373\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop() \u961f\u9996\u5143\u7d20\u51fa\u961f \\(O(1)\\) peek() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\)

\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u73b0\u6210\u7684\u961f\u5217\u7c7b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
from collections import deque\n\n# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u5f53\u4f5c\u961f\u5217\u4f7f\u7528\n# \u867d\u7136 queue.Queue() \u662f\u7eaf\u6b63\u7684\u961f\u5217\u7c7b\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 0\n
queue.cpp
/* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
queue.java
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u961f\u5217\u6765\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\n
queue.swift
/* \u521d\u59cb\u5316\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u7531\u4e8e\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 removeFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet pool = queue.removeFirst()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.js
/* \u521d\u59cb\u5316\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.ts
/* \u521d\u59cb\u5316\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.dart
/* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u961f\u5217\u7c7b Qeque \u662f\u53cc\u5411\u961f\u5217\uff0c\u4e5f\u53ef\u4f5c\u4e3a\u961f\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.removeFirst();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u53cc\u5411\u961f\u5217\u4f5c\u4e3a\u666e\u901a\u961f\u5217\u6765\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
queue.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
queue.kt
/* \u521d\u59cb\u5316\u961f\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u961f */\nval pop = queue.poll()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = queue.isEmpty()\n
queue.rb
# \u521d\u59cb\u5316\u961f\u5217\n# Ruby \u5185\u7f6e\u7684\u961f\u5217\uff08Thread::Queue) \u6ca1\u6709 peek \u548c\u904d\u5386\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u961f\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8bbf\u95ee\u961f\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u961f\n# \u6e05\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#shift \u65b9\u6cd5\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop = queue.shift\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize = queue.length\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = queue.empty?\n
queue.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u961f\u5217\u5b9e\u73b0","text":"

\u4e3a\u4e86\u5b9e\u73b0\u961f\u5217\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u6dfb\u52a0\u5143\u7d20\uff0c\u5e76\u5728\u53e6\u4e00\u7aef\u5220\u9664\u5143\u7d20\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u7b26\u5408\u8981\u6c42\u3002

"},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u5982\u56fe 5-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u201c\u5934\u8282\u70b9\u201d\u548c\u201c\u5c3e\u8282\u70b9\u201d\u5206\u522b\u89c6\u4e3a\u201c\u961f\u9996\u201d\u548c\u201c\u961f\u5c3e\u201d\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

LinkedListQueuepush()pop()

\u56fe 5-5 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5728\u6570\u7ec4\u4e2d\u5220\u9664\u9996\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4f1a\u5bfc\u81f4\u51fa\u961f\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002\u7136\u800c\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u6765\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002

\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf front \u6307\u5411\u961f\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u5e76\u7ef4\u62a4\u4e00\u4e2a\u53d8\u91cf size \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + size \uff0c\u8fd9\u4e2a\u516c\u5f0f\u8ba1\u7b97\u51fa\u7684 rear \u6307\u5411\u961f\u5c3e\u5143\u7d20\u4e4b\u540e\u7684\u4e0b\u4e00\u4e2a\u4f4d\u7f6e\u3002

\u57fa\u4e8e\u6b64\u8bbe\u8ba1\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u533a\u95f4\u4e3a [front, rear - 1]\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u6cd5\u5982\u56fe 5-6 \u6240\u793a\u3002

  • \u5165\u961f\u64cd\u4f5c\uff1a\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 size \u589e\u52a0 1 \u3002
  • \u51fa\u961f\u64cd\u4f5c\uff1a\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 size \u51cf\u5c11 1 \u3002

\u53ef\u4ee5\u770b\u5230\uff0c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u90fd\u53ea\u9700\u8fdb\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002

ArrayQueuepush()pop()

\u56fe 5-6 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u4e00\u4e2a\u95ee\u9898\uff1a\u5728\u4e0d\u65ad\u8fdb\u884c\u5165\u961f\u548c\u51fa\u961f\u7684\u8fc7\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52a8\uff0c\u5f53\u5b83\u4eec\u5230\u8fbe\u6570\u7ec4\u5c3e\u90e8\u65f6\u5c31\u65e0\u6cd5\u7ee7\u7eed\u79fb\u52a8\u4e86\u3002\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u73af\u5f62\u6570\u7ec4\u201d\u3002

\u5bf9\u4e8e\u73af\u5f62\u6570\u7ec4\uff0c\u6211\u4eec\u9700\u8981\u8ba9 front \u6216 rear \u5728\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u76f4\u63a5\u56de\u5230\u6570\u7ec4\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002\u8fd9\u79cd\u5468\u671f\u6027\u89c4\u5f8b\u53ef\u4ee5\u901a\u8fc7\u201c\u53d6\u4f59\u64cd\u4f5c\u201d\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff1a\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e0d\u96be\u89e3\u51b3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u66ff\u6362\u4e3a\u52a8\u6001\u6570\u7ec4\uff0c\u4ece\u800c\u5f15\u5165\u6269\u5bb9\u673a\u5236\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u884c\u5b9e\u73b0\u3002

\u4e24\u79cd\u5b9e\u73b0\u7684\u5bf9\u6bd4\u7ed3\u8bba\u4e0e\u6808\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u961f\u5217\u5178\u578b\u5e94\u7528","text":"
  • \u6dd8\u5b9d\u8ba2\u5355\u3002\u8d2d\u7269\u8005\u4e0b\u5355\u540e\uff0c\u8ba2\u5355\u5c06\u52a0\u5165\u961f\u5217\u4e2d\uff0c\u7cfb\u7edf\u968f\u540e\u4f1a\u6839\u636e\u987a\u5e8f\u5904\u7406\u961f\u5217\u4e2d\u7684\u8ba2\u5355\u3002\u5728\u53cc\u5341\u4e00\u671f\u95f4\uff0c\u77ed\u65f6\u95f4\u5185\u4f1a\u4ea7\u751f\u6d77\u91cf\u8ba2\u5355\uff0c\u9ad8\u5e76\u53d1\u6210\u4e3a\u5de5\u7a0b\u5e08\u4eec\u9700\u8981\u91cd\u70b9\u653b\u514b\u7684\u95ee\u9898\u3002
  • \u5404\u7c7b\u5f85\u529e\u4e8b\u9879\u3002\u4efb\u4f55\u9700\u8981\u5b9e\u73b0\u201c\u5148\u6765\u540e\u5230\u201d\u529f\u80fd\u7684\u573a\u666f\uff0c\u4f8b\u5982\u6253\u5370\u673a\u7684\u4efb\u52a1\u961f\u5217\u3001\u9910\u5385\u7684\u51fa\u9910\u961f\u5217\u7b49\uff0c\u961f\u5217\u5728\u8fd9\u4e9b\u573a\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7ef4\u62a4\u5904\u7406\u987a\u5e8f\u3002
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u6808","text":"

\u6808\uff08stack\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u903b\u8f91\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002

\u6211\u4eec\u53ef\u4ee5\u5c06\u6808\u7c7b\u6bd4\u4e3a\u684c\u9762\u4e0a\u7684\u4e00\u645e\u76d8\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u4eec\u5c06\u76d8\u5b50\u66ff\u6362\u4e3a\u5404\u79cd\u7c7b\u578b\u7684\u5143\u7d20\uff08\u5982\u6574\u6570\u3001\u5b57\u7b26\u3001\u5bf9\u8c61\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u6808\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u3002

\u5982\u56fe 5-1 \u6240\u793a\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u201c\u6808\u9876\u201d\uff0c\u5e95\u90e8\u79f0\u4e3a\u201c\u6808\u5e95\u201d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u6808\u201d\uff0c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u6808\u201d\u3002

\u56fe 5-1 \u00a0 \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u6808\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u4eec\u4ee5\u5e38\u89c1\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u4e3a\u4f8b\u3002

\u8868 5-1 \u00a0 \u6808\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5 \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u6808\uff08\u6dfb\u52a0\u81f3\u6808\u9876\uff09 \\(O(1)\\) pop() \u6808\u9876\u5143\u7d20\u51fa\u6808 \\(O(1)\\) peek() \u8bbf\u95ee\u6808\u9876\u5143\u7d20 \\(O(1)\\)

\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u6808\u7c7b\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8bed\u8a00\u53ef\u80fd\u6ca1\u6709\u4e13\u95e8\u63d0\u4f9b\u6808\u7c7b\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u8bed\u8a00\u7684\u201c\u6570\u7ec4\u201d\u6216\u201c\u94fe\u8868\u201d\u5f53\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u5728\u7a0b\u5e8f\u903b\u8f91\u4e0a\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
# \u521d\u59cb\u5316\u6808\n# Python \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a list \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
stack.java
/* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* \u521d\u59cb\u5316\u6808 */\n// \u5728 Go \u4e2d\uff0c\u63a8\u8350\u5c06 Slice \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u6808 */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\n
stack.swift
/* \u521d\u59cb\u5316\u6808 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.js
/* \u521d\u59cb\u5316\u6808 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.ts
/* \u521d\u59cb\u5316\u6808 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.dart
/* \u521d\u59cb\u5316\u6808 */\n// Dart \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a List \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.removeLast();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* \u521d\u59cb\u5316\u6808 */\n// \u628a Vec \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.pop().unwrap();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = stack.is_empty();\n
stack.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
stack.kt
/* \u521d\u59cb\u5316\u6808 */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u6808 */\nval pop = stack.pop()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = stack.isEmpty()\n
stack.rb
# \u521d\u59cb\u5316\u6808\n# Ruby \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u6808\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u6808\npop = stack.pop\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize = stack.length\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty = stack.empty?\n
stack.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u6808\u7684\u5b9e\u73b0","text":"

\u4e3a\u4e86\u6df1\u5165\u4e86\u89e3\u6808\u7684\u8fd0\u884c\u673a\u5236\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u6808\u7c7b\u3002

\u6808\u9075\u5faa\u5148\u5165\u540e\u51fa\u7684\u539f\u5219\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u80fd\u5728\u6808\u9876\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u6dfb\u52a0\u548c\u5220\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u6808\u53ef\u4ee5\u89c6\u4e3a\u4e00\u79cd\u53d7\u9650\u5236\u7684\u6570\u7ec4\u6216\u94fe\u8868\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u201c\u5c4f\u853d\u201d\u6570\u7ec4\u6216\u94fe\u8868\u7684\u90e8\u5206\u65e0\u5173\u64cd\u4f5c\uff0c\u4f7f\u5176\u5bf9\u5916\u8868\u73b0\u7684\u903b\u8f91\u7b26\u5408\u6808\u7684\u7279\u6027\u3002

"},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u5934\u8282\u70b9\u89c6\u4e3a\u6808\u9876\uff0c\u5c3e\u8282\u70b9\u89c6\u4e3a\u6808\u5e95\u3002

\u5982\u56fe 5-2 \u6240\u793a\uff0c\u5bf9\u4e8e\u5165\u6808\u64cd\u4f5c\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u5143\u7d20\u63d2\u5165\u94fe\u8868\u5934\u90e8\uff0c\u8fd9\u79cd\u8282\u70b9\u63d2\u5165\u65b9\u6cd5\u88ab\u79f0\u4e3a\u201c\u5934\u63d2\u6cd5\u201d\u3002\u800c\u5bf9\u4e8e\u51fa\u6808\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06\u5934\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u5373\u53ef\u3002

LinkedListStackpush()pop()

\u56fe 5-2 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5982\u56fe 5-3 \u6240\u793a\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5206\u522b\u5bf9\u5e94\u5728\u6570\u7ec4\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u4e0e\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(1)\\) \u3002

ArrayStackpush()pop()

\u56fe 5-3 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

\u7531\u4e8e\u5165\u6808\u7684\u5143\u7d20\u53ef\u80fd\u4f1a\u6e90\u6e90\u4e0d\u65ad\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff0c\u8fd9\u6837\u5c31\u65e0\u987b\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":"

\u652f\u6301\u64cd\u4f5c

\u4e24\u79cd\u5b9e\u73b0\u90fd\u652f\u6301\u6808\u5b9a\u4e49\u4e2d\u7684\u5404\u9879\u64cd\u4f5c\u3002\u6570\u7ec4\u5b9e\u73b0\u989d\u5916\u652f\u6301\u968f\u673a\u8bbf\u95ee\uff0c\u4f46\u8fd9\u5df2\u8d85\u51fa\u4e86\u6808\u7684\u5b9a\u4e49\u8303\u7574\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u4f1a\u7528\u5230\u3002

\u65f6\u95f4\u6548\u7387

\u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u5728\u9884\u5148\u5206\u914d\u597d\u7684\u8fde\u7eed\u5185\u5b58\u4e2d\u8fdb\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u7f13\u5b58\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f83\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u6808\u65f6\u8d85\u51fa\u6570\u7ec4\u5bb9\u91cf\uff0c\u4f1a\u89e6\u53d1\u6269\u5bb9\u673a\u5236\uff0c\u5bfc\u81f4\u8be5\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53d8\u4e3a \\(O(n)\\) \u3002

\u5728\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0\u4e2d\uff0c\u94fe\u8868\u7684\u6269\u5bb9\u975e\u5e38\u7075\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u6570\u7ec4\u6269\u5bb9\u65f6\u6548\u7387\u964d\u4f4e\u7684\u95ee\u9898\u3002\u4f46\u662f\uff0c\u5165\u6808\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u8282\u70b9\u5bf9\u8c61\u5e76\u4fee\u6539\u6307\u9488\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u5165\u6808\u5143\u7d20\u672c\u8eab\u5c31\u662f\u8282\u70b9\u5bf9\u8c61\uff0c\u90a3\u4e48\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9aa4\uff0c\u4ece\u800c\u63d0\u9ad8\u6548\u7387\u3002

\u7efc\u4e0a\u6240\u8ff0\uff0c\u5f53\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u6570\u636e\u7c7b\u578b\u65f6\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

  • \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u5728\u89e6\u53d1\u6269\u5bb9\u65f6\u6548\u7387\u4f1a\u964d\u4f4e\uff0c\u4f46\u7531\u4e8e\u6269\u5bb9\u662f\u4f4e\u9891\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
  • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002

\u7a7a\u95f4\u6548\u7387

\u5728\u521d\u59cb\u5316\u5217\u8868\u65f6\uff0c\u7cfb\u7edf\u4f1a\u4e3a\u5217\u8868\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8be5\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\uff1b\u5e76\u4e14\uff0c\u6269\u5bb9\u673a\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u8fdb\u884c\u6269\u5bb9\u7684\uff0c\u6269\u5bb9\u540e\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002

\u7136\u800c\uff0c\u7531\u4e8e\u94fe\u8868\u8282\u70b9\u9700\u8981\u989d\u5916\u5b58\u50a8\u6307\u9488\uff0c\u56e0\u6b64\u94fe\u8868\u8282\u70b9\u5360\u7528\u7684\u7a7a\u95f4\u76f8\u5bf9\u8f83\u5927\u3002

\u7efc\u4e0a\uff0c\u6211\u4eec\u4e0d\u80fd\u7b80\u5355\u5730\u786e\u5b9a\u54ea\u79cd\u5b9e\u73b0\u66f4\u52a0\u8282\u7701\u5185\u5b58\uff0c\u9700\u8981\u9488\u5bf9\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

"},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u6808\u7684\u5178\u578b\u5e94\u7528","text":"
  • \u6d4f\u89c8\u5668\u4e2d\u7684\u540e\u9000\u4e0e\u524d\u8fdb\u3001\u8f6f\u4ef6\u4e2d\u7684\u64a4\u9500\u4e0e\u53cd\u64a4\u9500\u3002\u6bcf\u5f53\u6211\u4eec\u6253\u5f00\u65b0\u7684\u7f51\u9875\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u5bf9\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u540e\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u4e2a\u7f51\u9875\u3002\u540e\u9000\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u5728\u6267\u884c\u51fa\u6808\u3002\u5982\u679c\u8981\u540c\u65f6\u652f\u6301\u540e\u9000\u548c\u524d\u8fdb\uff0c\u90a3\u4e48\u9700\u8981\u4e24\u4e2a\u6808\u6765\u914d\u5408\u5b9e\u73b0\u3002
  • \u7a0b\u5e8f\u5185\u5b58\u7ba1\u7406\u3002\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u5728\u6808\u9876\u6dfb\u52a0\u4e00\u4e2a\u6808\u5e27\uff0c\u7528\u4e8e\u8bb0\u5f55\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u5411\u4e0b\u9012\u63a8\u9636\u6bb5\u4f1a\u4e0d\u65ad\u6267\u884c\u5165\u6808\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u9636\u6bb5\u5219\u4f1a\u4e0d\u65ad\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6808\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002
  • \u5728\u65f6\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u5177\u6709\u8f83\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u6269\u5bb9\u8fc7\u7a0b\u4e2d\uff0c\u5355\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6808\u7684\u94fe\u8868\u5b9e\u73b0\u5177\u6709\u66f4\u4e3a\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002
  • \u5728\u7a7a\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u53ef\u80fd\u5bfc\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u94fe\u8868\u8282\u70b9\u6240\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u6bd4\u6570\u7ec4\u5143\u7d20\u66f4\u5927\u3002
  • \u961f\u5217\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u540c\u6837\u53ef\u4ee5\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u7684\u5bf9\u6bd4\u4e0a\uff0c\u961f\u5217\u7684\u7ed3\u8bba\u4e0e\u524d\u8ff0\u6808\u7684\u7ed3\u8bba\u76f8\u4f3c\u3002
  • \u53cc\u5411\u961f\u5217\u662f\u4e00\u79cd\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u961f\u5217\uff0c\u5b83\u5141\u8bb8\u5728\u4e24\u7aef\u8fdb\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u662f\u5426\u662f\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\uff1f

\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u529f\u80fd\u672c\u8d28\u4e0a\u662f\u201c\u6808\u201d\u7684\u4f53\u73b0\u3002\u5f53\u7528\u6237\u8bbf\u95ee\u4e00\u4e2a\u65b0\u9875\u9762\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u88ab\u6dfb\u52a0\u5230\u6808\u9876\uff1b\u5f53\u7528\u6237\u70b9\u51fb\u540e\u9000\u6309\u94ae\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u4ece\u6808\u9876\u5f39\u51fa\u3002\u4f7f\u7528\u53cc\u5411\u961f\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u5728\u201c\u53cc\u5411\u961f\u5217\u201d\u7ae0\u8282\u6709\u63d0\u5230\u3002

Q\uff1a\u5728\u51fa\u6808\u540e\uff0c\u662f\u5426\u9700\u8981\u91ca\u653e\u51fa\u6808\u8282\u70b9\u7684\u5185\u5b58\uff1f

\u5982\u679c\u540e\u7eed\u4ecd\u9700\u8981\u4f7f\u7528\u5f39\u51fa\u8282\u70b9\uff0c\u5219\u4e0d\u9700\u8981\u91ca\u653e\u5185\u5b58\u3002\u82e5\u4e4b\u540e\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8bed\u8a00\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\u3002

Q\uff1a\u53cc\u5411\u961f\u5217\u50cf\u662f\u4e24\u4e2a\u6808\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u4e48\uff1f

\u53cc\u5411\u961f\u5217\u5c31\u50cf\u662f\u6808\u548c\u961f\u5217\u7684\u7ec4\u5408\u6216\u4e24\u4e2a\u6808\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73b0\u7684\u662f\u6808 + \u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u53ef\u4ee5\u5b9e\u73b0\u6808\u4e0e\u961f\u5217\u7684\u6240\u6709\u5e94\u7528\uff0c\u5e76\u4e14\u66f4\u52a0\u7075\u6d3b\u3002

Q\uff1a\u64a4\u9500\uff08undo\uff09\u548c\u53cd\u64a4\u9500\uff08redo\uff09\u5177\u4f53\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff1f

\u4f7f\u7528\u4e24\u4e2a\u6808\uff0c\u6808 A \u7528\u4e8e\u64a4\u9500\uff0c\u6808 B \u7528\u4e8e\u53cd\u64a4\u9500\u3002

  1. \u6bcf\u5f53\u7528\u6237\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c\uff0c\u5c06\u8fd9\u4e2a\u64cd\u4f5c\u538b\u5165\u6808 A \uff0c\u5e76\u6e05\u7a7a\u6808 B \u3002
  2. \u5f53\u7528\u6237\u6267\u884c\u201c\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 A \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 B \u3002
  3. \u5f53\u7528\u6237\u6267\u884c\u201c\u53cd\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 B \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 A \u3002
"},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6811","text":"

Abstract

\u53c2\u5929\u5927\u6811\u5145\u6ee1\u751f\u547d\u529b\uff0c\u6839\u6df1\u53f6\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

\u5b83\u4e3a\u6211\u4eec\u5c55\u73b0\u4e86\u6570\u636e\u5206\u6cbb\u7684\u751f\u52a8\u5f62\u6001\u3002

"},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 7.1 \u00a0 \u4e8c\u53c9\u6811
  • 7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386
  • 7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a
  • 7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811
  • 7.5 \u00a0 AVL \u6811 *
  • 7.6 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

\u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u4e48\uff0c\u6211\u4eec\u80fd\u5426\u7528\u6570\u7ec4\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\u3002\u7ed9\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u6240\u6709\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u5219\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\u3002

\u6839\u636e\u5c42\u5e8f\u904d\u5386\u7684\u7279\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u63a8\u5bfc\u51fa\u7236\u8282\u70b9\u7d22\u5f15\u4e0e\u5b50\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u201c\u6620\u5c04\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(i\\) \uff0c\u5219\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \u3002\u56fe 7-12 \u5c55\u793a\u4e86\u5404\u4e2a\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\u3002

\u56fe 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u6620\u5c04\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u7ed9\u5b9a\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u7279\u4f8b\uff0c\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\u901a\u5e38\u5b58\u5728\u8bb8\u591a None \u3002\u7531\u4e8e\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b None \uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b None \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\u3002\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002

\u5982\u56fe 7-13 \u6240\u793a\uff0c\u7ed9\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u4e0a\u8ff0\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

\u56fe 7-13 \u00a0 \u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5bf9\u5e94\u591a\u79cd\u4e8c\u53c9\u6811\u53ef\u80fd\u6027

\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u4e2d\u663e\u5f0f\u5730\u5199\u51fa\u6240\u6709 None \u3002\u5982\u56fe 7-14 \u6240\u793a\uff0c\u8fd9\u6837\u5904\u7406\u540e\uff0c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u53c9\u6811\u4e86\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\n# \u4f7f\u7528 None \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6807\u8bb0\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88c5\u7c7b Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 any \u7c7b\u578b\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 None \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
### \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a ###\n# \u4f7f\u7528 nil \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
\n

\u56fe 7-14 \u00a0 \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u4f7f\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u56de\u987e\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u5b9a\u4e49\uff0cNone \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002

\u8fd9\u610f\u5473\u7740\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u56fe 7-15 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u4f8b\u5b50\u3002

\u56fe 7-15 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u68f5\u57fa\u4e8e\u6570\u7ec4\u8868\u793a\u7684\u4e8c\u53c9\u6811\uff0c\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u64cd\u4f5c\u3002

  • \u7ed9\u5b9a\u67d0\u8282\u70b9\uff0c\u83b7\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3001\u7236\u8282\u70b9\u3002
  • \u83b7\u53d6\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u3001\u540e\u5e8f\u904d\u5386\u3001\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

  • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\u3002
  • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\u3002
  • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\u3002

\u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

  • \u6570\u7ec4\u5b58\u50a8\u9700\u8981\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5b58\u50a8\u6570\u636e\u91cf\u8fc7\u5927\u7684\u6811\u3002
  • \u589e\u5220\u8282\u70b9\u9700\u8981\u901a\u8fc7\u6570\u7ec4\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u5b9e\u73b0\uff0c\u6548\u7387\u8f83\u4f4e\u3002
  • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf None \u65f6\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u7684\u8282\u70b9\u6570\u636e\u6bd4\u91cd\u8f83\u4f4e\uff0c\u7a7a\u95f4\u5229\u7528\u7387\u8f83\u4f4e\u3002
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6811 *","text":"

\u5728\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7ae0\u8282\u4e2d\u6211\u4eec\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u9000\u5316\u4e3a\u94fe\u8868\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u52a3\u5316\u4e3a \\(O(n)\\) \u3002

\u5982\u56fe 7-24 \u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

\u56fe 7-24 \u00a0 AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u56fe 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e24\u4e2a\u8282\u70b9\u540e\uff0c\u6811\u5c06\u4e25\u91cd\u5411\u5de6\u503e\u659c\uff0c\u67e5\u627e\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u968f\u4e4b\u52a3\u5316\u3002

\u56fe 7-25 \u00a0 AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8bba\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6811\u3002\u8bba\u6587\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u6301\u7eed\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4e0d\u4f1a\u9000\u5316\uff0c\u4ece\u800c\u4f7f\u5f97\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7ea7\u522b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5728\u9700\u8981\u9891\u7e41\u8fdb\u884c\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u573a\u666f\u4e2d\uff0cAVL \u6811\u80fd\u59cb\u7ec8\u4fdd\u6301\u9ad8\u6548\u7684\u6570\u636e\u64cd\u4f5c\u6027\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u5e94\u7528\u4ef7\u503c\u3002

"},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

AVL \u6811\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u53c9\u6811\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e24\u7c7b\u4e8c\u53c9\u6811\u7684\u6240\u6709\u6027\u8d28\uff0c\u56e0\u6b64\u662f\u4e00\u79cd\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff08balanced binary search tree\uff09\u3002

"},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u8282\u70b9\u9ad8\u5ea6","text":"

\u7531\u4e8e AVL \u6811\u7684\u76f8\u5173\u64cd\u4f5c\u9700\u8981\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e3a\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u8282\u70b9\u503c\n        self.height: int = 0                # \u8282\u70b9\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\n    int val{};          // \u8282\u70b9\u503c\n    int height = 0;     // \u8282\u70b9\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\n    TreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    public int val;        // \u8282\u70b9\u503c\n    public int height;     // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u8282\u70b9\n    public TreeNode right; // \u53f3\u5b50\u8282\u70b9\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public int height;      // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val    int       // \u8282\u70b9\u503c\n    Height int       // \u8282\u70b9\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var height: Int // \u8282\u70b9\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    height; //\u8282\u70b9\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;            // \u8282\u70b9\u503c\n    height: number;         // \u8282\u70b9\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  int height;      // \u8282\u70b9\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    height: i32,                            // \u8282\u70b9\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val height: Int = 0          // \u8282\u70b9\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\n}\n
### AVL \u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :height # \u8282\u70b9\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
\n

\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\u5b83\u7684\u6700\u8fdc\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u5373\u6240\u7ecf\u8fc7\u7684\u201c\u8fb9\u201d\u7684\u6570\u91cf\u3002\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff0c\u53f6\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(0\\) \uff0c\u800c\u7a7a\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(-1\\) \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e24\u4e2a\u5de5\u5177\u51fd\u6570\uff0c\u5206\u522b\u7528\u4e8e\u83b7\u53d6\u548c\u66f4\u65b0\u8282\u70b9\u7684\u9ad8\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u4e49\u4e3a\u8282\u70b9\u5de6\u5b50\u6811\u7684\u9ad8\u5ea6\u51cf\u53bb\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\uff0c\u540c\u65f6\u89c4\u5b9a\u7a7a\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4e3a \\(0\\) \u3002\u6211\u4eec\u540c\u6837\u5c06\u83b7\u53d6\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

\u8bbe\u5e73\u8861\u56e0\u5b50\u4e3a \\(f\\) \uff0c\u5219\u4e00\u68f5 AVL \u6811\u7684\u4efb\u610f\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6ee1\u8db3 \\(-1 \\le f \\le 1\\) \u3002

"},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6811\u65cb\u8f6c","text":"

AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u201c\u65cb\u8f6c\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u591f\u5728\u4e0d\u5f71\u54cd\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u65cb\u8f6c\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7684\u6027\u8d28\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u201c\u5e73\u8861\u4e8c\u53c9\u6811\u201d\u3002

\u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5931\u8861\u8282\u70b9\u201d\u3002\u6839\u636e\u8282\u70b9\u5931\u8861\u60c5\u51b5\u7684\u4e0d\u540c\uff0c\u65cb\u8f6c\u64cd\u4f5c\u5206\u4e3a\u56db\u79cd\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3002\u4e0b\u9762\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

\u5982\u56fe 7-26 \u6240\u793a\uff0c\u8282\u70b9\u4e0b\u65b9\u4e3a\u5e73\u8861\u56e0\u5b50\u3002\u4ece\u5e95\u81f3\u9876\u770b\uff0c\u4e8c\u53c9\u6811\u4e2d\u9996\u4e2a\u5931\u8861\u8282\u70b9\u662f\u201c\u8282\u70b9 3\u201d\u3002\u6211\u4eec\u5173\u6ce8\u4ee5\u8be5\u5931\u8861\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\uff0c\u5c06\u8be5\u8282\u70b9\u8bb0\u4e3a node \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u8bb0\u4e3a child \uff0c\u6267\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u3002

<1><2><3><4>

\u56fe 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9aa4

\u5982\u56fe 7-27 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

\u56fe 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

\u201c\u5411\u53f3\u65cb\u8f6c\u201d\u662f\u4e00\u79cd\u5f62\u8c61\u5316\u7684\u8bf4\u6cd5\uff0c\u5b9e\u9645\u4e0a\u9700\u8981\u901a\u8fc7\u4fee\u6539\u8282\u70b9\u6307\u9488\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

\u76f8\u5e94\u5730\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u56fe 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

\u56fe 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u5982\u56fe 7-29 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

\u56fe 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

\u53ef\u4ee5\u89c2\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u903b\u8f91\u4e0a\u662f\u955c\u50cf\u5bf9\u79f0\u7684\uff0c\u5b83\u4eec\u5206\u522b\u89e3\u51b3\u7684\u4e24\u79cd\u5931\u8861\u60c5\u51b5\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u57fa\u4e8e\u5bf9\u79f0\u6027\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u53f3\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

\u5bf9\u4e8e\u56fe 7-30 \u4e2d\u7684\u5931\u8861\u8282\u70b9 3 \uff0c\u4ec5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u65e0\u6cd5\u4f7f\u5b50\u6811\u6062\u590d\u5e73\u8861\u3002\u6b64\u65f6\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u53f3\u65cb\u201d\u3002

\u56fe 7-30 \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

\u5982\u56fe 7-31 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u5de6\u65cb\u201d\u3002

\u56fe 7-31 \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f6c\u7684\u9009\u62e9","text":"

\u56fe 7-32 \u5c55\u793a\u7684\u56db\u79cd\u5931\u8861\u60c5\u51b5\u4e0e\u4e0a\u8ff0\u6848\u4f8b\u9010\u4e2a\u5bf9\u5e94\uff0c\u5206\u522b\u9700\u8981\u91c7\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

\u56fe 7-32 \u00a0 AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u4eec\u901a\u8fc7\u5224\u65ad\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f83\u9ad8\u4e00\u4fa7\u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8d1f\u53f7\uff0c\u6765\u786e\u5b9a\u5931\u8861\u8282\u70b9\u5c5e\u4e8e\u56fe 7-32 \u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

\u8868 7-3 \u00a0 \u56db\u79cd\u65cb\u8f6c\u60c5\u51b5\u7684\u9009\u62e9\u6761\u4ef6

\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5e94\u91c7\u7528\u7684\u65cb\u8f6c\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(>0\\) \u5148\u53f3\u65cb\u540e\u5de6\u65cb

\u4e3a\u4e86\u4fbf\u4e8e\u4f7f\u7528\uff0c\u6211\u4eec\u5c06\u65cb\u8f6c\u64cd\u4f5c\u5c01\u88c5\u6210\u4e00\u4e2a\u51fd\u6570\u3002\u6709\u4e86\u8fd9\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u5c31\u80fd\u5bf9\u5404\u79cd\u5931\u8861\u60c5\u51b5\u8fdb\u884c\u65cb\u8f6c\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

AVL \u6811\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u5728\u4e3b\u4f53\u4e0a\u7c7b\u4f3c\u3002\u552f\u4e00\u7684\u533a\u522b\u5728\u4e8e\uff0c\u5728 AVL \u6811\u4e2d\u63d2\u5165\u8282\u70b9\u540e\uff0c\u4ece\u8be5\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e00\u7cfb\u5217\u5931\u8861\u8282\u70b9\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4ece\u8fd9\u4e2a\u8282\u70b9\u5f00\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u7c7b\u4f3c\u5730\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5220\u9664\u8282\u70b9\u65b9\u6cd5\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u4ece\u5e95\u81f3\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

AVL \u6811\u7684\u8282\u70b9\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
  • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\u3002
  • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\u3002
  • \u7ea2\u9ed1\u6811\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u3002\u76f8\u8f83\u4e8e AVL \u6811\uff0c\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u66f4\u5bbd\u677e\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u66f4\u5c11\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

\u5982\u56fe 7-16 \u6240\u793a\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\uff08binary search tree\uff09\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002

  1. \u5bf9\u4e8e\u6839\u8282\u70b9\uff0c\u5de6\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c \\(<\\) \u6839\u8282\u70b9\u7684\u503c \\(<\\) \u53f3\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c\u3002
  2. \u4efb\u610f\u8282\u70b9\u7684\u5de6\u3001\u53f3\u5b50\u6811\u4e5f\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5373\u540c\u6837\u6ee1\u8db3\u6761\u4ef6 1. \u3002

\u56fe 7-16 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811

"},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":"

\u6211\u4eec\u5c06\u4e8c\u53c9\u641c\u7d22\u6811\u5c01\u88c5\u4e3a\u4e00\u4e2a\u7c7b BinarySearchTree \uff0c\u5e76\u58f0\u660e\u4e00\u4e2a\u6210\u5458\u53d8\u91cf root \uff0c\u6307\u5411\u6811\u7684\u6839\u8282\u70b9\u3002

"},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

\u7ed9\u5b9a\u76ee\u6807\u8282\u70b9\u503c num \uff0c\u53ef\u4ee5\u6839\u636e\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u6765\u67e5\u627e\u3002\u5982\u56fe 7-17 \u6240\u793a\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u8282\u70b9 cur \uff0c\u4ece\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9 root \u51fa\u53d1\uff0c\u5faa\u73af\u6bd4\u8f83\u8282\u70b9\u503c cur.val \u548c num \u4e4b\u95f4\u7684\u5927\u5c0f\u5173\u7cfb\u3002

  • \u82e5 cur.val < num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.right \u3002
  • \u82e5 cur.val > num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.left \u3002
  • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\u3002
<1><2><3><4>

\u56fe 7-17 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u8282\u70b9\u793a\u4f8b

\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u60c5\u51b5\u3002\u5faa\u73af\u6b21\u6570\u6700\u591a\u4e3a\u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff0c\u5f53\u4e8c\u53c9\u6811\u5e73\u8861\u65f6\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u4e3a\u4e86\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-18 \u6240\u793a\u3002

  1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff1a\u4e0e\u67e5\u627e\u64cd\u4f5c\u76f8\u4f3c\uff0c\u4ece\u6839\u8282\u70b9\u51fa\u53d1\uff0c\u6839\u636e\u5f53\u524d\u8282\u70b9\u503c\u548c num \u7684\u5927\u5c0f\u5173\u7cfb\u5faa\u73af\u5411\u4e0b\u641c\u7d22\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\uff08\u904d\u5386\u81f3 None \uff09\u65f6\u8df3\u51fa\u5faa\u73af\u3002
  2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e None \u7684\u4f4d\u7f6e\u3002

\u56fe 7-18 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

  • \u4e8c\u53c9\u641c\u7d22\u6811\u4e0d\u5141\u8bb8\u5b58\u5728\u91cd\u590d\u8282\u70b9\uff0c\u5426\u5219\u5c06\u8fdd\u53cd\u5176\u5b9a\u4e49\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u8282\u70b9\u5728\u6811\u4e2d\u5df2\u5b58\u5728\uff0c\u5219\u4e0d\u6267\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
  • \u4e3a\u4e86\u5b9e\u73b0\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\u3002\u8fd9\u6837\u5728\u904d\u5386\u81f3 None \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u83b7\u53d6\u5230\u5176\u7236\u8282\u70b9\uff0c\u4ece\u800c\u5b8c\u6210\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4e0e\u67e5\u627e\u8282\u70b9\u76f8\u540c\uff0c\u63d2\u5165\u8282\u70b9\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

"},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u5148\u5728\u4e8c\u53c9\u6811\u4e2d\u67e5\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u518d\u5c06\u5176\u5220\u9664\u3002\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u4ecd\u7136\u6ee1\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u6839\u636e\u76ee\u6807\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u79cd\u60c5\u51b5\uff0c\u6267\u884c\u5bf9\u5e94\u7684\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u3002

\u5982\u56fe 7-19 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \u65f6\uff0c\u8868\u793a\u8be5\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

\u56fe 7-19 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0 \uff09

\u5982\u56fe 7-20 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

\u56fe 7-20 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1 \uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(2\\) \u65f6\uff0c\u6211\u4eec\u65e0\u6cd5\u76f4\u63a5\u5220\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u8282\u70b9\u66ff\u6362\u8be5\u8282\u70b9\u3002\u7531\u4e8e\u8981\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u56e0\u6b64\u8fd9\u4e2a\u8282\u70b9\u53ef\u4ee5\u662f\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\u6216\u5de6\u5b50\u6811\u7684\u6700\u5927\u8282\u70b9\u3002

\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\uff08\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\uff0c\u5219\u5220\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-21 \u6240\u793a\u3002

  1. \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\u5728\u201c\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff0c\u8bb0\u4e3a tmp \u3002
  2. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff0c\u5e76\u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \u3002
<1><2><3><4>

\u56fe 7-21 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 2 \uff09

\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u540c\u6837\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d\u67e5\u627e\u5f85\u5220\u9664\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u540e\u7ee7\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u904d\u5386\u6709\u5e8f","text":"

\u5982\u56fe 7-22 \u6240\u793a\uff0c\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u904d\u5386\u987a\u5e8f\uff0c\u800c\u4e8c\u53c9\u641c\u7d22\u6811\u6ee1\u8db3\u201c\u5de6\u5b50\u8282\u70b9 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u8282\u70b9\u201d\u7684\u5927\u5c0f\u5173\u7cfb\u3002

\u8fd9\u610f\u5473\u7740\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u8fdb\u884c\u4e2d\u5e8f\u904d\u5386\u65f6\uff0c\u603b\u662f\u4f1a\u4f18\u5148\u904d\u5386\u4e0b\u4e00\u4e2a\u6700\u5c0f\u8282\u70b9\uff0c\u4ece\u800c\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u6027\u8d28\uff1a\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

\u5229\u7528\u4e2d\u5e8f\u904d\u5386\u5347\u5e8f\u7684\u6027\u8d28\uff0c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u83b7\u53d6\u6709\u5e8f\u6570\u636e\u4ec5\u9700 \\(O(n)\\) \u65f6\u95f4\uff0c\u65e0\u987b\u8fdb\u884c\u989d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

\u56fe 7-22 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002\u89c2\u5bdf\u8868 7-2 \uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f\u5bf9\u6570\u9636\uff0c\u5177\u6709\u7a33\u5b9a\u4e14\u9ad8\u6548\u7684\u6027\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u6570\u636e\u7684\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

\u8868 7-2 \u00a0 \u6570\u7ec4\u4e0e\u641c\u7d22\u6811\u7684\u6548\u7387\u5bf9\u6bd4

\u65e0\u5e8f\u6570\u7ec4 \u4e8c\u53c9\u641c\u7d22\u6811 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

\u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f6e\u5faa\u73af\u5185\u67e5\u627e\u4efb\u610f\u8282\u70b9\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u4e0d\u65ad\u5730\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\uff0c\u53ef\u80fd\u5bfc\u81f4\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u56fe 7-23 \u6240\u793a\u7684\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

\u56fe 7-23 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
  • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
  • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
  • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u53c9\u6811","text":"

\u4e8c\u53c9\u6811\uff08binary tree\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u4e8c\u53c9\u6811\u7684\u57fa\u672c\u5355\u5143\u662f\u8282\u70b9\uff0c\u6bcf\u4e2a\u8282\u70b9\u5305\u542b\u503c\u3001\u5de6\u5b50\u8282\u70b9\u5f15\u7528\u548c\u53f3\u5b50\u8282\u70b9\u5f15\u7528\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    int val;          // \u8282\u70b9\u503c\n    TreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    int val;         // \u8282\u70b9\u503c\n    TreeNode left;   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n        Right: nil, // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n        Val:   v,   // \u8282\u70b9\u503c\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct TreeNode {\n    int val;                // \u8282\u70b9\u503c\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    struct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
### \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
\n

\u6bcf\u4e2a\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u5206\u522b\u6307\u5411\u5de6\u5b50\u8282\u70b9\uff08left-child node\uff09\u548c\u53f3\u5b50\u8282\u70b9\uff08right-child node\uff09\uff0c\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u7236\u8282\u70b9\uff08parent node\uff09\u3002\u5f53\u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u65f6\uff0c\u6211\u4eec\u5c06\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6811\uff08right subtree\uff09\u3002

\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u9664\u53f6\u8282\u70b9\u5916\uff0c\u5176\u4ed6\u6240\u6709\u8282\u70b9\u90fd\u5305\u542b\u5b50\u8282\u70b9\u548c\u975e\u7a7a\u5b50\u6811\u3002\u5982\u56fe 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c06\u201c\u8282\u70b9 2\u201d\u89c6\u4e3a\u7236\u8282\u70b9\uff0c\u5219\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u5206\u522b\u662f\u201c\u8282\u70b9 4\u201d\u548c\u201c\u8282\u70b9 5\u201d\uff0c\u5de6\u5b50\u6811\u662f\u201c\u8282\u70b9 4 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\uff0c\u53f3\u5b50\u6811\u662f\u201c\u8282\u70b9 5 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\u3002

\u56fe 7-1 \u00a0 \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

"},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

\u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed\u5982\u56fe 7-2 \u6240\u793a\u3002

  • \u6839\u8282\u70b9\uff08root node\uff09\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\u3002
  • \u53f6\u8282\u70b9\uff08leaf node\uff09\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 None \u3002
  • \u8fb9\uff08edge\uff09\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002
  • \u8282\u70b9\u6240\u5728\u7684\u5c42\uff08level\uff09\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \u3002
  • \u8282\u70b9\u7684\u5ea6\uff08degree\uff09\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u8303\u56f4\u662f 0\u30011\u30012 \u3002
  • \u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
  • \u8282\u70b9\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
  • \u8282\u70b9\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u8ddd\u79bb\u8be5\u8282\u70b9\u6700\u8fdc\u7684\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002

\u56fe 7-2 \u00a0 \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

Tip

\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8282\u70b9\u7684\u6570\u91cf\u201d\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

"},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u53c9\u6811","text":"

\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\uff08\u6307\u9488\uff09\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// \u521d\u59cb\u5316\u8282\u70b9\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
# \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9","text":"

\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u3002\u56fe 7-3 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u793a\u4f8b\u3002

\u56fe 7-3 \u00a0 \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = p\np.left = n2\n# \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.cpp
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.cs
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.go
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.js
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.ts
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.dart
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u5220\u9664\u8282\u70b9 p\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.rb
# \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 _p\nn1.left = _p\n_p.left = n2\n# \u5220\u9664\u8282\u70b9\nn1.left = n2\n
binary_tree.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u8282\u70b9\u53ef\u80fd\u4f1a\u6539\u53d8\u4e8c\u53c9\u6811\u7684\u539f\u6709\u903b\u8f91\u7ed3\u6784\uff0c\u800c\u5220\u9664\u8282\u70b9\u901a\u5e38\u610f\u5473\u7740\u5220\u9664\u8be5\u8282\u70b9\u53ca\u5176\u6240\u6709\u5b50\u6811\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5b9e\u73b0\u6709\u5b9e\u9645\u610f\u4e49\u7684\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff08perfect binary tree\uff09\u6240\u6709\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u5b8c\u5168\u586b\u6ee1\u3002\u5728\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\uff0c\u53f6\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u7684\u5ea6\u90fd\u4e3a \\(2\\) \uff1b\u82e5\u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \uff0c\u5219\u8282\u70b9\u603b\u6570\u4e3a \\(2^{h+1} - 1\\) \uff0c\u5448\u73b0\u6807\u51c6\u7684\u6307\u6570\u7ea7\u5173\u7cfb\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u89c1\u7684\u7ec6\u80de\u5206\u88c2\u73b0\u8c61\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u6ee1\u4e8c\u53c9\u6811\u3002

\u56fe 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c42\u7684\u8282\u70b9\u672a\u88ab\u586b\u6ee1\uff0c\u4e14\u6700\u5e95\u5c42\u8282\u70b9\u5c3d\u91cf\u9760\u5de6\u586b\u5145\u3002

\u56fe 7-5 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-6 \u6240\u793a\uff0c\u5b8c\u6ee1\u4e8c\u53c9\u6811\uff08full binary tree\uff09\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

\u56fe 7-6 \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u53c9\u6811\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u8282\u70b9\u7684\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7edd\u5bf9\u503c\u4e0d\u8d85\u8fc7 1 \u3002

\u56fe 7-7 \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

\u56fe 7-8 \u5c55\u793a\u4e86\u4e8c\u53c9\u6811\u7684\u7406\u60f3\u7ed3\u6784\u4e0e\u9000\u5316\u7ed3\u6784\u3002\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u201c\u94fe\u8868\u201d\u3002

  • \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u7406\u60f3\u60c5\u51b5\uff0c\u53ef\u4ee5\u5145\u5206\u53d1\u6325\u4e8c\u53c9\u6811\u201c\u5206\u6cbb\u201d\u7684\u4f18\u52bf\u3002
  • \u94fe\u8868\u5219\u662f\u53e6\u4e00\u4e2a\u6781\u7aef\uff0c\u5404\u9879\u64cd\u4f5c\u90fd\u53d8\u4e3a\u7ebf\u6027\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u56fe 7-8 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

\u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7ed3\u6784\u548c\u6700\u5dee\u7ed3\u6784\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf\u3001\u8282\u70b9\u603b\u6570\u3001\u9ad8\u5ea6\u7b49\u8fbe\u5230\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u3002

\u8868 7-1 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

\u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u7684\u6811\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

\u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

\u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

\u5982\u56fe 7-9 \u6240\u793a\uff0c\u5c42\u5e8f\u904d\u5386\uff08level-order traversal\uff09\u4ece\u9876\u90e8\u5230\u5e95\u90e8\u9010\u5c42\u904d\u5386\u4e8c\u53c9\u6811\uff0c\u5e76\u5728\u6bcf\u4e00\u5c42\u6309\u7167\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\u8bbf\u95ee\u8282\u70b9\u3002

\u5c42\u5e8f\u904d\u5386\u672c\u8d28\u4e0a\u5c5e\u4e8e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\uff08breadth-first traversal\uff09\uff0c\u4e5f\u79f0\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\u3002

\u56fe 7-9 \u00a0 \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u201c\u961f\u5217\u201d\u6765\u5b9e\u73b0\u3002\u961f\u5217\u9075\u5faa\u201c\u5148\u8fdb\u5148\u51fa\u201d\u7684\u89c4\u5219\uff0c\u800c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5219\u9075\u5faa\u201c\u9010\u5c42\u63a8\u8fdb\u201d\u7684\u89c4\u5219\uff0c\u4e24\u8005\u80cc\u540e\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
binary_tree_bfs.cpp
/* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d \\(n\\) \u4e3a\u8282\u70b9\u6570\u91cf\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6ee1\u4e8c\u53c9\u6811\u65f6\uff0c\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u6700\u591a\u540c\u65f6\u5b58\u5728 \\((n + 1) / 2\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002
"},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

\u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\uff08depth-first traversal\uff09\uff0c\u4e5f\u79f0\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff08depth-first search, DFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\u3002

\u56fe 7-10 \u5c55\u793a\u4e86\u5bf9\u4e8c\u53c9\u6811\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u68f5\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u4e2a\u8282\u70b9\u90fd\u4f1a\u9047\u5230\u4e09\u4e2a\u4f4d\u7f6e\uff0c\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u3002

\u56fe 7-10 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4e5f\u53ef\u4ee5\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

\u56fe 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u904d\u5386\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5176\u53ef\u5206\u4e3a\u201c\u9012\u201d\u548c\u201c\u5f52\u201d\u4e24\u4e2a\u9006\u5411\u7684\u90e8\u5206\u3002

  1. \u201c\u9012\u201d\u8868\u793a\u5f00\u542f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5e8f\u5728\u6b64\u8fc7\u7a0b\u4e2d\u8bbf\u95ee\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002
  2. \u201c\u5f52\u201d\u8868\u793a\u51fd\u6570\u8fd4\u56de\uff0c\u4ee3\u8868\u5f53\u524d\u8282\u70b9\u5df2\u7ecf\u8bbf\u95ee\u5b8c\u6bd5\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 7-11 \u00a0 \u524d\u5e8f\u904d\u5386\u7684\u9012\u5f52\u8fc7\u7a0b

"},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u7cfb\u7edf\u5360\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u4e8c\u53c9\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4f53\u73b0\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u6bcf\u4e2a\u4e8c\u53c9\u6811\u8282\u70b9\u5305\u542b\u4e00\u4e2a\u503c\u4ee5\u53ca\u4e24\u4e2a\u6307\u9488\uff0c\u5206\u522b\u6307\u5411\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u3002
  • \u5bf9\u4e8e\u4e8c\u53c9\u6811\u4e2d\u7684\u67d0\u4e2a\u8282\u70b9\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6811\u88ab\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6811\u3002
  • \u4e8c\u53c9\u6811\u7684\u76f8\u5173\u672f\u8bed\u5305\u62ec\u6839\u8282\u70b9\u3001\u53f6\u8282\u70b9\u3001\u5c42\u3001\u5ea6\u3001\u8fb9\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
  • \u4e8c\u53c9\u6811\u7684\u521d\u59cb\u5316\u3001\u8282\u70b9\u63d2\u5165\u548c\u8282\u70b9\u5220\u9664\u64cd\u4f5c\u4e0e\u94fe\u8868\u64cd\u4f5c\u65b9\u6cd5\u7c7b\u4f3c\u3002
  • \u5e38\u89c1\u7684\u4e8c\u53c9\u6811\u7c7b\u578b\u6709\u5b8c\u7f8e\u4e8c\u53c9\u6811\u3001\u5b8c\u5168\u4e8c\u53c9\u6811\u3001\u5b8c\u6ee1\u4e8c\u53c9\u6811\u548c\u5e73\u8861\u4e8c\u53c9\u6811\u3002\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u6700\u7406\u60f3\u7684\u72b6\u6001\uff0c\u800c\u94fe\u8868\u662f\u9000\u5316\u540e\u7684\u6700\u5dee\u72b6\u6001\u3002
  • \u4e8c\u53c9\u6811\u53ef\u4ee5\u7528\u6570\u7ec4\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c06\u8282\u70b9\u503c\u548c\u7a7a\u4f4d\u6309\u5c42\u5e8f\u904d\u5386\u987a\u5e8f\u6392\u5217\uff0c\u5e76\u6839\u636e\u7236\u8282\u70b9\u4e0e\u5b50\u8282\u70b9\u4e4b\u95f4\u7684\u7d22\u5f15\u6620\u5c04\u5173\u7cfb\u6765\u5b9e\u73b0\u6307\u9488\u3002
  • \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386\u662f\u4e00\u79cd\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u65b9\u6cd5\uff0c\u5b83\u4f53\u73b0\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u901a\u8fc7\u961f\u5217\u6765\u5b9e\u73b0\u3002
  • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u7686\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u5b83\u4eec\u4f53\u73b0\u4e86\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u6765\u5b9e\u73b0\u3002
  • \u4e8c\u53c9\u641c\u7d22\u6811\u662f\u4e00\u79cd\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u627e\u6570\u636e\u7ed3\u6784\uff0c\u5176\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \u3002\u5f53\u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u5404\u9879\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • AVL \u6811\uff0c\u4e5f\u79f0\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\u6811\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
  • AVL \u6811\u7684\u65cb\u8f6c\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4f1a\u4ece\u5e95\u5411\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5bf9\u4e8e\u53ea\u6709\u4e00\u4e2a\u8282\u70b9\u7684\u4e8c\u53c9\u6811\uff0c\u6811\u7684\u9ad8\u5ea6\u548c\u6839\u8282\u70b9\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u5417\uff1f

\u662f\u7684\uff0c\u56e0\u4e3a\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\u3002

Q\uff1a\u4e8c\u53c9\u6811\u4e2d\u7684\u63d2\u5165\u4e0e\u5220\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u8fd9\u91cc\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u4e48\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u4e3a\u8d44\u6e90\u7684\u5b50\u8282\u70b9\u7684\u8d44\u6e90\u91ca\u653e\u5417\uff1f

\u62ff\u4e8c\u53c9\u641c\u7d22\u6811\u6765\u4e3e\u4f8b\uff0c\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u8981\u5206\u4e09\u79cd\u60c5\u51b5\u5904\u7406\uff0c\u5176\u4e2d\u6bcf\u79cd\u60c5\u51b5\u90fd\u9700\u8981\u8fdb\u884c\u591a\u4e2a\u6b65\u9aa4\u7684\u8282\u70b9\u64cd\u4f5c\u3002

Q\uff1a\u4e3a\u4ec0\u4e48 DFS \u904d\u5386\u4e8c\u53c9\u6811\u6709\u524d\u3001\u4e2d\u3001\u540e\u4e09\u79cd\u987a\u5e8f\uff0c\u5206\u522b\u6709\u4ec0\u4e48\u7528\u5462\uff1f

\u4e0e\u987a\u5e8f\u548c\u9006\u5e8f\u904d\u5386\u6570\u7ec4\u7c7b\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u662f\u4e09\u79cd\u4e8c\u53c9\u6811\u904d\u5386\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u4eec\u5f97\u5230\u4e00\u4e2a\u7279\u5b9a\u987a\u5e8f\u7684\u904d\u5386\u7ed3\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\uff0c\u7531\u4e8e\u8282\u70b9\u5927\u5c0f\u6ee1\u8db3 \u5de6\u5b50\u8282\u70b9\u503c < \u6839\u8282\u70b9\u503c < \u53f3\u5b50\u8282\u70b9\u503c \uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u4f18\u5148\u7ea7\u904d\u5386\u6811\uff0c\u5c31\u53ef\u4ee5\u83b7\u5f97\u6709\u5e8f\u7684\u8282\u70b9\u5e8f\u5217\u3002

Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u5904\u7406\u5931\u8861\u8282\u70b9 node\u3001child\u3001grand_child \u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u90a3 node \u7684\u7236\u8282\u70b9\u548c node \u539f\u6765\u7684\u8fde\u63a5\u4e0d\u9700\u8981\u7ef4\u62a4\u5417\uff1f\u53f3\u65cb\u64cd\u4f5c\u540e\u5c82\u4e0d\u662f\u65ad\u6389\u4e86\uff1f

\u6211\u4eec\u9700\u8981\u4ece\u9012\u5f52\u7684\u89c6\u89d2\u6765\u770b\u8fd9\u4e2a\u95ee\u9898\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u4f20\u5165\u7684\u662f\u5b50\u6811\u7684\u6839\u8282\u70b9\uff0c\u6700\u7ec8 return child \u8fd4\u56de\u65cb\u8f6c\u4e4b\u540e\u7684\u5b50\u6811\u7684\u6839\u8282\u70b9\u3002\u5b50\u6811\u7684\u6839\u8282\u70b9\u548c\u5176\u7236\u8282\u70b9\u7684\u8fde\u63a5\u662f\u5728\u8be5\u51fd\u6570\u8fd4\u56de\u540e\u5b8c\u6210\u7684\uff0c\u4e0d\u5c5e\u4e8e\u53f3\u65cb\u64cd\u4f5c\u7684\u7ef4\u62a4\u8303\u56f4\u3002

Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u6570\u88ab\u5212\u5206\u5230 private \u548c public \u4e2d\uff0c\u8fd9\u65b9\u9762\u6709\u4ec0\u4e48\u8003\u91cf\u5417\uff1f\u4e3a\u4ec0\u4e48\u8981\u5c06 height() \u51fd\u6570\u548c updateHeight() \u51fd\u6570\u5206\u522b\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

\u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u8303\u56f4\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u7c7b\u5185\u90e8\u4f7f\u7528\uff0c\u90a3\u4e48\u5c31\u8bbe\u8ba1\u4e3a private \u3002\u4f8b\u5982\uff0c\u7528\u6237\u5355\u72ec\u8c03\u7528 updateHeight() \u662f\u6ca1\u6709\u610f\u4e49\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8bbf\u95ee\u8282\u70b9\u9ad8\u5ea6\uff0c\u7c7b\u4f3c\u4e8e vector.size() \uff0c\u56e0\u6b64\u8bbe\u7f6e\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

Q\uff1a\u5982\u4f55\u4ece\u4e00\u7ec4\u8f93\u5165\u6570\u636e\u6784\u5efa\u4e00\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\uff1f\u6839\u8282\u70b9\u7684\u9009\u62e9\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

\u662f\u7684\uff0c\u6784\u5efa\u6811\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4ee3\u7801\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7ed9\u51fa\u3002\u81f3\u4e8e\u6839\u8282\u70b9\u7684\u9009\u62e9\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u8f93\u5165\u6570\u636e\u6392\u5e8f\uff0c\u7136\u540e\u5c06\u4e2d\u70b9\u5143\u7d20\u4f5c\u4e3a\u6839\u8282\u70b9\uff0c\u518d\u9012\u5f52\u5730\u6784\u5efa\u5de6\u53f3\u5b50\u6811\u3002\u8fd9\u6837\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8bc1\u6811\u7684\u5e73\u8861\u6027\u3002

Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u7b26\u4e32\u5bf9\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

\u5728 Java \u4e2d\uff0c\u5bf9\u4e8e\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c== \u7528\u4e8e\u5bf9\u6bd4\u4e24\u4e2a\u53d8\u91cf\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5bf9\u4e8e\u5f15\u7528\u7c7b\u578b\uff0c\u4e24\u79cd\u7b26\u53f7\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

  • == \uff1a\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u53d8\u91cf\u662f\u5426\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5373\u5b83\u4eec\u5728\u5185\u5b58\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
  • equals()\uff1a\u7528\u6765\u5bf9\u6bd4\u4e24\u4e2a\u5bf9\u8c61\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9\u6bd4\u503c\uff0c\u6211\u4eec\u5e94\u8be5\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u901a\u8fc7 String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u7b26\u4e32\u90fd\u5b58\u50a8\u5728\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\uff0c\u5b83\u4eec\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u6765\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u3002

Q\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u7684\u8282\u70b9\u6570\u91cf\u662f \\(2^h\\) \u5417\uff1f

\u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6ee1\u4e8c\u53c9\u6811\uff0c\u5176\u8282\u70b9\u603b\u6570 \\(n = 7\\) \uff0c\u5219\u5e95\u5c42\u8282\u70b9\u6570\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"chapter_appendix/","title":"\u7b2c 16 \u7ae0 \u00a0 \u9644\u5f55","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5
  • 16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c
  • 16.3 \u00a0 \u672f\u8bed\u8868
"},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

\u7531\u4e8e\u7b14\u8005\u80fd\u529b\u6709\u9650\uff0c\u4e66\u4e2d\u96be\u514d\u5b58\u5728\u4e00\u4e9b\u9057\u6f0f\u548c\u9519\u8bef\uff0c\u8bf7\u60a8\u8c05\u89e3\u3002\u5982\u679c\u60a8\u53d1\u73b0\u4e86\u7b14\u8bef\u3001\u94fe\u63a5\u5931\u6548\u3001\u5185\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u4e49\u3001\u89e3\u91ca\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7ed3\u6784\u4e0d\u5408\u7406\u7b49\u95ee\u9898\uff0c\u8bf7\u534f\u52a9\u6211\u4eec\u8fdb\u884c\u4fee\u6b63\uff0c\u4ee5\u7ed9\u8bfb\u8005\u63d0\u4f9b\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002

\u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c06\u5728\u672c\u4e66\u4ed3\u5e93\u3001\u7f51\u9875\u7248\u548c PDF \u7248\u7684\u4e3b\u9875\u4e0a\u8fdb\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\u3002

\u5f00\u6e90\u7684\u9b45\u529b

\u7eb8\u8d28\u56fe\u4e66\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u8f83\u4e45\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

\u800c\u5728\u672c\u5f00\u6e90\u4e66\u4e2d\uff0c\u5185\u5bb9\u66f4\u8fed\u7684\u65f6\u95f4\u88ab\u7f29\u77ed\u81f3\u6570\u65e5\u751a\u81f3\u51e0\u4e2a\u5c0f\u65f6\u3002

"},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

\u5982\u56fe 16-3 \u6240\u793a\uff0c\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7f16\u8f91\u56fe\u6807\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\u3002

  1. \u70b9\u51fb\u201c\u7f16\u8f91\u56fe\u6807\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\u3002
  2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u68c0\u67e5\u5185\u5bb9\u7684\u6b63\u786e\u6027\uff0c\u5e76\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\u3002
  3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\u3002\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

\u56fe 16-3 \u00a0 \u9875\u9762\u7f16\u8f91\u6309\u952e

\u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

"},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5185\u5bb9\u521b\u4f5c","text":"

\u5982\u679c\u60a8\u6709\u5174\u8da3\u53c2\u4e0e\u6b64\u5f00\u6e90\u9879\u76ee\uff0c\u5305\u62ec\u5c06\u4ee3\u7801\u7ffb\u8bd1\u6210\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u3001\u6269\u5c55\u6587\u7ae0\u5185\u5bb9\u7b49\uff0c\u90a3\u4e48\u9700\u8981\u5b9e\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

  1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4e66\u7684\u4ee3\u7801\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\u3002
  2. \u8fdb\u5165\u60a8\u7684 Fork \u4ed3\u5e93\u7f51\u9875\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c06\u4ed3\u5e93\u514b\u9686\u81f3\u672c\u5730\u3002
  3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u8fdb\u884c\u5b8c\u6574\u6d4b\u8bd5\uff0c\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\u3002
  4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\u3002
  5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002
"},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

\u5728 hello-algo \u6839\u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u4ee5\u4e0b Docker \u811a\u672c\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8bbf\u95ee\u672c\u9879\u76ee\uff1a

docker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\uff1a

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88c5 IDE","text":"

\u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u3001\u8f7b\u91cf\u7684 VS Code \u4f5c\u4e3a\u672c\u5730\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\u3002\u8bbf\u95ee VS Code \u5b98\u7f51\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u76f8\u5e94\u7248\u672c\u7684 VS Code \u8fdb\u884c\u4e0b\u8f7d\u548c\u5b89\u88c5\u3002

\u56fe 16-1 \u00a0 \u4ece\u5b98\u7f51\u4e0b\u8f7d VS Code

VS Code \u62e5\u6709\u5f3a\u5927\u7684\u6269\u5c55\u5305\u751f\u6001\u7cfb\u7edf\uff0c\u652f\u6301\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u7684\u8fd0\u884c\u548c\u8c03\u8bd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5b89\u88c5\u201cPython Extension Pack\u201d\u6269\u5c55\u5305\u4e4b\u540e\uff0c\u5373\u53ef\u8fdb\u884c Python \u4ee3\u7801\u8c03\u8bd5\u3002\u5b89\u88c5\u6b65\u9aa4\u5982\u56fe 16-2 \u6240\u793a\u3002

\u56fe 16-2 \u00a0 \u5b89\u88c5 VS Code \u6269\u5c55\u5305

"},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88c5\u8bed\u8a00\u73af\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88c5 Python Extension Pack \u3002
  3. \uff08\u53ef\u9009\uff09\u5728\u547d\u4ee4\u884c\u8f93\u5165 pip install black \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u73af\u5883","text":"
  1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e26 Clang \uff0c\u65e0\u987b\u5b89\u88c5\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88c5 C/C++ Extension Pack \u3002
  3. \uff08\u53ef\u9009\uff09\u6253\u5f00 Settings \u9875\u9762\uff0c\u641c\u7d22 Clang_format_fallback Style \u4ee3\u7801\u683c\u5f0f\u5316\u9009\u9879\uff0c\u8bbe\u7f6e\u4e3a { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
"},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 8.0 \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88c5 C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
  3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88c5\u6559\u7a0b\uff09\u3002
"},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
  3. \u6309\u5feb\u6377\u952e Ctrl + Shift + P \u547c\u51fa\u547d\u4ee4\u680f\uff0c\u8f93\u5165 go \uff0c\u9009\u62e9 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9009\u5e76\u5b89\u88c5\u5373\u53ef\u3002
"},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code \u3002
"},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Node.js \u3002
  2. \uff08\u53ef\u9009\uff09\u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u73af\u5883","text":"
  1. \u540c JavaScript \u73af\u5883\u5b89\u88c5\u6b65\u9aa4\u3002
  2. \u5b89\u88c5 TypeScript Execute (tsx) \u3002
  3. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88c5 Pretty TypeScript Errors \u3002
"},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Dart \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88c5 Dart \u3002
"},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u73af\u5883","text":"
  1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust \u3002
  2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer \u3002
"},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u672f\u8bed\u8868","text":"

\u8868 16-1 \u5217\u51fa\u4e86\u4e66\u4e2d\u51fa\u73b0\u7684\u91cd\u8981\u672f\u8bed\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u3002

  • \u5efa\u8bae\u8bb0\u4f4f\u540d\u8bcd\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u9605\u8bfb\u82f1\u6587\u6587\u732e\u3002
  • \u90e8\u5206\u540d\u8bcd\u5728\u7b80\u4f53\u4e2d\u6587\u548c\u7e41\u4f53\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

\u8868 16-1 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8bcd

English \u7b80\u4f53\u4e2d\u6587 \u7e41\u4f53\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 hash set \u54c8\u5e0c\u96c6\u5408 \u96dc\u6e4a\u96c6\u5408 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868","text":"

Abstract

\u6570\u636e\u7ed3\u6784\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5b9e\u7684\u7816\u5899\u3002

\u6570\u7ec4\u7684\u7816\u5757\u6574\u9f50\u6392\u5217\uff0c\u9010\u4e2a\u7d27\u8d34\u3002\u94fe\u8868\u7684\u7816\u5757\u5206\u6563\u5404\u5904\uff0c\u8fde\u63a5\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u4e8e\u7816\u7f1d\u4e4b\u95f4\u3002

"},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 4.1 \u00a0 \u6570\u7ec4
  • 4.2 \u00a0 \u94fe\u8868
  • 4.3 \u00a0 \u5217\u8868
  • 4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *
  • 4.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u6570\u7ec4","text":"

\u6570\u7ec4\uff08array\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u6211\u4eec\u5c06\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u4f4d\u7f6e\u79f0\u4e3a\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u56fe 4-1 \u5c55\u793a\u4e86\u6570\u7ec4\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5b58\u50a8\u65b9\u5f0f\u3002

\u56fe 4-1 \u00a0 \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u6570\u7ec4","text":"

\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u7528\u6570\u7ec4\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u65e0\u521d\u59cb\u503c\u3001\u7ed9\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4f1a\u5c06\u6570\u7ec4\u5143\u7d20\u521d\u59cb\u5316\u4e3a \\(0\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
# \u521d\u59cb\u5316\u6570\u7ec4\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
array.cpp
/* \u521d\u59cb\u5316\u6570\u7ec4 */\n// \u5b58\u50a8\u5728\u6808\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5b58\u50a8\u5728\u5806\u4e0a\uff08\u9700\u8981\u624b\u52a8\u91ca\u653e\u7a7a\u95f4\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[5]int\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[]int\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Go \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u6570\u7ec4\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
/* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
array.rb
# \u521d\u59cb\u5316\u6570\u7ec4\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
array.zig
// \u521d\u59cb\u5316\u6570\u7ec4\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

\u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u56fe 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u8be5\u5143\u7d20\u3002

\u56fe 4-2 \u00a0 \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

\u89c2\u5bdf\u56fe 4-2 \uff0c\u6211\u4eec\u53d1\u73b0\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u4e3a \\(0\\) \uff0c\u8fd9\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\u4f1a\u66f4\u81ea\u7136\u3002\u4f46\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u662f\u5185\u5b58\u5730\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u4e3a \\(0\\) \u662f\u5408\u7406\u7684\u3002

\u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

\u6570\u7ec4\u5143\u7d20\u5728\u5185\u5b58\u4e2d\u662f\u201c\u7d27\u6328\u7740\u7684\u201d\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u7a7a\u95f4\u518d\u5b58\u653e\u4efb\u4f55\u6570\u636e\u3002\u5982\u56fe 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u5219\u9700\u8981\u5c06\u8be5\u5143\u7d20\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u4e4b\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

\u56fe 4-3 \u00a0 \u6570\u7ec4\u63d2\u5165\u5143\u7d20\u793a\u4f8b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u4f1a\u5bfc\u81f4\u6570\u7ec4\u5c3e\u90e8\u5143\u7d20\u201c\u4e22\u5931\u201d\u3002\u6211\u4eec\u5c06\u8fd9\u4e2a\u95ee\u9898\u7684\u89e3\u51b3\u65b9\u6848\u7559\u5728\u201c\u5217\u8868\u201d\u7ae0\u8282\u4e2d\u8ba8\u8bba\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u5220\u9664\u5143\u7d20","text":"

\u540c\u7406\uff0c\u5982\u56fe 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u5220\u9664\u7d22\u5f15 \\(i\\) \u5904\u7684\u5143\u7d20\uff0c\u5219\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\u3002

\u56fe 4-4 \u00a0 \u6570\u7ec4\u5220\u9664\u5143\u7d20\u793a\u4f8b

\u8bf7\u6ce8\u610f\uff0c\u5220\u9664\u5143\u7d20\u5b8c\u6210\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u987b\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u7684\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\uff1a\u6570\u7ec4\u7684\u63d2\u5165\u548c\u5220\u9664\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\u3002
  • \u4e22\u5931\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u540e\uff0c\u8d85\u51fa\u6570\u7ec4\u957f\u5ea6\u8303\u56f4\u7684\u5143\u7d20\u4f1a\u4e22\u5931\u3002
  • \u5185\u5b58\u6d6a\u8d39\uff1a\u6211\u4eec\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e2a\u6bd4\u8f83\u957f\u7684\u6570\u7ec4\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u8fd9\u6837\u5728\u63d2\u5165\u6570\u636e\u65f6\uff0c\u4e22\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u65e0\u610f\u4e49\u201d\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
"},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u904d\u5386\u6570\u7ec4","text":"

\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e2\u53ef\u4ee5\u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u627e\u5143\u7d20","text":"

\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u9700\u8981\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u5224\u65ad\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5219\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

\u56e0\u4e3a\u6570\u7ec4\u662f\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u627e\u64cd\u4f5c\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u67e5\u627e\u201d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u6269\u5bb9\u6570\u7ec4","text":"

\u5728\u590d\u6742\u7684\u7cfb\u7edf\u73af\u5883\u4e2d\uff0c\u7a0b\u5e8f\u96be\u4ee5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u4ece\u800c\u65e0\u6cd5\u5b89\u5168\u5730\u6269\u5c55\u6570\u7ec4\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u4e0d\u53ef\u53d8\u7684\u3002

\u5982\u679c\u6211\u4eec\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u590d\u5236\u5230\u65b0\u6570\u7ec4\u3002\u8fd9\u662f\u4e00\u4e2a \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u8017\u65f6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
array.cpp
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.java
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.cs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.go
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.swift
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.js
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.ts
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.dart
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
array.rs
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
array.c
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
array.kt
/* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
array.rb
### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
array.zig
// \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u6570\u7ec4\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u4e14\u5143\u7d20\u7c7b\u578b\u76f8\u540c\u3002\u8fd9\u79cd\u505a\u6cd5\u5305\u542b\u4e30\u5bcc\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u7cfb\u7edf\u53ef\u4ee5\u5229\u7528\u8fd9\u4e9b\u4fe1\u606f\u6765\u4f18\u5316\u6570\u636e\u7ed3\u6784\u7684\u64cd\u4f5c\u6548\u7387\u3002

  • \u7a7a\u95f4\u6548\u7387\u9ad8\uff1a\u6570\u7ec4\u4e3a\u6570\u636e\u5206\u914d\u4e86\u8fde\u7eed\u7684\u5185\u5b58\u5757\uff0c\u65e0\u987b\u989d\u5916\u7684\u7ed3\u6784\u5f00\u9500\u3002
  • \u652f\u6301\u968f\u673a\u8bbf\u95ee\uff1a\u6570\u7ec4\u5141\u8bb8\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u4efb\u4f55\u5143\u7d20\u3002
  • \u7f13\u5b58\u5c40\u90e8\u6027\uff1a\u5f53\u8bbf\u95ee\u6570\u7ec4\u5143\u7d20\u65f6\uff0c\u8ba1\u7b97\u673a\u4e0d\u4ec5\u4f1a\u52a0\u8f7d\u5b83\uff0c\u8fd8\u4f1a\u7f13\u5b58\u5176\u5468\u56f4\u7684\u5176\u4ed6\u6570\u636e\uff0c\u4ece\u800c\u501f\u52a9\u9ad8\u901f\u7f13\u5b58\u6765\u63d0\u5347\u540e\u7eed\u64cd\u4f5c\u7684\u6267\u884c\u901f\u5ea6\u3002

\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u662f\u4e00\u628a\u53cc\u5203\u5251\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

  • \u63d2\u5165\u4e0e\u5220\u9664\u6548\u7387\u4f4e\uff1a\u5f53\u6570\u7ec4\u4e2d\u5143\u7d20\u8f83\u591a\u65f6\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52a8\u5927\u91cf\u7684\u5143\u7d20\u3002
  • \u957f\u5ea6\u4e0d\u53ef\u53d8\uff1a\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u6269\u5bb9\u6570\u7ec4\u9700\u8981\u5c06\u6240\u6709\u6570\u636e\u590d\u5236\u5230\u65b0\u6570\u7ec4\uff0c\u5f00\u9500\u5f88\u5927\u3002
  • \u7a7a\u95f4\u6d6a\u8d39\uff1a\u5982\u679c\u6570\u7ec4\u5206\u914d\u7684\u5927\u5c0f\u8d85\u8fc7\u5b9e\u9645\u6240\u9700\uff0c\u90a3\u4e48\u591a\u4f59\u7684\u7a7a\u95f4\u5c31\u88ab\u6d6a\u8d39\u4e86\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

\u6570\u7ec4\u662f\u4e00\u79cd\u57fa\u7840\u4e14\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\uff0c\u65e2\u9891\u7e41\u5e94\u7528\u5728\u5404\u7c7b\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u4e8e\u5b9e\u73b0\u5404\u79cd\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002

  • \u968f\u673a\u8bbf\u95ee\uff1a\u5982\u679c\u6211\u4eec\u60f3\u968f\u673a\u62bd\u53d6\u4e00\u4e9b\u6837\u672c\uff0c\u90a3\u4e48\u53ef\u4ee5\u7528\u6570\u7ec4\u5b58\u50a8\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u968f\u673a\u5e8f\u5217\uff0c\u6839\u636e\u7d22\u5f15\u5b9e\u73b0\u968f\u673a\u62bd\u6837\u3002
  • \u6392\u5e8f\u548c\u641c\u7d22\uff1a\u6570\u7ec4\u662f\u6392\u5e8f\u548c\u641c\u7d22\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u4e8c\u5206\u67e5\u627e\u7b49\u90fd\u4e3b\u8981\u5728\u6570\u7ec4\u4e0a\u8fdb\u884c\u3002
  • \u67e5\u627e\u8868\uff1a\u5f53\u9700\u8981\u5feb\u901f\u67e5\u627e\u4e00\u4e2a\u5143\u7d20\u6216\u5176\u5bf9\u5e94\u5173\u7cfb\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u4f5c\u4e3a\u67e5\u627e\u8868\u3002\u5047\u5982\u6211\u4eec\u60f3\u5b9e\u73b0\u5b57\u7b26\u5230 ASCII \u7801\u7684\u6620\u5c04\uff0c\u5219\u53ef\u4ee5\u5c06\u5b57\u7b26\u7684 ASCII \u7801\u503c\u4f5c\u4e3a\u7d22\u5f15\uff0c\u5bf9\u5e94\u7684\u5143\u7d20\u5b58\u653e\u5728\u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u4f4d\u7f6e\u3002
  • \u673a\u5668\u5b66\u4e60\uff1a\u795e\u7ecf\u7f51\u7edc\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9635\u3001\u5f20\u91cf\u4e4b\u95f4\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\uff0c\u8fd9\u4e9b\u6570\u636e\u90fd\u662f\u4ee5\u6570\u7ec4\u7684\u5f62\u5f0f\u6784\u5efa\u7684\u3002\u6570\u7ec4\u662f\u795e\u7ecf\u7f51\u7edc\u7f16\u7a0b\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff1a\u6570\u7ec4\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002\u4f8b\u5982\uff0c\u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\u3002
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u94fe\u8868","text":"

\u5185\u5b58\u7a7a\u95f4\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u516c\u5171\u8d44\u6e90\uff0c\u5728\u4e00\u4e2a\u590d\u6742\u7684\u7cfb\u7edf\u8fd0\u884c\u73af\u5883\u4e0b\uff0c\u7a7a\u95f2\u7684\u5185\u5b58\u7a7a\u95f4\u53ef\u80fd\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u6211\u4eec\u77e5\u9053\uff0c\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6570\u7ec4\u975e\u5e38\u5927\u65f6\uff0c\u5185\u5b58\u53ef\u80fd\u65e0\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u6b64\u65f6\u94fe\u8868\u7684\u7075\u6d3b\u6027\u4f18\u52bf\u5c31\u4f53\u73b0\u51fa\u6765\u4e86\u3002

\u94fe\u8868\uff08linked list\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u901a\u8fc7\u201c\u5f15\u7528\u201d\u76f8\u8fde\u63a5\u3002\u5f15\u7528\u8bb0\u5f55\u4e86\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u901a\u8fc7\u5b83\u53ef\u4ee5\u4ece\u5f53\u524d\u8282\u70b9\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002

\u94fe\u8868\u7684\u8bbe\u8ba1\u4f7f\u5f97\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

\u56fe 4-5 \u00a0 \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

\u89c2\u5bdf\u56fe 4-5 \uff0c\u94fe\u8868\u7684\u7ec4\u6210\u5355\u4f4d\u662f\u8282\u70b9\uff08node\uff09\u5bf9\u8c61\u3002\u6bcf\u4e2a\u8282\u70b9\u90fd\u5305\u542b\u4e24\u9879\u6570\u636e\uff1a\u8282\u70b9\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u201c\u5f15\u7528\u201d\u3002

  • \u94fe\u8868\u7684\u9996\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5934\u8282\u70b9\u201d\uff0c\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5c3e\u8282\u70b9\u201d\u3002
  • \u5c3e\u8282\u70b9\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u522b\u88ab\u8bb0\u4e3a null\u3001nullptr \u548c None \u3002
  • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u9488\u7684\u8bed\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u5e94\u88ab\u66ff\u6362\u4e3a\u201c\u6307\u9488\u201d\u3002

\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u94fe\u8868\u8282\u70b9 ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u4e00\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u6570\u636e\u91cf\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u8282\u70b9\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  //\u6784\u9020\u51fd\u6570\n    int val = x;         // \u8282\u70b9\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\n    Val  int       // \u8282\u70b9\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u6784\u9020\u51fd\u6570\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u94fe\u8868\u8282\u70b9\u7c7b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n
/* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
/* \u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u8282\u70b9\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\n}\n
# \u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val  # \u8282\u70b9\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
// \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u94fe\u8868","text":"

\u5efa\u7acb\u94fe\u8868\u5206\u4e3a\u4e24\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u7b2c\u4e8c\u6b65\u662f\u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\u5173\u7cfb\u3002\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u901a\u8fc7\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
# \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
/* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rb
# \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.zig
// \u521d\u59cb\u5316\u94fe\u8868\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6570\u7ec4\u6574\u4f53\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u6bd4\u5982\u6570\u7ec4 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u72ec\u7acb\u7684\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\u7684\u3002\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u6bd4\u5982\u4ee5\u4e0a\u4ee3\u7801\u4e2d\u7684\u94fe\u8868\u53ef\u8bb0\u4f5c\u94fe\u8868 n0 \u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u8282\u70b9\u975e\u5e38\u5bb9\u6613\u3002\u5982\u56fe 4-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u5728\u76f8\u90bb\u7684\u4e24\u4e2a\u8282\u70b9 n0 \u548c n1 \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u5219\u53ea\u9700\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u6570\u7ec4\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u6548\u7387\u8f83\u4f4e\u3002

\u56fe 4-6 \u00a0 \u94fe\u8868\u63d2\u5165\u8282\u70b9\u793a\u4f8b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u5982\u56fe 4-7 \u6240\u793a\uff0c\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u3002

\u8bf7\u6ce8\u610f\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a\u904d\u5386\u6b64\u94fe\u8868\u5df2\u7ecf\u65e0\u6cd5\u8bbf\u95ee\u5230 P \uff0c\u8fd9\u610f\u5473\u7740 P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u8be5\u94fe\u8868\u4e86\u3002

\u56fe 4-7 \u00a0 \u94fe\u8868\u5220\u9664\u8282\u70b9

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
linked_list.java
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
linked_list.kt
/* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8bbf\u95ee\u8282\u70b9","text":"

\u5728\u94fe\u8868\u4e2d\u8bbf\u95ee\u8282\u70b9\u7684\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u4e00\u8282\u6240\u8ff0\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u7a0b\u5e8f\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8bbf\u95ee\u94fe\u8868\u7684\u7b2c \\(i\\) \u4e2a\u8282\u70b9\u9700\u8981\u5faa\u73af \\(i - 1\\) \u8f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

\u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u5176\u4e2d\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8be5\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u8fc7\u7a0b\u4e5f\u5c5e\u4e8e\u7ebf\u6027\u67e5\u627e\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u6570\u7ec4 vs. \u94fe\u8868","text":"

\u8868 4-1 \u603b\u7ed3\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u7684\u5404\u9879\u7279\u70b9\u5e76\u5bf9\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u4e8e\u5b83\u4eec\u91c7\u7528\u4e24\u79cd\u76f8\u53cd\u7684\u5b58\u50a8\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u79cd\u6027\u8d28\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73b0\u5bf9\u7acb\u7684\u7279\u70b9\u3002

\u8868 4-1 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u6548\u7387\u5bf9\u6bd4

\u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u5206\u6563\u5185\u5b58\u7a7a\u95f4 \u5bb9\u91cf\u6269\u5c55 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u53ef\u7075\u6d3b\u6269\u5c55 \u5185\u5b58\u6548\u7387 \u5143\u7d20\u5360\u7528\u5185\u5b58\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8d39\u7a7a\u95f4 \u5143\u7d20\u5360\u7528\u5185\u5b58\u591a \u8bbf\u95ee\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

\u5982\u56fe 4-8 \u6240\u793a\uff0c\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u4e09\u79cd\u3002

  • \u5355\u5411\u94fe\u8868\uff1a\u5373\u524d\u9762\u4ecb\u7ecd\u7684\u666e\u901a\u94fe\u8868\u3002\u5355\u5411\u94fe\u8868\u7684\u8282\u70b9\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\u4e24\u9879\u6570\u636e\u3002\u6211\u4eec\u5c06\u9996\u4e2a\u8282\u70b9\u79f0\u4e3a\u5934\u8282\u70b9\uff0c\u5c06\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411\u7a7a None \u3002
  • \u73af\u5f62\u94fe\u8868\uff1a\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5219\u5f97\u5230\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\u3002\u5728\u73af\u5f62\u94fe\u8868\u4e2d\uff0c\u4efb\u610f\u8282\u70b9\u90fd\u53ef\u4ee5\u89c6\u4f5c\u5934\u8282\u70b9\u3002
  • \u53cc\u5411\u94fe\u8868\uff1a\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u5f15\u7528\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u4e2a\u8282\u70b9\uff09\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u76f8\u8f83\u4e8e\u5355\u5411\u94fe\u8868\uff0c\u53cc\u5411\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u4e24\u4e2a\u65b9\u5411\u904d\u5386\u94fe\u8868\uff0c\u4f46\u76f8\u5e94\u5730\u4e5f\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    ListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  // \u6784\u9020\u51fd\u6570\n    int val = x;    // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\n    Val  int             // \u8282\u70b9\u503c\n    Next *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u6784\u9020\u51fd\u6570\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\u578b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u8282\u70b9\u503c\n    val next: ListNode? = null  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
# \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :next   # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

\u56fe 4-8 \u00a0 \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u94fe\u8868\u5178\u578b\u5e94\u7528","text":"

\u5355\u5411\u94fe\u8868\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u548c\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002

  • \u6808\u4e0e\u961f\u5217\uff1a\u5f53\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u90fd\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\u65f6\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u540e\u51fa\uff0c\u5bf9\u5e94\u6808\uff1b\u5f53\u63d2\u5165\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\uff0c\u5220\u9664\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u53e6\u4e00\u7aef\u8fdb\u884c\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u5148\u51fa\uff0c\u5bf9\u5e94\u961f\u5217\u3002
  • \u54c8\u5e0c\u8868\uff1a\u94fe\u5f0f\u5730\u5740\u662f\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8be5\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u51b2\u7a81\u7684\u5143\u7d20\u90fd\u4f1a\u88ab\u653e\u5230\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002
  • \u56fe\uff1a\u90bb\u63a5\u8868\u662f\u8868\u793a\u56fe\u7684\u4e00\u79cd\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u90fd\u4e0e\u4e00\u4e2a\u94fe\u8868\u76f8\u5173\u8054\uff0c\u94fe\u8868\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u4ee3\u8868\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u5176\u4ed6\u9876\u70b9\u3002

\u53cc\u5411\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5feb\u901f\u67e5\u627e\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u573a\u666f\u3002

  • \u9ad8\u7ea7\u6570\u636e\u7ed3\u6784\uff1a\u6bd4\u5982\u5728\u7ea2\u9ed1\u6811\u3001B \u6811\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5728\u8282\u70b9\u4e2d\u4fdd\u5b58\u4e00\u4e2a\u6307\u5411\u7236\u8282\u70b9\u7684\u5f15\u7528\u6765\u5b9e\u73b0\uff0c\u7c7b\u4f3c\u4e8e\u53cc\u5411\u94fe\u8868\u3002
  • \u6d4f\u89c8\u5668\u5386\u53f2\uff1a\u5728\u7f51\u9875\u6d4f\u89c8\u5668\u4e2d\uff0c\u5f53\u7528\u6237\u70b9\u51fb\u524d\u8fdb\u6216\u540e\u9000\u6309\u94ae\u65f6\uff0c\u6d4f\u89c8\u5668\u9700\u8981\u77e5\u9053\u7528\u6237\u8bbf\u95ee\u8fc7\u7684\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u7f51\u9875\u3002\u53cc\u5411\u94fe\u8868\u7684\u7279\u6027\u4f7f\u5f97\u8fd9\u79cd\u64cd\u4f5c\u53d8\u5f97\u7b80\u5355\u3002
  • LRU \u7b97\u6cd5\uff1a\u5728\u7f13\u5b58\u6dd8\u6c70\uff08LRU\uff09\u7b97\u6cd5\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u3002\u8fd9\u65f6\u5019\u4f7f\u7528\u53cc\u5411\u94fe\u8868\u5c31\u975e\u5e38\u5408\u9002\u3002

\u73af\u5f62\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5468\u671f\u6027\u64cd\u4f5c\u7684\u573a\u666f\uff0c\u6bd4\u5982\u64cd\u4f5c\u7cfb\u7edf\u7684\u8d44\u6e90\u8c03\u5ea6\u3002

  • \u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\uff1a\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\u662f\u4e00\u79cd\u5e38\u89c1\u7684 CPU \u8c03\u5ea6\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5bf9\u4e00\u7ec4\u8fdb\u7a0b\u8fdb\u884c\u5faa\u73af\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u88ab\u8d4b\u4e88\u4e00\u4e2a\u65f6\u95f4\u7247\uff0c\u5f53\u65f6\u95f4\u7247\u7528\u5b8c\u65f6\uff0cCPU \u5c06\u5207\u6362\u5230\u4e0b\u4e00\u4e2a\u8fdb\u7a0b\u3002\u8fd9\u79cd\u5faa\u73af\u64cd\u4f5c\u53ef\u4ee5\u901a\u8fc7\u73af\u5f62\u94fe\u8868\u6765\u5b9e\u73b0\u3002
  • \u6570\u636e\u7f13\u51b2\u533a\uff1a\u5728\u67d0\u4e9b\u6570\u636e\u7f13\u51b2\u533a\u7684\u5b9e\u73b0\u4e2d\uff0c\u4e5f\u53ef\u80fd\u4f1a\u4f7f\u7528\u73af\u5f62\u94fe\u8868\u3002\u6bd4\u5982\u5728\u97f3\u9891\u3001\u89c6\u9891\u64ad\u653e\u5668\u4e2d\uff0c\u6570\u636e\u6d41\u53ef\u80fd\u4f1a\u88ab\u5206\u6210\u591a\u4e2a\u7f13\u51b2\u5757\u5e76\u653e\u5165\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\uff0c\u4ee5\u4fbf\u5b9e\u73b0\u65e0\u7f1d\u64ad\u653e\u3002
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u5217\u8868","text":"

\u5217\u8868\uff08list\uff09\u662f\u4e00\u4e2a\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8bbf\u95ee\u3001\u4fee\u6539\u3001\u6dfb\u52a0\u3001\u5220\u9664\u548c\u904d\u5386\u7b49\u64cd\u4f5c\uff0c\u65e0\u987b\u4f7f\u7528\u8005\u8003\u8651\u5bb9\u91cf\u9650\u5236\u7684\u95ee\u9898\u3002\u5217\u8868\u53ef\u4ee5\u57fa\u4e8e\u94fe\u8868\u6216\u6570\u7ec4\u5b9e\u73b0\u3002

  • \u94fe\u8868\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u5217\u8868\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\u64cd\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u7075\u6d3b\u52a8\u6001\u6269\u5bb9\u3002
  • \u6570\u7ec4\u4e5f\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\uff0c\u4f46\u7531\u4e8e\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u4e2a\u5177\u6709\u957f\u5ea6\u9650\u5236\u7684\u5217\u8868\u3002

\u5f53\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u5217\u8868\u65f6\uff0c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6027\u8d28\u4f1a\u5bfc\u81f4\u5217\u8868\u7684\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u65e0\u6cd5\u4e8b\u5148\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u4ece\u800c\u96be\u4ee5\u9009\u62e9\u5408\u9002\u7684\u5217\u8868\u957f\u5ea6\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u5219\u5f88\u53ef\u80fd\u65e0\u6cd5\u6ee1\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff08dynamic array\uff09\u6765\u5b9e\u73b0\u5217\u8868\u3002\u5b83\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u5404\u9879\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u52a8\u6001\u6269\u5bb9\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u6807\u51c6\u5e93\u63d0\u4f9b\u7684\u5217\u8868\u662f\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u6765\u7684\u8ba8\u8bba\u4e2d\uff0c\u6211\u4eec\u5c06\u628a\u201c\u5217\u8868\u201d\u548c\u201c\u52a8\u6001\u6570\u7ec4\u201d\u89c6\u4e3a\u7b49\u540c\u7684\u6982\u5ff5\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u5217\u8868","text":"

\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u8fd9\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u65e0\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u6570\u7ec4\u7684\u5143\u7d20\u7c7b\u578b\u9700\u4e3a int[] \u7684\u5305\u88c5\u7c7b Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
list.rb
# \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u5217\u8868\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

\u5217\u8868\u672c\u8d28\u4e0a\u662f\u6570\u7ec4\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u8bbf\u95ee\u5143\u7d20\nnum: int = nums[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cpp
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.java
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.cs
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list_test.go
/* \u8bbf\u95ee\u5143\u7d20 */\nnum := nums[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.swift
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num = nums[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.js
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.ts
/* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.dart
/* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.rs
/* \u8bbf\u95ee\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u8bbf\u95ee\u5143\u7d20 */\nval num = nums[1]       // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.rb
# \u8bbf\u95ee\u5143\u7d20\nnum = nums[1] # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
list.zig
// \u8bbf\u95ee\u5143\u7d20\nvar num = nums.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u5143\u7d20","text":"

\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5730\u6dfb\u52a0\u4e0e\u5220\u9664\u5143\u7d20\u3002\u5728\u5217\u8868\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u4e0e\u6570\u7ec4\u76f8\u540c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6e05\u7a7a\u5217\u8868\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.java
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.cs
/* \u6e05\u7a7a\u5217\u8868 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u5217\u8868 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.swift
/* \u6e05\u7a7a\u5217\u8868 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.ts
/* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.dart
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.rs
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);    // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.rb
# \u6e05\u7a7a\u5217\u8868\nnums.clear\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.delete_at(3) # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u5217\u8868\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n// \u5220\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u904d\u5386\u5217\u8868","text":"

\u4e0e\u6570\u7ec4\u4e00\u6837\uff0c\u5217\u8868\u53ef\u4ee5\u6839\u636e\u7d22\u5f15\u904d\u5386\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u5404\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\nfor num in nums:\n    count += num\n
list.cpp
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
list.rb
# \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
list.zig
// \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u5217\u8868","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 nums1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.cpp
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.cs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list_test.go
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.swift
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.js
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.ts
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.dart
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.rs
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
list.rb
# \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
list.zig
// \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u5217\u8868","text":"

\u5b8c\u6210\u5217\u8868\u6392\u5e8f\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u6570\u7ec4\u7c7b\u7b97\u6cd5\u9898\u4e2d\u7ecf\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u548c\u201c\u53cc\u6307\u9488\u201d\u7b97\u6cd5\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6392\u5e8f\u5217\u8868\nnums.sort()  # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u5217\u8868 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.java
/* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(nums);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.cs
/* \u6392\u5e8f\u5217\u8868 */\nnums.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list_test.go
/* \u6392\u5e8f\u5217\u8868 */\nsort.Ints(nums)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.ts
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.dart
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.rs
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
list.kt
/* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.rb
# \u6392\u5e8f\u5217\u8868\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
list.zig
// \u6392\u5e8f\u5217\u8868\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u5217\u8868\u5b9e\u73b0","text":"

\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u4e86\u5217\u8868\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u6bd4\u8f83\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u6269\u5bb9\u500d\u6570\u7b49\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u6e90\u7801\u8fdb\u884c\u5b66\u4e60\u3002

\u4e3a\u4e86\u52a0\u6df1\u5bf9\u5217\u8868\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5c1d\u8bd5\u5b9e\u73b0\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u4e2a\u91cd\u70b9\u8bbe\u8ba1\u3002

  • \u521d\u59cb\u5bb9\u91cf\uff1a\u9009\u53d6\u4e00\u4e2a\u5408\u7406\u7684\u6570\u7ec4\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u9009\u62e9 10 \u4f5c\u4e3a\u521d\u59cb\u5bb9\u91cf\u3002
  • \u6570\u91cf\u8bb0\u5f55\uff1a\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf size \uff0c\u7528\u4e8e\u8bb0\u5f55\u5217\u8868\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff0c\u5e76\u968f\u7740\u5143\u7d20\u63d2\u5165\u548c\u5220\u9664\u5b9e\u65f6\u66f4\u65b0\u3002\u6839\u636e\u6b64\u53d8\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u4f4d\u5217\u8868\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65ad\u662f\u5426\u9700\u8981\u6269\u5bb9\u3002
  • \u6269\u5bb9\u673a\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u65f6\u5217\u8868\u5bb9\u91cf\u5df2\u6ee1\uff0c\u5219\u9700\u8981\u8fdb\u884c\u6269\u5bb9\u3002\u5148\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u518d\u5c06\u5f53\u524d\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52a8\u81f3\u65b0\u6570\u7ec4\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u89c4\u5b9a\u6bcf\u6b21\u5c06\u6570\u7ec4\u6269\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *","text":"

\u5728\u672c\u7ae0\u7684\u524d\u4e24\u8282\u4e2d\uff0c\u6211\u4eec\u63a2\u8ba8\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u8fd9\u4e24\u79cd\u57fa\u7840\u4e14\u91cd\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b83\u4eec\u5206\u522b\u4ee3\u8868\u4e86\u201c\u8fde\u7eed\u5b58\u50a8\u201d\u548c\u201c\u5206\u6563\u5b58\u50a8\u201d\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u3002

\u5b9e\u9645\u4e0a\uff0c\u7269\u7406\u7ed3\u6784\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u51b3\u5b9a\u4e86\u7a0b\u5e8f\u5bf9\u5185\u5b58\u548c\u7f13\u5b58\u7684\u4f7f\u7528\u6548\u7387\uff0c\u8fdb\u800c\u5f71\u54cd\u7b97\u6cd5\u7a0b\u5e8f\u7684\u6574\u4f53\u6027\u80fd\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u8bbe\u5907","text":"

\u8ba1\u7b97\u673a\u4e2d\u5305\u62ec\u4e09\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u8bbe\u5907\uff1a\u786c\u76d8\uff08hard disk\uff09\u3001\u5185\u5b58\uff08random-access memory, RAM\uff09\u3001\u7f13\u5b58\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u4eec\u5728\u8ba1\u7b97\u673a\u7cfb\u7edf\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6027\u80fd\u7279\u70b9\u3002

\u8868 4-2 \u00a0 \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u8bbe\u5907

\u786c\u76d8 \u5185\u5b58 \u7f13\u5b58 \u7528\u9014 \u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5305\u62ec\u64cd\u4f5c\u7cfb\u7edf\u3001\u7a0b\u5e8f\u3001\u6587\u4ef6\u7b49 \u4e34\u65f6\u5b58\u50a8\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u548c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e \u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u51cf\u5c11 CPU \u8bbf\u95ee\u5185\u5b58\u7684\u6b21\u6570 \u6613\u5931\u6027 \u65ad\u7535\u540e\u6570\u636e\u4e0d\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u5bb9\u91cf \u8f83\u5927\uff0cTB \u7ea7\u522b \u8f83\u5c0f\uff0cGB \u7ea7\u522b \u975e\u5e38\u5c0f\uff0cMB \u7ea7\u522b \u901f\u5ea6 \u8f83\u6162\uff0c\u51e0\u767e\u5230\u51e0\u5343 MB/s \u8f83\u5feb\uff0c\u51e0\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u51e0\u5341\u5230\u51e0\u767e GB/s \u4ef7\u683c \u8f83\u4fbf\u5b9c\uff0c\u51e0\u6bdb\u5230\u51e0\u5143 / GB \u8f83\u8d35\uff0c\u51e0\u5341\u5230\u51e0\u767e\u5143 / GB \u975e\u5e38\u8d35\uff0c\u968f CPU \u6253\u5305\u8ba1\u4ef7

\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf\u60f3\u8c61\u4e3a\u56fe 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7ed3\u6784\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9876\u7aef\u7684\u5b58\u50a8\u8bbe\u5907\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u8fd9\u79cd\u591a\u5c42\u7ea7\u7684\u8bbe\u8ba1\u5e76\u975e\u5076\u7136\uff0c\u800c\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u5bb6\u548c\u5de5\u7a0b\u5e08\u4eec\u7ecf\u8fc7\u6df1\u601d\u719f\u8651\u7684\u7ed3\u679c\u3002

  • \u786c\u76d8\u96be\u4ee5\u88ab\u5185\u5b58\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u5185\u5b58\u4e2d\u7684\u6570\u636e\u5728\u65ad\u7535\u540e\u4f1a\u4e22\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9002\u5408\u957f\u671f\u5b58\u50a8\u6570\u636e\uff1b\u5176\u6b21\uff0c\u5185\u5b58\u7684\u6210\u672c\u662f\u786c\u76d8\u7684\u51e0\u5341\u500d\uff0c\u8fd9\u4f7f\u5f97\u5b83\u96be\u4ee5\u5728\u6d88\u8d39\u8005\u5e02\u573a\u666e\u53ca\u3002
  • \u7f13\u5b58\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96be\u4ee5\u517c\u5f97\u3002\u968f\u7740 L1\u3001L2\u3001L3 \u7f13\u5b58\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u4f1a\u53d8\u5927\uff0c\u4e0e CPU \u6838\u5fc3\u4e4b\u95f4\u7684\u7269\u7406\u8ddd\u79bb\u4f1a\u53d8\u8fdc\uff0c\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u4f20\u8f93\u65f6\u95f4\u589e\u52a0\uff0c\u5143\u7d20\u8bbf\u95ee\u5ef6\u8fdf\u53d8\u9ad8\u3002\u5728\u5f53\u524d\u6280\u672f\u4e0b\uff0c\u591a\u5c42\u7ea7\u7684\u7f13\u5b58\u7ed3\u6784\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u95f4\u7684\u6700\u4f73\u5e73\u8861\u70b9\u3002

\u56fe 4-9 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf

Tip

\u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u5c42\u6b21\u7ed3\u6784\u4f53\u73b0\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u95f4\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5b9e\u9645\u4e0a\uff0c\u8fd9\u79cd\u6743\u8861\u666e\u904d\u5b58\u5728\u4e8e\u6240\u6709\u5de5\u4e1a\u9886\u57df\uff0c\u5b83\u8981\u6c42\u6211\u4eec\u5728\u4e0d\u540c\u7684\u4f18\u52bf\u548c\u9650\u5236\u4e4b\u95f4\u627e\u5230\u6700\u4f73\u5e73\u8861\u70b9\u3002

\u603b\u7684\u6765\u8bf4\uff0c\u786c\u76d8\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u5927\u91cf\u6570\u636e\uff0c\u5185\u5b58\u7528\u4e8e\u4e34\u65f6\u5b58\u50a8\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\uff0c\u800c\u7f13\u5b58\u5219\u7528\u4e8e\u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5e8f\u8fd0\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u534f\u4f5c\uff0c\u786e\u4fdd\u8ba1\u7b97\u673a\u7cfb\u7edf\u9ad8\u6548\u8fd0\u884c\u3002

\u5982\u56fe 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4f1a\u4ece\u786c\u76d8\u4e2d\u88ab\u8bfb\u53d6\u5230\u5185\u5b58\u4e2d\uff0c\u4f9b CPU \u8ba1\u7b97\u4f7f\u7528\u3002\u7f13\u5b58\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u901a\u8fc7\u667a\u80fd\u5730\u4ece\u5185\u5b58\u52a0\u8f7d\u6570\u636e\uff0c\u7ed9 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u6570\u636e\u8bfb\u53d6\uff0c\u4ece\u800c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\uff0c\u51cf\u5c11\u5bf9\u8f83\u6162\u7684\u5185\u5b58\u7684\u4f9d\u8d56\u3002

\u56fe 4-10 \u00a0 \u786c\u76d8\u3001\u5185\u5b58\u548c\u7f13\u5b58\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u901a

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u5185\u5b58\u6548\u7387","text":"

\u5728\u5185\u5b58\u7a7a\u95f4\u5229\u7528\u65b9\u9762\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5404\u81ea\u5177\u6709\u4f18\u52bf\u548c\u5c40\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u5185\u5b58\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u5757\u5185\u5b58\u4e0d\u80fd\u88ab\u591a\u4e2a\u7a0b\u5e8f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u4eec\u5e0c\u671b\u6570\u636e\u7ed3\u6784\u80fd\u591f\u5c3d\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u95f4\u3002\u6570\u7ec4\u7684\u5143\u7d20\u7d27\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u94fe\u8868\u8282\u70b9\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u56e0\u6b64\u7a7a\u95f4\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u6570\u7ec4\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u591f\u7684\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u5185\u5b58\u6d6a\u8d39\uff0c\u6570\u7ec4\u6269\u5bb9\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u94fe\u8868\u4ee5\u201c\u8282\u70b9\u201d\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a8\u6001\u5185\u5b58\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u968f\u7740\u53cd\u590d\u7533\u8bf7\u4e0e\u91ca\u653e\u5185\u5b58\uff0c\u7a7a\u95f2\u5185\u5b58\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u4f1a\u8d8a\u6765\u8d8a\u9ad8\uff0c\u4ece\u800c\u5bfc\u81f4\u5185\u5b58\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u6570\u7ec4\u7531\u4e8e\u5176\u8fde\u7eed\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u76f8\u5bf9\u4e0d\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u94fe\u8868\u7684\u5143\u7d20\u662f\u5206\u6563\u5b58\u50a8\u7684\uff0c\u5728\u9891\u7e41\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u7f13\u5b58\u6548\u7387","text":"

\u7f13\u5b58\u867d\u7136\u5728\u7a7a\u95f4\u5bb9\u91cf\u4e0a\u8fdc\u5c0f\u4e8e\u5185\u5b58\uff0c\u4f46\u5b83\u6bd4\u5185\u5b58\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5e8f\u6267\u884c\u901f\u5ea6\u4e0a\u8d77\u7740\u81f3\u5173\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u4e8e\u7f13\u5b58\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5b58\u50a8\u4e00\u5c0f\u90e8\u5206\u9891\u7e41\u8bbf\u95ee\u7684\u6570\u636e\uff0c\u56e0\u6b64\u5f53 CPU \u5c1d\u8bd5\u8bbf\u95ee\u7684\u6570\u636e\u4e0d\u5728\u7f13\u5b58\u4e2d\u65f6\uff0c\u5c31\u4f1a\u53d1\u751f\u7f13\u5b58\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u65f6 CPU \u4e0d\u5f97\u4e0d\u4ece\u901f\u5ea6\u8f83\u6162\u7684\u5185\u5b58\u4e2d\u52a0\u8f7d\u6240\u9700\u6570\u636e\u3002

\u663e\u7136\uff0c\u201c\u7f13\u5b58\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8bfb\u5199\u6570\u636e\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5e8f\u6027\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u4eec\u5c06 CPU \u4ece\u7f13\u5b58\u4e2d\u6210\u529f\u83b7\u53d6\u6570\u636e\u7684\u6bd4\u4f8b\u79f0\u4e3a\u7f13\u5b58\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u8fd9\u4e2a\u6307\u6807\u901a\u5e38\u7528\u6765\u8861\u91cf\u7f13\u5b58\u6548\u7387\u3002

\u4e3a\u4e86\u5c3d\u53ef\u80fd\u8fbe\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u7f13\u5b58\u4f1a\u91c7\u53d6\u4ee5\u4e0b\u6570\u636e\u52a0\u8f7d\u673a\u5236\u3002

  • \u7f13\u5b58\u884c\uff1a\u7f13\u5b58\u4e0d\u662f\u5355\u4e2a\u5b57\u8282\u5730\u5b58\u50a8\u4e0e\u52a0\u8f7d\u6570\u636e\uff0c\u800c\u662f\u4ee5\u7f13\u5b58\u884c\u4e3a\u5355\u4f4d\u3002\u76f8\u6bd4\u4e8e\u5355\u4e2a\u5b57\u8282\u7684\u4f20\u8f93\uff0c\u7f13\u5b58\u884c\u7684\u4f20\u8f93\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
  • \u9884\u53d6\u673a\u5236\uff1a\u5904\u7406\u5668\u4f1a\u5c1d\u8bd5\u9884\u6d4b\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\uff08\u4f8b\u5982\u987a\u5e8f\u8bbf\u95ee\u3001\u56fa\u5b9a\u6b65\u957f\u8df3\u8dc3\u8bbf\u95ee\u7b49\uff09\uff0c\u5e76\u6839\u636e\u7279\u5b9a\u6a21\u5f0f\u5c06\u6570\u636e\u52a0\u8f7d\u81f3\u7f13\u5b58\u4e4b\u4e2d\uff0c\u4ece\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
  • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u9644\u8fd1\u7684\u6570\u636e\u53ef\u80fd\u8fd1\u671f\u4e5f\u4f1a\u88ab\u8bbf\u95ee\u3002\u56e0\u6b64\uff0c\u7f13\u5b58\u5728\u52a0\u8f7d\u67d0\u4e00\u6570\u636e\u65f6\uff0c\u4e5f\u4f1a\u52a0\u8f7d\u5176\u9644\u8fd1\u7684\u6570\u636e\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
  • \u65f6\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u5728\u4e0d\u4e45\u7684\u5c06\u6765\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8bbf\u95ee\u3002\u7f13\u5b58\u5229\u7528\u8fd9\u4e00\u539f\u7406\uff0c\u901a\u8fc7\u4fdd\u7559\u6700\u8fd1\u8bbf\u95ee\u8fc7\u7684\u6570\u636e\u6765\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

\u5b9e\u9645\u4e0a\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5bf9\u7f13\u5b58\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

  • \u5360\u7528\u7a7a\u95f4\uff1a\u94fe\u8868\u5143\u7d20\u6bd4\u6570\u7ec4\u5143\u7d20\u5360\u7528\u7a7a\u95f4\u66f4\u591a\uff0c\u5bfc\u81f4\u7f13\u5b58\u4e2d\u5bb9\u7eb3\u7684\u6709\u6548\u6570\u636e\u91cf\u66f4\u5c11\u3002
  • \u7f13\u5b58\u884c\uff1a\u94fe\u8868\u6570\u636e\u5206\u6563\u5728\u5185\u5b58\u5404\u5904\uff0c\u800c\u7f13\u5b58\u662f\u201c\u6309\u884c\u52a0\u8f7d\u201d\u7684\uff0c\u56e0\u6b64\u52a0\u8f7d\u5230\u65e0\u6548\u6570\u636e\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
  • \u9884\u53d6\u673a\u5236\uff1a\u6570\u7ec4\u6bd4\u94fe\u8868\u7684\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9884\u6d4b\u6027\u201d\uff0c\u5373\u7cfb\u7edf\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c06\u88ab\u52a0\u8f7d\u7684\u6570\u636e\u3002
  • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u6570\u7ec4\u88ab\u5b58\u50a8\u5728\u96c6\u4e2d\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u88ab\u52a0\u8f7d\u6570\u636e\u9644\u8fd1\u7684\u6570\u636e\u66f4\u6709\u53ef\u80fd\u5373\u5c06\u88ab\u8bbf\u95ee\u3002

\u603b\u4f53\u800c\u8a00\uff0c\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u4f18\u4e8e\u94fe\u8868\u3002\u8fd9\u4f7f\u5f97\u5728\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u5f80\u5f80\u66f4\u53d7\u6b22\u8fce\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u7f13\u5b58\u6548\u7387\u5e76\u4e0d\u610f\u5473\u7740\u6570\u7ec4\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u4f18\u4e8e\u94fe\u8868\u3002\u5b9e\u9645\u5e94\u7528\u4e2d\u9009\u62e9\u54ea\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u6765\u51b3\u5b9a\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5b9e\u73b0\u201c\u6808\u201d\u6570\u636e\u7ed3\u6784\uff08\u4e0b\u4e00\u7ae0\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\uff09\uff0c\u4f46\u5b83\u4eec\u9002\u7528\u4e8e\u4e0d\u540c\u573a\u666f\u3002

  • \u5728\u505a\u7b97\u6cd5\u9898\u65f6\uff0c\u6211\u4eec\u4f1a\u503e\u5411\u4e8e\u9009\u62e9\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u968f\u673a\u8bbf\u95ee\u7684\u80fd\u529b\uff0c\u4ee3\u4ef7\u4ec5\u662f\u9700\u8981\u9884\u5148\u4e3a\u6570\u7ec4\u5206\u914d\u4e00\u5b9a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
  • \u5982\u679c\u6570\u636e\u91cf\u975e\u5e38\u5927\u3001\u52a8\u6001\u6027\u5f88\u9ad8\u3001\u6808\u7684\u9884\u671f\u5927\u5c0f\u96be\u4ee5\u4f30\u8ba1\uff0c\u90a3\u4e48\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u66f4\u52a0\u5408\u9002\u3002\u94fe\u8868\u80fd\u591f\u5c06\u5927\u91cf\u6570\u636e\u5206\u6563\u5b58\u50a8\u4e8e\u5185\u5b58\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u5e76\u4e14\u907f\u514d\u4e86\u6570\u7ec4\u6269\u5bb9\u4ea7\u751f\u7684\u989d\u5916\u5f00\u9500\u3002
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u4e24\u79cd\u5b58\u50a8\u65b9\u5f0f\uff1a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\u3002\u4e24\u8005\u7684\u7279\u70b9\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u6027\u3002
  • \u6570\u7ec4\u652f\u6301\u968f\u673a\u8bbf\u95ee\u3001\u5360\u7528\u5185\u5b58\u8f83\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002
  • \u94fe\u8868\u901a\u8fc7\u66f4\u6539\u5f15\u7528\uff08\u6307\u9488\uff09\u5b9e\u73b0\u9ad8\u6548\u7684\u8282\u70b9\u63d2\u5165\u4e0e\u5220\u9664\uff0c\u4e14\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\uff1b\u4f46\u8282\u70b9\u8bbf\u95ee\u6548\u7387\u4f4e\u3001\u5360\u7528\u5185\u5b58\u8f83\u591a\u3002\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u5355\u5411\u94fe\u8868\u3001\u73af\u5f62\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
  • \u5217\u8868\u662f\u4e00\u79cd\u652f\u6301\u589e\u5220\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u3002\u5b83\u4fdd\u7559\u4e86\u6570\u7ec4\u7684\u4f18\u52bf\uff0c\u540c\u65f6\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\u3002
  • \u5217\u8868\u7684\u51fa\u73b0\u5927\u5e45\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
  • \u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u6570\u7ec4\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u5185\u5b58\u7a7a\u95f4\u6548\u7387\uff0c\u800c\u94fe\u8868\u5219\u5728\u5185\u5b58\u4f7f\u7528\u4e0a\u66f4\u52a0\u7075\u6d3b\u3002
  • \u7f13\u5b58\u901a\u8fc7\u7f13\u5b58\u884c\u3001\u9884\u53d6\u673a\u5236\u4ee5\u53ca\u7a7a\u95f4\u5c40\u90e8\u6027\u548c\u65f6\u95f4\u5c40\u90e8\u6027\u7b49\u6570\u636e\u52a0\u8f7d\u673a\u5236\uff0c\u4e3a CPU \u63d0\u4f9b\u5feb\u901f\u6570\u636e\u8bbf\u95ee\uff0c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\u3002
  • \u7531\u4e8e\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u94fe\u8868\u66f4\u9ad8\u6548\u3002\u5728\u9009\u62e9\u6570\u636e\u7ed3\u6784\u65f6\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u548c\u573a\u666f\u505a\u51fa\u6070\u5f53\u9009\u62e9\u3002
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5806\u4e0a\u7684\u6570\u7ec4\u90fd\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u6570\u636e\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u6808\u548c\u5806\u5177\u6709\u5404\u81ea\u7684\u7279\u70b9\uff0c\u4ece\u800c\u5bfc\u81f4\u4ee5\u4e0b\u4e0d\u540c\u70b9\u3002

  1. \u5206\u914d\u548c\u91ca\u653e\u6548\u7387\uff1a\u6808\u662f\u4e00\u5757\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff1b\u800c\u5806\u5185\u5b58\u76f8\u5bf9\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u52a8\u6001\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u4e0a\u7684\u5206\u914d\u548c\u91ca\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u6808\u4e0a\u7684\u6162\u3002
  2. \u5927\u5c0f\u9650\u5236\uff1a\u6808\u5185\u5b58\u76f8\u5bf9\u8f83\u5c0f\uff0c\u5806\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\u3002\u56e0\u6b64\u5806\u66f4\u52a0\u9002\u5408\u5b58\u50a8\u5927\u578b\u6570\u7ec4\u3002
  3. \u7075\u6d3b\u6027\uff1a\u6808\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\uff0c\u800c\u5806\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u786e\u5b9a\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u6570\u7ec4\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u76f8\u540c\u7c7b\u578b\u5462\uff1f

\u94fe\u8868\u7531\u8282\u70b9\u7ec4\u6210\uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u5f15\u7528\uff08\u6307\u9488\uff09\u8fde\u63a5\uff0c\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

\u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 \u5b57\u8282 \u548c 8 \u5b57\u8282 \uff0c\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd\u201c\u5143\u7d20\u957f\u5ea6\u201d\u3002

# \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

Q\uff1a\u5220\u9664\u8282\u70b9 P \u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a None \u5462\uff1f

\u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u8282\u70b9\u904d\u5386\u5230\u5c3e\u8282\u70b9\u5df2\u7ecf\u4e0d\u4f1a\u9047\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u8282\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u8282\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8be5\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u3002

\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff08\u505a\u9898\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65ad\u5f00\u6ca1\u6709\u5173\u7cfb\uff0c\u53ea\u8981\u4fdd\u8bc1\u7a0b\u5e8f\u7684\u903b\u8f91\u662f\u6b63\u786e\u7684\u5c31\u884c\u3002\u4ece\u6807\u51c6\u5e93\u7684\u89d2\u5ea6\u770b\uff0c\u65ad\u5f00\u66f4\u52a0\u5b89\u5168\u3001\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65ad\u5f00\uff0c\u5047\u8bbe\u88ab\u5220\u9664\u8282\u70b9\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u4e48\u5b83\u4f1a\u5f71\u54cd\u540e\u7ee7\u8282\u70b9\u7684\u5185\u5b58\u56de\u6536\u3002

Q\uff1a\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

\u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u8282\u70b9\u3001\u5c3e\u8282\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

Q\uff1a\u56fe\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u8282\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u8282\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

\u8be5\u793a\u610f\u56fe\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

  • \u4e0d\u540c\u7c7b\u578b\u7684\u8282\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u5b9e\u4f8b\u5bf9\u8c61\u7b49\u3002
  • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

Q\uff1a\u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

\u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

Q\uff1a\u201c\u5217\u8868\u7684\u51fa\u73b0\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u540e\uff0c\u8fd9 3 \u4e2a\u5143\u7d20\u7684\u5730\u5740\u662f\u76f8\u8fde\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u4f1a\u53d1\u73b0\u5b83\u4eec\u6bcf\u4e2a\u5143\u7d20\u7684 id \u5e76\u4e0d\u662f\u8fde\u7eed\u7684\uff0c\u800c\u662f\u5206\u522b\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u8fd9\u4e9b\u5143\u7d20\u7684\u5730\u5740\u4e0d\u8fde\u7eed\uff0c\u90a3\u4e48 m \u8fd8\u662f\u6570\u7ec4\u5417\uff1f

\u5047\u5982\u628a\u5217\u8868\u5143\u7d20\u6362\u6210\u94fe\u8868\u8282\u70b9 n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u8fd9 5 \u4e2a\u8282\u70b9\u5bf9\u8c61\u4e5f\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002\u7136\u800c\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5217\u8868\u7d22\u5f15\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u8282\u70b9\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u8bbf\u95ee\u5230\u5bf9\u5e94\u7684\u8282\u70b9\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5b58\u50a8\u7684\u662f\u8282\u70b9\u7684\u5f15\u7528\uff0c\u800c\u975e\u8282\u70b9\u672c\u8eab\u3002

\u4e0e\u8bb8\u591a\u8bed\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6570\u5b57\u4e5f\u88ab\u5305\u88c5\u4e3a\u5bf9\u8c61\uff0c\u5217\u8868\u4e2d\u5b58\u50a8\u7684\u4e0d\u662f\u6570\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5bf9\u6570\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0\u4e24\u4e2a\u6570\u7ec4\u4e2d\u7684\u76f8\u540c\u6570\u5b57\u62e5\u6709\u540c\u4e00\u4e2a id \uff0c\u5e76\u4e14\u8fd9\u4e9b\u6570\u5b57\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

Q\uff1aC++ STL \u91cc\u9762\u7684 std::list \u5df2\u7ecf\u5b9e\u73b0\u4e86\u53cc\u5411\u94fe\u8868\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u7b97\u6cd5\u4e66\u4e0a\u4e0d\u600e\u4e48\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u4e3a\u6709\u4ec0\u4e48\u5c40\u9650\u6027\u5462\uff1f

\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u5f80\u5f80\u66f4\u9752\u7750\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u65f6\u624d\u4f7f\u7528\u94fe\u8868\uff0c\u4e3b\u8981\u6709\u4e24\u4e2a\u539f\u56e0\u3002

  • \u7a7a\u95f4\u5f00\u9500\uff1a\u7531\u4e8e\u6bcf\u4e2a\u5143\u7d20\u9700\u8981\u4e24\u4e2a\u989d\u5916\u7684\u6307\u9488\uff08\u4e00\u4e2a\u7528\u4e8e\u524d\u4e00\u4e2a\u5143\u7d20\uff0c\u4e00\u4e2a\u7528\u4e8e\u540e\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u5360\u7528\u7a7a\u95f4\u3002
  • \u7f13\u5b58\u4e0d\u53cb\u597d\uff1a\u7531\u4e8e\u6570\u636e\u4e0d\u662f\u8fde\u7eed\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5bf9\u7f13\u5b58\u7684\u5229\u7528\u7387\u8f83\u4f4e\u3002\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cstd::vector \u7684\u6027\u80fd\u4f1a\u66f4\u597d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u94fe\u8868\u7684\u60c5\u51b5\u4e3b\u8981\u662f\u4e8c\u53c9\u6811\u548c\u56fe\u3002\u6808\u548c\u961f\u5217\u5f80\u5f80\u4f1a\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u94fe\u8868\u3002

Q\uff1a\u521d\u59cb\u5316\u5217\u8868 res = [0] * self.size() \u64cd\u4f5c\uff0c\u4f1a\u5bfc\u81f4 res \u7684\u6bcf\u4e2a\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u5730\u5740\u5417\uff1f

\u4e0d\u4f1a\u3002\u4f46\u4e8c\u7ef4\u6570\u7ec4\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7ef4\u5217\u8868 res = [[0] * self.size()] \uff0c\u5219\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u4e2a\u5217\u8868 [0] \u3002

"},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

Abstract

\u6211\u4eec\u5982\u540c\u8ff7\u5bab\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u8fdb\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u4f1a\u9047\u5230\u56f0\u96be\u3002

\u56de\u6eaf\u7684\u529b\u91cf\u8ba9\u6211\u4eec\u80fd\u591f\u91cd\u65b0\u5f00\u59cb\uff0c\u4e0d\u65ad\u5c1d\u8bd5\uff0c\u6700\u7ec8\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

"},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5
  • 13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898
  • 13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898
  • 13.4 \u00a0 N \u7687\u540e\u95ee\u9898
  • 13.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

\u56de\u6eaf\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u79cd\u901a\u8fc7\u7a77\u4e3e\u6765\u89e3\u51b3\u95ee\u9898\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u4ece\u4e00\u4e2a\u521d\u59cb\u72b6\u6001\u51fa\u53d1\uff0c\u66b4\u529b\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5f53\u9047\u5230\u6b63\u786e\u7684\u89e3\u5219\u5c06\u5176\u8bb0\u5f55\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5c1d\u8bd5\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u90fd\u65e0\u6cd5\u627e\u5230\u89e3\u4e3a\u6b62\u3002

\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5229\u7528\u524d\u5e8f\u904d\u5386\u6784\u9020\u4e00\u4e2a\u56de\u6eaf\u95ee\u9898\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u9898\u4e00

\u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

\u5bf9\u4e8e\u6b64\u9898\uff0c\u6211\u4eec\u524d\u5e8f\u904d\u5386\u8fd9\u68f5\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002\u76f8\u5173\u8fc7\u7a0b\u5b9e\u73b0\u5982\u56fe 13-1 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
preorder_traversal_i_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
preorder_traversal_i_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
preorder_traversal_i_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
preorder_traversal_i_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
preorder_traversal_i_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
preorder_traversal_i_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
preorder_traversal_i_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_i_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-1 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

"},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000","text":"

\u4e4b\u6240\u4ee5\u79f0\u4e4b\u4e3a\u56de\u6eaf\u7b97\u6cd5\uff0c\u662f\u56e0\u4e3a\u8be5\u7b97\u6cd5\u5728\u641c\u7d22\u89e3\u7a7a\u95f4\u65f6\u4f1a\u91c7\u7528\u201c\u5c1d\u8bd5\u201d\u4e0e\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u5f53\u7b97\u6cd5\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u9047\u5230\u67d0\u4e2a\u72b6\u6001\u65e0\u6cd5\u7ee7\u7eed\u524d\u8fdb\u6216\u65e0\u6cd5\u5f97\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u65f6\uff0c\u5b83\u4f1a\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u5c1d\u8bd5\u5176\u4ed6\u53ef\u80fd\u7684\u9009\u62e9\u3002

\u5bf9\u4e8e\u4f8b\u9898\u4e00\uff0c\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5c1d\u8bd5\u201d\uff0c\u800c\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u8fd4\u56de\u7236\u8282\u70b9\u7684 return \u5219\u8868\u793a\u201c\u56de\u9000\u201d\u3002

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u56de\u9000\u5e76\u4e0d\u4ec5\u4ec5\u5305\u62ec\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u4f8b\u9898\u4e8c

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\u3002

\u5728\u4f8b\u9898\u4e00\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u5217\u8868 path \u8bb0\u5f55\u8bbf\u95ee\u8fc7\u7684\u8282\u70b9\u8def\u5f84\u3002\u5f53\u8bbf\u95ee\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u590d\u5236 path \u5e76\u6dfb\u52a0\u8fdb\u7ed3\u679c\u5217\u8868 res \u3002\u904d\u5386\u5b8c\u6210\u540e\uff0cres \u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_ii_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_ii_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_ii_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_ii_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_ii_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_ii_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_ii_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_ii_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_ii_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_ii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_ii_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u6bcf\u6b21\u201c\u5c1d\u8bd5\u201d\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u5c06\u5f53\u524d\u8282\u70b9\u6dfb\u52a0\u8fdb path \u6765\u8bb0\u5f55\u8def\u5f84\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u4eec\u9700\u8981\u5c06\u8be5\u8282\u70b9\u4ece path \u4e2d\u5f39\u51fa\uff0c\u4ee5\u6062\u590d\u672c\u6b21\u5c1d\u8bd5\u4e4b\u524d\u7684\u72b6\u6001\u3002

\u89c2\u5bdf\u56fe 13-2 \u6240\u793a\u7684\u8fc7\u7a0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5c1d\u8bd5\u548c\u56de\u9000\u7406\u89e3\u4e3a\u201c\u524d\u8fdb\u201d\u4e0e\u201c\u64a4\u9500\u201d\uff0c\u4e24\u4e2a\u64cd\u4f5c\u4e92\u4e3a\u9006\u5411\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 13-2 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000

"},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

\u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

\u4f8b\u9898\u4e09

\u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u5e76\u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u3002

\u4e3a\u4e86\u6ee1\u8db3\u4ee5\u4e0a\u7ea6\u675f\u6761\u4ef6\uff0c\u6211\u4eec\u9700\u8981\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\uff0c\u5219\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_iii_compact.cpp
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_iii_compact.java
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_iii_compact.cs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_iii_compact.go
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_iii_compact.swift
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_iii_compact.js
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.ts
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.dart
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_iii_compact.rs
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_iii_compact.c
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_iii_compact.kt
/* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_iii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_iii_compact.zig
[class]{}-[func]{preOrder}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u201c\u526a\u679d\u201d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5982\u56fe 13-3 \u6240\u793a\uff0c\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u641c\u7d22\u5206\u652f\uff0c\u907f\u514d\u8bb8\u591a\u65e0\u610f\u4e49\u7684\u5c1d\u8bd5\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u641c\u7d22\u6548\u7387\u3002

\u56fe 13-3 \u00a0 \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u4ee3\u7801","text":"

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c1d\u8bd5\u5c06\u56de\u6eaf\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\uff0c\u63d0\u5347\u4ee3\u7801\u7684\u901a\u7528\u6027\u3002

\u5728\u4ee5\u4e0b\u6846\u67b6\u4ee3\u7801\u4e2d\uff0cstate \u8868\u793a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
/* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
\n
\n

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u57fa\u4e8e\u6846\u67b6\u4ee3\u7801\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u72b6\u6001 state \u4e3a\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u4e3a\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8bb0\u5f55\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u590d\u72b6\u6001\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
preorder_traversal_iii_template.cpp
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.java
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.cs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.go
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.swift
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.js
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.ts
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.dart
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
preorder_traversal_iii_template.rs
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
preorder_traversal_iii_template.c
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution()) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution();\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice();\n        }\n    }\n}\n
preorder_traversal_iii_template.kt
/* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.rb
[class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\n
preorder_traversal_iii_template.zig
[class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6839\u636e\u9898\u610f\uff0c\u6211\u4eec\u5728\u627e\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u540e\u5e94\u8be5\u7ee7\u7eed\u641c\u7d22\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u8bb0\u5f55\u89e3\u4e4b\u540e\u7684 return \u8bed\u53e5\u5220\u9664\u3002\u56fe 13-4 \u5bf9\u6bd4\u4e86\u4fdd\u7559\u6216\u5220\u9664 return \u8bed\u53e5\u7684\u641c\u7d22\u8fc7\u7a0b\u3002

\u56fe 13-4 \u00a0 \u4fdd\u7559\u4e0e\u5220\u9664 return \u7684\u641c\u7d22\u8fc7\u7a0b\u5bf9\u6bd4

\u76f8\u6bd4\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u4ee3\u7801\u5b9e\u73b0\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u4ee3\u7801\u5b9e\u73b0\u867d\u7136\u663e\u5f97\u5570\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u56de\u6eaf\u95ee\u9898\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u672f\u8bed","text":"

\u4e3a\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u7b97\u6cd5\u95ee\u9898\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e0b\u56de\u6eaf\u7b97\u6cd5\u4e2d\u5e38\u7528\u672f\u8bed\u7684\u542b\u4e49\uff0c\u5e76\u5bf9\u7167\u4f8b\u9898\u4e09\u7ed9\u51fa\u5bf9\u5e94\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

\u8868 13-1 \u00a0 \u5e38\u89c1\u7684\u56de\u6eaf\u7b97\u6cd5\u672f\u8bed

\u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u4e2a\u6216\u591a\u4e2a \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u6240\u6709\u8def\u5f84 \u7ea6\u675f\u6761\u4ef6\uff08constraint\uff09 \u7ea6\u675f\u6761\u4ef6\u662f\u95ee\u9898\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u6761\u4ef6\uff0c\u901a\u5e38\u7528\u4e8e\u526a\u679d \u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u8282\u70b9 \\(3\\) \u72b6\u6001\uff08state\uff09 \u72b6\u6001\u8868\u793a\u95ee\u9898\u5728\u67d0\u4e00\u65f6\u523b\u7684\u60c5\u51b5\uff0c\u5305\u62ec\u5df2\u7ecf\u505a\u51fa\u7684\u9009\u62e9 \u5f53\u524d\u5df2\u8bbf\u95ee\u7684\u8282\u70b9\u8def\u5f84\uff0c\u5373 path \u8282\u70b9\u5217\u8868 \u5c1d\u8bd5\uff08attempt\uff09 \u5c1d\u8bd5\u662f\u6839\u636e\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\uff0c\u68c0\u67e5\u662f\u5426\u4e3a\u89e3 \u9012\u5f52\u8bbf\u95ee\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\uff0c\u5c06\u8282\u70b9\u6dfb\u52a0\u8fdb path \uff0c\u5224\u65ad\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u72b6\u6001\u65f6\uff0c\u64a4\u9500\u524d\u9762\u505a\u51fa\u7684\u9009\u62e9\uff0c\u56de\u5230\u4e0a\u4e00\u4e2a\u72b6\u6001 \u5f53\u8d8a\u8fc7\u53f6\u8282\u70b9\u3001\u7ed3\u675f\u8282\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u636e\u95ee\u9898\u7279\u6027\u548c\u7ea6\u675f\u6761\u4ef6\u907f\u514d\u65e0\u610f\u4e49\u7684\u641c\u7d22\u8def\u5f84\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u7d22\u6548\u7387 \u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22

Tip

\u95ee\u9898\u3001\u89e3\u3001\u72b6\u6001\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u4e0a\u662f\u4e00\u79cd\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u7b97\u6cd5\uff0c\u5b83\u5c1d\u8bd5\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u76f4\u5230\u627e\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u5728\u4e8e\u80fd\u591f\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

\u7136\u800c\uff0c\u5728\u5904\u7406\u5927\u89c4\u6a21\u6216\u8005\u590d\u6742\u95ee\u9898\u65f6\uff0c\u56de\u6eaf\u7b97\u6cd5\u7684\u8fd0\u884c\u6548\u7387\u53ef\u80fd\u96be\u4ee5\u63a5\u53d7\u3002

  • \u65f6\u95f4\uff1a\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u904d\u5386\u72b6\u6001\u7a7a\u95f4\u7684\u6240\u6709\u53ef\u80fd\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u6307\u6570\u9636\u6216\u9636\u4e58\u9636\u3002
  • \u7a7a\u95f4\uff1a\u5728\u9012\u5f52\u8c03\u7528\u4e2d\u9700\u8981\u4fdd\u5b58\u5f53\u524d\u7684\u72b6\u6001\uff08\u4f8b\u5982\u8def\u5f84\u3001\u7528\u4e8e\u526a\u679d\u7684\u8f85\u52a9\u53d8\u91cf\u7b49\uff09\uff0c\u5f53\u6df1\u5ea6\u5f88\u5927\u65f6\uff0c\u7a7a\u95f4\u9700\u6c42\u53ef\u80fd\u4f1a\u53d8\u5f97\u5f88\u5927\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u7684\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u3002\u5bf9\u4e8e\u8fd9\u4e9b\u95ee\u9898\uff0c\u7531\u4e8e\u65e0\u6cd5\u9884\u6d4b\u54ea\u4e9b\u9009\u62e9\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u4eec\u5fc5\u987b\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u8fdb\u884c\u904d\u5386\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5173\u952e\u662f\u5982\u4f55\u4f18\u5316\u6548\u7387\uff0c\u5e38\u89c1\u7684\u6548\u7387\u4f18\u5316\u65b9\u6cd5\u6709\u4e24\u79cd\u3002

  • \u526a\u679d\uff1a\u907f\u514d\u641c\u7d22\u90a3\u4e9b\u80af\u5b9a\u4e0d\u4f1a\u4ea7\u751f\u89e3\u7684\u8def\u5f84\uff0c\u4ece\u800c\u8282\u7701\u65f6\u95f4\u548c\u7a7a\u95f4\u3002
  • \u542f\u53d1\u5f0f\u641c\u7d22\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8ba1\u503c\uff0c\u4ece\u800c\u4f18\u5148\u641c\u7d22\u6700\u6709\u53ef\u80fd\u4ea7\u751f\u6709\u6548\u89e3\u7684\u8def\u5f84\u3002
"},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u9898","text":"

\u56de\u6eaf\u7b97\u6cd5\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u641c\u7d22\u95ee\u9898\u3001\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u548c\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u3002

\u641c\u7d22\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u89e3\u51b3\u65b9\u6848\u3002

  • \u5168\u6392\u5217\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7ec4\u5408\u3002
  • \u5b50\u96c6\u548c\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\u548c\u4e00\u4e2a\u76ee\u6807\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u4e3a\u76ee\u6807\u548c\u7684\u5b50\u96c6\u3002
  • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u6839\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\uff0c\u4e14\u4e0d\u80fd\u5c06\u5927\u5706\u76d8\u653e\u5728\u5c0f\u5706\u76d8\u4e0a\u3002

\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u6240\u6709\u7ea6\u675f\u6761\u4ef6\u7684\u89e3\u3002

  • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76d8\u4e0a\u653e\u7f6e \\(n\\) \u4e2a\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u4eec\u4e92\u4e0d\u653b\u51fb\u3002
  • \u6570\u72ec\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7f51\u683c\u4e2d\u586b\u5165\u6570\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u4e2a \\(3 \\times 3\\) \u5b50\u7f51\u683c\u4e2d\u7684\u6570\u5b57\u4e0d\u91cd\u590d\u3002
  • \u56fe\u7740\u8272\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u7528\u6700\u5c11\u7684\u989c\u8272\u7ed9\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u7740\u8272\uff0c\u4f7f\u5f97\u76f8\u90bb\u9876\u70b9\u989c\u8272\u4e0d\u540c\u3002

\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u4e00\u4e2a\u7ec4\u5408\u7a7a\u95f4\u4e2d\u627e\u5230\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\u7684\u6700\u4f18\u89e3\u3002

  • 0-1 \u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u80cc\u5305\uff0c\u6bcf\u4e2a\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u4ef7\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5185\uff0c\u9009\u62e9\u7269\u54c1\u4f7f\u5f97\u603b\u4ef7\u503c\u6700\u5927\u3002
  • \u65c5\u884c\u5546\u95ee\u9898\uff1a\u5728\u4e00\u4e2a\u56fe\u4e2d\uff0c\u4ece\u4e00\u4e2a\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u6240\u6709\u5176\u4ed6\u70b9\u6070\u597d\u4e00\u6b21\u540e\u8fd4\u56de\u8d77\u70b9\uff0c\u6c42\u6700\u77ed\u8def\u5f84\u3002
  • \u6700\u5927\u56e2\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u56fe\uff0c\u5373\u5b50\u56fe\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u90fd\u6709\u8fb9\u76f8\u8fde\u3002

\u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u4f18\u89e3\u51b3\u65b9\u6848\u3002

  • 0-1 \u80cc\u5305\u95ee\u9898\u901a\u5e38\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\uff0c\u4ee5\u8fbe\u5230\u66f4\u9ad8\u7684\u65f6\u95f4\u6548\u7387\u3002
  • \u65c5\u884c\u5546\u662f\u4e00\u4e2a\u8457\u540d\u7684 NP-Hard \u95ee\u9898\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u9057\u4f20\u7b97\u6cd5\u548c\u8681\u7fa4\u7b97\u6cd5\u7b49\u3002
  • \u6700\u5927\u56e2\u95ee\u9898\u662f\u56fe\u8bba\u4e2d\u7684\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\uff0c\u53ef\u7528\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u542f\u53d1\u5f0f\u7b97\u6cd5\u6765\u89e3\u51b3\u3002
"},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u95ee\u9898","text":"

Question

\u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u540c\u5904\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u6761\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

\u5982\u56fe 13-15 \u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

\u56fe 13-15 \u00a0 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

\u56fe 13-16 \u5c55\u793a\u4e86\u672c\u9898\u7684\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u6761\u5bf9\u89d2\u7ebf\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u6b21\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

\u56fe 13-16 \u00a0 n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

"},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

\u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002

\u56fe 13-17 \u6240\u793a\u4e3a \\(4\\) \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u753b\u5e45\u9650\u5236\uff0c\u56fe 13-17 \u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u4e2a\u641c\u7d22\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u8fdb\u884c\u4e86\u526a\u679d\u3002

\u56fe 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

"},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u4e0e\u5bf9\u89d2\u7ebf\u526a\u679d","text":"

\u4e3a\u4e86\u6ee1\u8db3\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u8fdb\u884c\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

\u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\((row, col)\\) \uff0c\u9009\u5b9a\u77e9\u9635\u4e2d\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u4e3a\u6052\u5b9a\u503c\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5219\u5b83\u4eec\u4e00\u5b9a\u5904\u5728\u540c\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002\u5229\u7528\u8be5\u89c4\u5f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u56fe 13-18 \u6240\u793a\u7684\u6570\u7ec4 diags1 \u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

\u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u540c\u6837\u4e5f\u53ef\u4ee5\u501f\u52a9\u6570\u7ec4 diags2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

\u56fe 13-18 \u00a0 \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

"},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u8bf7\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635\u4e2d \\(row - col\\) \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u8303\u56f4\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7684\u6570\u91cf\u90fd\u4e3a \\(2n - 1\\) \uff0c\u5373\u6570\u7ec4 diags1 \u548c diags2 \u7684\u957f\u5ea6\u90fd\u4e3a \\(2n - 1\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u904d\u5386\u6240\u6709\u5217\n    for col in range(n):\n        # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
n_queens.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
n_queens.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
n_queens.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
n_queens.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
n_queens.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
n_queens.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
n_queens.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
n_queens.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u4e2a\u9009\u62e9\uff0c\u4f7f\u7528 \\(O(n!)\\) \u65f6\u95f4\u3002\u5f53\u8bb0\u5f55\u89e3\u65f6\uff0c\u9700\u8981\u590d\u5236\u77e9\u9635 state \u5e76\u6dfb\u52a0\u8fdb res \uff0c\u590d\u5236\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n! \\cdot n^2)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u6570\u7ec4 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0c\u6570\u7ec4 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

\u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u8868 13-2 \u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u636e\uff0c\u5305\u62ec\u8f93\u5165\u6570\u7ec4\u548c\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

\u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

\u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u65e0\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \uff0c\u518d\u9009\u62e9 \\(3\\) \uff0c\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

\u4ece\u56de\u6eaf\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u8bf7\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u5e94\u8be5\u662f\u552f\u4e00\u7684\u3002

\u5982\u56fe 13-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

\u56fe 13-5 \u00a0 \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

"},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u590d\u9009\u62e9\u526a\u679d","text":"

\u4e3a\u4e86\u5b9e\u73b0\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u6211\u4eec\u8003\u8651\u5f15\u5165\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\uff0c\u5e76\u57fa\u4e8e\u5b83\u5b9e\u73b0\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

  • \u5728\u505a\u51fa\u9009\u62e9 choice[i] \u540e\uff0c\u6211\u4eec\u5c31\u5c06 selected[i] \u8d4b\u503c\u4e3a \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9009\u62e9\u3002
  • \u904d\u5386\u9009\u62e9\u5217\u8868 choices \u65f6\uff0c\u8df3\u8fc7\u6240\u6709\u5df2\u88ab\u9009\u62e9\u7684\u8282\u70b9\uff0c\u5373\u526a\u679d\u3002

\u5982\u56fe 13-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

\u56fe 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

\u89c2\u5bdf\u56fe 13-6 \u53d1\u73b0\uff0c\u8be5\u526a\u679d\u64cd\u4f5c\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u51cf\u5c0f\u81f3 \\(O(n!)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u6574\u4f53\u4ee3\u7801\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if not selected[i]:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_i.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_i.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_i.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_i.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_i.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_i.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    if (!selected[i]) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_i.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_i.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_i.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
permutations_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u8651\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u5143\u7d20 \\(1\\) \uff0c\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a \\(1\\) \u8bb0\u4e3a \\(\\hat{1}\\) \u3002

\u5982\u56fe 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u590d\u7684\u3002

\u56fe 13-7 \u00a0 \u91cd\u590d\u6392\u5217

\u90a3\u4e48\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u6ca1\u6709\u5fc5\u8981\uff0c\u5e94\u5f53\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

"},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u89c2\u5bdf\u56fe 13-8 \uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u4e4b\u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u5e94\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u4fdd\u8bc1\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002

\u56fe 13-8 \u00a0 \u91cd\u590d\u6392\u5217\u526a\u679d

"},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_ii.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_ii.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_ii.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_ii.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_ii.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_ii.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_ii.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_ii.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated[choice] = true; // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_ii.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
permutations_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u4e24\u79cd\u526a\u679d\u5bf9\u6bd4","text":"

\u8bf7\u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u7528\u4e8e\u526a\u679d\uff0c\u4f46\u4e24\u8005\u7684\u76ee\u6807\u4e0d\u540c\u3002

  • \u91cd\u590d\u9009\u62e9\u526a\u679d\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
  • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u6bcf\u4e2a\u8c03\u7528\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u672c\u8f6e\u904d\u5386\uff08for \u5faa\u73af\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002

\u56fe 13-9 \u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

\u56fe 13-9 \u00a0 \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

"},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u65e0\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ef\u4ee5\u88ab\u9009\u53d6\u591a\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

\u4f8b\u5982\uff0c\u8f93\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6807\u6574\u6570 \\(9\\) \uff0c\u89e3\u4e3a \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

  • \u8f93\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u91cd\u590d\u9009\u53d6\u3002
  • \u5b50\u96c6\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u4e2a\u5b50\u96c6\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c2\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

\u7c7b\u4f3c\u4e8e\u5168\u6392\u5217\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\uff0c\u5e76\u5728\u9009\u62e9\u8fc7\u7a0b\u4e2d\u5b9e\u65f6\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u5f53\u5143\u7d20\u548c\u7b49\u4e8e target \u65f6\uff0c\u5c31\u5c06\u5b50\u96c6\u8bb0\u5f55\u81f3\u7ed3\u679c\u5217\u8868\u3002

\u800c\u4e0e\u5168\u6392\u5217\u95ee\u9898\u4e0d\u540c\u7684\u662f\uff0c\u672c\u9898\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u9009\u53d6\uff0c\u56e0\u6b64\u65e0\u987b\u501f\u52a9 selected \u5e03\u5c14\u5217\u8868\u6765\u8bb0\u5f55\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u53ef\u4ee5\u5bf9\u5168\u6392\u5217\u4ee3\u7801\u8fdb\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u9898\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
subset_sum_i_naive.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i_naive.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
subset_sum_i_naive.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
subset_sum_i_naive.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
subset_sum_i_naive.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6570\u91cf\u4e3a0\n    backtrack(target, 0, nums, numsSize);\n}\n
subset_sum_i_naive.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
subset_sum_i_naive.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
subset_sum_i_naive.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5411\u4ee5\u4e0a\u4ee3\u7801\u8f93\u5165\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u8f93\u51fa\u7ed3\u679c\u4e3a \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u867d\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u4e3a \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u590d\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

\u8fd9\u662f\u56e0\u4e3a\u641c\u7d22\u8fc7\u7a0b\u662f\u533a\u5206\u9009\u62e9\u987a\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u533a\u5206\u9009\u62e9\u987a\u5e8f\u3002\u5982\u56fe 13-10 \u6240\u793a\uff0c\u5148\u9009 \\(4\\) \u540e\u9009 \\(5\\) \u4e0e\u5148\u9009 \\(5\\) \u540e\u9009 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5bf9\u5e94\u540c\u4e00\u4e2a\u5b50\u96c6\u3002

\u56fe 13-10 \u00a0 \u5b50\u96c6\u641c\u7d22\u4e0e\u8d8a\u754c\u526a\u679d

\u4e3a\u4e86\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u601d\u8def\u662f\u5bf9\u7ed3\u679c\u5217\u8868\u8fdb\u884c\u53bb\u91cd\u3002\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u4e24\u65b9\u9762\u539f\u56e0\u3002

  • \u5f53\u6570\u7ec4\u5143\u7d20\u8f83\u591a\uff0c\u5c24\u5176\u662f\u5f53 target \u8f83\u5927\u65f6\uff0c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u4ea7\u751f\u5927\u91cf\u7684\u91cd\u590d\u5b50\u96c6\u3002
  • \u6bd4\u8f83\u5b50\u96c6\uff08\u6570\u7ec4\uff09\u7684\u5f02\u540c\u975e\u5e38\u8017\u65f6\uff0c\u9700\u8981\u5148\u6392\u5e8f\u6570\u7ec4\uff0c\u518d\u6bd4\u8f83\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5143\u7d20\u7684\u5f02\u540c\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u590d\u5b50\u96c6\u526a\u679d","text":"

\u6211\u4eec\u8003\u8651\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u901a\u8fc7\u526a\u679d\u8fdb\u884c\u53bb\u91cd\u3002\u89c2\u5bdf\u56fe 13-11 \uff0c\u91cd\u590d\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u987a\u5e8f\u9009\u62e9\u6570\u7ec4\u5143\u7d20\u65f6\u4ea7\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u51b5\u3002

  1. \u5f53\u7b2c\u4e00\u8f6e\u548c\u7b2c\u4e8c\u8f6e\u5206\u522b\u9009\u62e9 \\(3\\) \u548c \\(4\\) \u65f6\uff0c\u4f1a\u751f\u6210\u5305\u542b\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8bb0\u4e3a \\([3, 4, \\dots]\\) \u3002
  2. \u4e4b\u540e\uff0c\u5f53\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(4\\) \u65f6\uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \uff0c\u56e0\u4e3a\u8be5\u9009\u62e9\u4ea7\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c42\u7684\u9009\u62e9\u90fd\u662f\u4ece\u5de6\u5230\u53f3\u88ab\u9010\u4e2a\u5c1d\u8bd5\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

  1. \u524d\u4e24\u8f6e\u9009\u62e9 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
  2. \u524d\u4e24\u8f6e\u9009\u62e9 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
  3. \u82e5\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(5\\) \uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u4e3a\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u4e0e\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

\u56fe 13-11 \u00a0 \u4e0d\u540c\u9009\u62e9\u987a\u5e8f\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

\u603b\u7ed3\u6765\u770b\uff0c\u7ed9\u5b9a\u8f93\u5165\u6570\u7ec4 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8bbe\u641c\u7d22\u8fc7\u7a0b\u4e2d\u7684\u9009\u62e9\u5e8f\u5217\u4e3a \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5219\u8be5\u9009\u62e9\u5e8f\u5217\u9700\u8981\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6ee1\u8db3\u8be5\u6761\u4ef6\u7684\u9009\u62e9\u5e8f\u5217\u90fd\u4f1a\u9020\u6210\u91cd\u590d\uff0c\u5e94\u5f53\u526a\u679d\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4e3a\u5b9e\u73b0\u8be5\u526a\u679d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u53d8\u91cf start \uff0c\u7528\u4e8e\u6307\u793a\u904d\u5386\u8d77\u59cb\u70b9\u3002\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i\\) \u5f00\u59cb\u904d\u5386\u3002\u8fd9\u6837\u505a\u5c31\u53ef\u4ee5\u8ba9\u9009\u62e9\u5e8f\u5217\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4ece\u800c\u4fdd\u8bc1\u5b50\u96c6\u552f\u4e00\u3002

\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u5bf9\u4ee3\u7801\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4e24\u9879\u4f18\u5316\u3002

  • \u5728\u5f00\u542f\u641c\u7d22\u524d\uff0c\u5148\u5c06\u6570\u7ec4 nums \u6392\u5e8f\u3002\u5728\u904d\u5386\u6240\u6709\u9009\u62e9\u65f6\uff0c\u5f53\u5b50\u96c6\u548c\u8d85\u8fc7 target \u65f6\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\uff0c\u56e0\u4e3a\u540e\u8fb9\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target \u3002
  • \u7701\u53bb\u5143\u7d20\u548c\u53d8\u91cf total \uff0c\u901a\u8fc7\u5728 target \u4e0a\u6267\u884c\u51cf\u6cd5\u6765\u7edf\u8ba1\u5143\u7d20\u548c\uff0c\u5f53 target \u7b49\u4e8e \\(0\\) \u65f6\u8bb0\u5f55\u89e3\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_i.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_i.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_i.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_i.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                           // \u904d\u5386\u8d77\u59cb\u70b9\n    backtrack(target, nums, numsSize, start);\n}\n
subset_sum_i.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
subset_sum_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-12 \u6240\u793a\u4e3a\u5c06\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u8f93\u5165\u4ee5\u4e0a\u4ee3\u7801\u540e\u7684\u6574\u4f53\u56de\u6eaf\u8fc7\u7a0b\u3002

\u56fe 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u8fc7\u7a0b

"},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u8651\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u53ef\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

\u76f8\u6bd4\u4e8e\u4e0a\u9898\uff0c\u672c\u9898\u7684\u8f93\u5165\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd9\u5f15\u5165\u4e86\u65b0\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u6570\u7ec4 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u5219\u73b0\u6709\u4ee3\u7801\u7684\u8f93\u51fa\u7ed3\u679c\u4e3a \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73b0\u4e86\u91cd\u590d\u5b50\u96c6\u3002

\u9020\u6210\u8fd9\u79cd\u91cd\u590d\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f6e\u4e2d\u88ab\u591a\u6b21\u9009\u62e9\u3002\u5728\u56fe 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f6e\u5171\u6709\u4e09\u4e2a\u9009\u62e9\uff0c\u5176\u4e2d\u4e24\u4e2a\u90fd\u4e3a \\(4\\) \uff0c\u4f1a\u4ea7\u751f\u4e24\u4e2a\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\uff0c\u4ece\u800c\u8f93\u51fa\u91cd\u590d\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f6e\u7684\u4e24\u4e2a \\(4\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002

\u56fe 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

"},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5b9e\u73b0\u65b9\u5f0f\u6bd4\u8f83\u5de7\u5999\uff1a\u7531\u4e8e\u6570\u7ec4\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u90bb\u7684\u3002\u8fd9\u610f\u5473\u7740\u5728\u67d0\u8f6e\u9009\u62e9\u4e2d\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u4e0e\u5176\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u5219\u8bf4\u660e\u5b83\u5df2\u7ecf\u88ab\u9009\u62e9\u8fc7\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u8fc7\u5f53\u524d\u5143\u7d20\u3002

\u4e0e\u6b64\u540c\u65f6\uff0c\u672c\u9898\u89c4\u5b9a\u6bcf\u4e2a\u6570\u7ec4\u5143\u7d20\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5e78\u8fd0\u7684\u662f\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5229\u7528\u53d8\u91cf start \u6765\u6ee1\u8db3\u8be5\u7ea6\u675f\uff1a\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i + 1\\) \u5f00\u59cb\u5411\u540e\u904d\u5386\u3002\u8fd9\u6837\u65e2\u80fd\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u590d\u9009\u62e9\u5143\u7d20\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_ii.cpp
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.java
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.cs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.go
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_ii.swift
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_ii.js
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.ts
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.dart
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_ii.rs
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_ii.c
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u5f00\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
subset_sum_ii.kt
/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
subset_sum_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 13-14 \u5c55\u793a\u4e86\u6570\u7ec4 \\([4, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u8fc7\u7a0b\uff0c\u5171\u5305\u542b\u56db\u79cd\u526a\u679d\u64cd\u4f5c\u3002\u8bf7\u4f60\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u6ce8\u91ca\u76f8\u7ed3\u5408\uff0c\u7406\u89e3\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u79cd\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

\u56fe 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u8fc7\u7a0b

"},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u662f\u7a77\u4e3e\u6cd5\uff0c\u901a\u8fc7\u5bf9\u89e3\u7a7a\u95f4\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6765\u5bfb\u627e\u7b26\u5408\u6761\u4ef6\u7684\u89e3\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u9047\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u5219\u8bb0\u5f55\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u904d\u5386\u5b8c\u6210\u540e\u7ed3\u675f\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u7684\u641c\u7d22\u8fc7\u7a0b\u5305\u62ec\u5c1d\u8bd5\u4e0e\u56de\u9000\u4e24\u4e2a\u90e8\u5206\u3002\u5b83\u901a\u8fc7\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u6765\u5c1d\u8bd5\u5404\u79cd\u9009\u62e9\uff0c\u5f53\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u60c5\u51b5\u65f6\uff0c\u5219\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002\u5c1d\u8bd5\u4e0e\u56de\u9000\u662f\u4e24\u4e2a\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
  • \u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u5b83\u4eec\u53ef\u7528\u4e8e\u5b9e\u73b0\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7ed3\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u7d22\u6548\u7387\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u4e8e\u89e3\u51b3\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u3002\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u867d\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u7b97\u6cd5\u89e3\u51b3\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
  • \u5168\u6392\u5217\u95ee\u9898\u65e8\u5728\u641c\u7d22\u7ed9\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e2a\u5143\u7d20\u662f\u5426\u88ab\u9009\u62e9\uff0c\u526a\u6389\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\u7684\u641c\u7d22\u5206\u652f\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002
  • \u5728\u5168\u6392\u5217\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff0c\u5219\u6700\u7ec8\u7ed3\u679c\u4f1a\u51fa\u73b0\u91cd\u590d\u6392\u5217\u3002\u6211\u4eec\u9700\u8981\u7ea6\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u8fd9\u901a\u5e38\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\u6765\u5b9e\u73b0\u3002
  • \u5b50\u96c6\u548c\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u7ed9\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u4e3a\u76ee\u6807\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u800c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u8f93\u51fa\u6240\u6709\u987a\u5e8f\u7684\u7ed3\u679c\uff0c\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002\u6211\u4eec\u5728\u56de\u6eaf\u524d\u5c06\u6570\u636e\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u8bbe\u7f6e\u4e00\u4e2a\u53d8\u91cf\u6765\u6307\u793a\u6bcf\u4e00\u8f6e\u7684\u904d\u5386\u8d77\u59cb\u70b9\uff0c\u4ece\u800c\u5c06\u751f\u6210\u91cd\u590d\u5b50\u96c6\u7684\u641c\u7d22\u5206\u652f\u8fdb\u884c\u526a\u679d\u3002
  • \u5bf9\u4e8e\u5b50\u96c6\u548c\u95ee\u9898\uff0c\u6570\u7ec4\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u4f1a\u4ea7\u751f\u91cd\u590d\u96c6\u5408\u3002\u6211\u4eec\u5229\u7528\u6570\u7ec4\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\uff0c\u901a\u8fc7\u5224\u65ad\u76f8\u90bb\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5b9e\u73b0\u526a\u679d\uff0c\u4ece\u800c\u786e\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u4e2d\u4e00\u6b21\u3002
  • \\(n\\) \u7687\u540e\u95ee\u9898\u65e8\u5728\u5bfb\u627e\u5c06 \\(n\\) \u4e2a\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76d8\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u4e24\u4e24\u4e4b\u95f4\u65e0\u6cd5\u653b\u51fb\u5bf9\u65b9\u3002\u8be5\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6\u6709\u884c\u7ea6\u675f\u3001\u5217\u7ea6\u675f\u3001\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002\u4e3a\u6ee1\u8db3\u884c\u7ea6\u675f\uff0c\u6211\u4eec\u91c7\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8bc1\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002
  • \u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u5904\u7406\u65b9\u5f0f\u7c7b\u4f3c\u3002\u5bf9\u4e8e\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u4ece\u800c\u6307\u793a\u9009\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5bf9\u4e8e\u5bf9\u89d2\u7ebf\u7ea6\u675f\uff0c\u6211\u4eec\u501f\u52a9\u4e24\u4e2a\u6570\u7ec4\u6765\u5206\u522b\u8bb0\u5f55\u8be5\u4e3b\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96be\u70b9\u5728\u4e8e\u627e\u5904\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5bf9\u89d2\u7ebf\u4e0a\u683c\u5b50\u6ee1\u8db3\u7684\u884c\u5217\u7d22\u5f15\u89c4\u5f8b\u3002
"},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u600e\u4e48\u7406\u89e3\u56de\u6eaf\u548c\u9012\u5f52\u7684\u5173\u7cfb\uff1f

\u603b\u7684\u6765\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u79cd\u201c\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u9012\u5f52\u66f4\u50cf\u662f\u4e00\u4e2a\u201c\u5de5\u5177\u201d\u3002

  • \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u9012\u5f52\u7684\u5e94\u7528\u573a\u666f\u4e4b\u4e00\uff0c\u662f\u9012\u5f52\u5728\u641c\u7d22\u95ee\u9898\u4e2d\u7684\u5e94\u7528\u3002
  • \u9012\u5f52\u7684\u7ed3\u6784\u4f53\u73b0\u4e86\u201c\u5b50\u95ee\u9898\u5206\u89e3\u201d\u7684\u89e3\u9898\u8303\u5f0f\uff0c\u5e38\u7528\u4e8e\u89e3\u51b3\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\uff08\u8bb0\u5fc6\u5316\u9012\u5f52\uff09\u7b49\u95ee\u9898\u3002
"},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

Abstract

\u590d\u6742\u5ea6\u5206\u6790\u72b9\u5982\u6d69\u701a\u7684\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u65f6\u7a7a\u5411\u5bfc\u3002

\u5b83\u5e26\u9886\u6211\u4eec\u5728\u65f6\u95f4\u4e0e\u7a7a\u95f4\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5bfb\u627e\u66f4\u4f18\u96c5\u7684\u89e3\u51b3\u65b9\u6848\u3002

"},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30
  • 2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52
  • 2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6
  • 2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6
  • 2.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52","text":"

\u5728\u7b97\u6cd5\u4e2d\uff0c\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u662f\u5f88\u5e38\u89c1\u7684\uff0c\u5b83\u4e0e\u590d\u6742\u5ea6\u5206\u6790\u606f\u606f\u76f8\u5173\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7ecd\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u6765\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u91cd\u590d\u6267\u884c\u4efb\u52a1\uff0c\u5373\u4e24\u79cd\u57fa\u672c\u7684\u7a0b\u5e8f\u63a7\u5236\u7ed3\u6784\uff1a\u8fed\u4ee3\u3001\u9012\u5f52\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

\u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u79cd\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u7684\u63a7\u5236\u7ed3\u6784\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5e8f\u4f1a\u5728\u6ee1\u8db3\u4e00\u5b9a\u7684\u6761\u4ef6\u4e0b\u91cd\u590d\u6267\u884c\u67d0\u6bb5\u4ee3\u7801\uff0c\u76f4\u5230\u8fd9\u4e2a\u6761\u4ef6\u4e0d\u518d\u6ee1\u8db3\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u5faa\u73af","text":"

for \u5faa\u73af\u662f\u6700\u5e38\u89c1\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9002\u5408\u5728\u9884\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6570\u65f6\u4f7f\u7528\u3002

\u4ee5\u4e0b\u51fd\u6570\u57fa\u4e8e for \u5faa\u73af\u5b9e\u73b0\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7ed3\u679c\u4f7f\u7528\u53d8\u91cf res \u8bb0\u5f55\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5bf9\u5e94\u7684\u533a\u95f4\u662f\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\uff0c\u5bf9\u5e94\u7684\u904d\u5386\u8303\u56f4\u4e3a \\(a, a + 1, \\dots, b-1\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-1 \u662f\u8be5\u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe\u3002

\u56fe 2-1 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe

\u6b64\u6c42\u548c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u6210\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u8fd9\u4e2a\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u76f8\u5173\u5185\u5bb9\u5c06\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u5faa\u73af","text":"

\u4e0e for \u5faa\u73af\u7c7b\u4f3c\uff0cwhile \u5faa\u73af\u4e5f\u662f\u4e00\u79cd\u5b9e\u73b0\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u7a0b\u5e8f\u6bcf\u8f6e\u90fd\u4f1a\u5148\u68c0\u67e5\u6761\u4ef6\uff0c\u5982\u679c\u6761\u4ef6\u4e3a\u771f\uff0c\u5219\u7ee7\u7eed\u6267\u884c\uff0c\u5426\u5219\u5c31\u7ed3\u675f\u5faa\u73af\u3002

\u4e0b\u9762\u6211\u4eec\u7528 while \u5faa\u73af\u6765\u5b9e\u73b0\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
iteration.cpp
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
iteration.zig
// while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

while \u5faa\u73af\u6bd4 for \u5faa\u73af\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u5730\u8bbe\u8ba1\u6761\u4ef6\u53d8\u91cf\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9aa4\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6761\u4ef6\u53d8\u91cf \\(i\\) \u6bcf\u8f6e\u8fdb\u884c\u4e24\u6b21\u66f4\u65b0\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u5faa\u73af\u5b9e\u73b0\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u7684\u6765\u8bf4\uff0cfor \u5faa\u73af\u7684\u4ee3\u7801\u66f4\u52a0\u7d27\u51d1\uff0cwhile \u5faa\u73af\u66f4\u52a0\u7075\u6d3b\uff0c\u4e24\u8005\u90fd\u53ef\u4ee5\u5b9e\u73b0\u8fed\u4ee3\u7ed3\u6784\u3002\u9009\u62e9\u4f7f\u7528\u54ea\u4e00\u4e2a\u5e94\u8be5\u6839\u636e\u7279\u5b9a\u95ee\u9898\u7684\u9700\u6c42\u6765\u51b3\u5b9a\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5d4c\u5957\u5faa\u73af","text":"

\u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\u5185\u5d4c\u5957\u53e6\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\uff0c\u4e0b\u9762\u4ee5 for \u5faa\u73af\u4e3a\u4f8b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-2 \u662f\u8be5\u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe\u3002

\u56fe 2-2 \u00a0 \u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe

\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u548c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u5173\u7cfb\u201d\u3002

\u6211\u4eec\u53ef\u4ee5\u7ee7\u7eed\u6dfb\u52a0\u5d4c\u5957\u5faa\u73af\uff0c\u6bcf\u4e00\u6b21\u5d4c\u5957\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7ef4\u201d\uff0c\u5c06\u4f1a\u4f7f\u65f6\u95f4\u590d\u6742\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u5173\u7cfb\u201d\u201c\u56db\u6b21\u65b9\u5173\u7cfb\u201d\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u9012\u5f52","text":"

\u9012\u5f52\uff08recursion\uff09\u662f\u4e00\u79cd\u7b97\u6cd5\u7b56\u7565\uff0c\u901a\u8fc7\u51fd\u6570\u8c03\u7528\u81ea\u8eab\u6765\u89e3\u51b3\u95ee\u9898\u3002\u5b83\u4e3b\u8981\u5305\u542b\u4e24\u4e2a\u9636\u6bb5\u3002

  1. \u9012\uff1a\u7a0b\u5e8f\u4e0d\u65ad\u6df1\u5165\u5730\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u4f20\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\uff0c\u76f4\u5230\u8fbe\u5230\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u3002
  2. \u5f52\uff1a\u89e6\u53d1\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u540e\uff0c\u7a0b\u5e8f\u4ece\u6700\u6df1\u5c42\u7684\u9012\u5f52\u51fd\u6570\u5f00\u59cb\u9010\u5c42\u8fd4\u56de\uff0c\u6c47\u805a\u6bcf\u4e00\u5c42\u7684\u7ed3\u679c\u3002

\u800c\u4ece\u5b9e\u73b0\u7684\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u4ee3\u7801\u4e3b\u8981\u5305\u542b\u4e09\u4e2a\u8981\u7d20\u3002

  1. \u7ec8\u6b62\u6761\u4ef6\uff1a\u7528\u4e8e\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u7531\u201c\u9012\u201d\u8f6c\u201c\u5f52\u201d\u3002
  2. \u9012\u5f52\u8c03\u7528\uff1a\u5bf9\u5e94\u201c\u9012\u201d\uff0c\u51fd\u6570\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u8f93\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\u3002
  3. \u8fd4\u56de\u7ed3\u679c\uff1a\u5bf9\u5e94\u201c\u5f52\u201d\uff0c\u5c06\u5f53\u524d\u9012\u5f52\u5c42\u7ea7\u7684\u7ed3\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c42\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u53ea\u9700\u8c03\u7528\u51fd\u6570 recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8ba1\u7b97\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
recursion.cpp
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.java
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.cs
/* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.go
/* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.swift
/* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.js
/* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.ts
/* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.dart
/* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
recursion.rs
/* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
recursion.c
/* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
recursion.kt
/* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
recursion.rb
### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
recursion.zig
// \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-3 \u5c55\u793a\u4e86\u8be5\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b\u3002

\u56fe 2-3 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b

\u867d\u7136\u4ece\u8ba1\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u4e0e\u9012\u5f52\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7ed3\u679c\uff0c\u4f46\u5b83\u4eec\u4ee3\u8868\u4e86\u4e24\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u51b3\u95ee\u9898\u7684\u8303\u5f0f\u3002

  • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u4ece\u6700\u57fa\u7840\u7684\u6b65\u9aa4\u5f00\u59cb\uff0c\u7136\u540e\u4e0d\u65ad\u91cd\u590d\u6216\u7d2f\u52a0\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u76f4\u5230\u4efb\u52a1\u5b8c\u6210\u3002
  • \u9012\u5f52\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u8fd9\u4e9b\u5b50\u95ee\u9898\u548c\u539f\u95ee\u9898\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u6765\u5c06\u5b50\u95ee\u9898\u7ee7\u7eed\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u51b5\u65f6\u505c\u6b62\uff08\u57fa\u672c\u60c5\u51b5\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

\u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u6570\u4e3a\u4f8b\uff0c\u8bbe\u95ee\u9898 \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

  • \u8fed\u4ee3\uff1a\u5728\u5faa\u73af\u4e2d\u6a21\u62df\u6c42\u548c\u8fc7\u7a0b\uff0c\u4ece \\(1\\) \u904d\u5386\u5230 \\(n\\) \uff0c\u6bcf\u8f6e\u6267\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
  • \u9012\u5f52\uff1a\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u5b50\u95ee\u9898 \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65ad\uff08\u9012\u5f52\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u51b5 \\(f(1) = 1\\) \u65f6\u7ec8\u6b62\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u8c03\u7528\u6808","text":"

\u9012\u5f52\u51fd\u6570\u6bcf\u6b21\u8c03\u7528\u81ea\u8eab\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u4e3a\u65b0\u5f00\u542f\u7684\u51fd\u6570\u5206\u914d\u5185\u5b58\uff0c\u4ee5\u5b58\u50a8\u5c40\u90e8\u53d8\u91cf\u3001\u8c03\u7528\u5730\u5740\u548c\u5176\u4ed6\u4fe1\u606f\u7b49\u3002\u8fd9\u5c06\u5bfc\u81f4\u4e24\u65b9\u9762\u7684\u7ed3\u679c\u3002

  • \u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u90fd\u5b58\u50a8\u5728\u79f0\u4e3a\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u7684\u5185\u5b58\u533a\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u6570\u8fd4\u56de\u540e\u624d\u4f1a\u88ab\u91ca\u653e\u3002\u56e0\u6b64\uff0c\u9012\u5f52\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
  • \u9012\u5f52\u8c03\u7528\u51fd\u6570\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5f00\u9500\u3002\u56e0\u6b64\u9012\u5f52\u901a\u5e38\u6bd4\u5faa\u73af\u7684\u65f6\u95f4\u6548\u7387\u66f4\u4f4e\u3002

\u5982\u56fe 2-4 \u6240\u793a\uff0c\u5728\u89e6\u53d1\u7ec8\u6b62\u6761\u4ef6\u524d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684\u9012\u5f52\u51fd\u6570\uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002

\u56fe 2-4 \u00a0 \u9012\u5f52\u8c03\u7528\u6df1\u5ea6

\u5728\u5b9e\u9645\u4e2d\uff0c\u7f16\u7a0b\u8bed\u8a00\u5141\u8bb8\u7684\u9012\u5f52\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u8fc7\u6df1\u7684\u9012\u5f52\u53ef\u80fd\u5bfc\u81f4\u6808\u6ea2\u51fa\u9519\u8bef\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u9012\u5f52","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u6570\u5728\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u6b65\u624d\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5219\u8be5\u51fd\u6570\u53ef\u4ee5\u88ab\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u4f18\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u4e0e\u8fed\u4ee3\u76f8\u5f53\u3002\u8fd9\u79cd\u60c5\u51b5\u88ab\u79f0\u4e3a\u5c3e\u9012\u5f52\uff08tail recursion\uff09\u3002

  • \u666e\u901a\u9012\u5f52\uff1a\u5f53\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u7684\u51fd\u6570\u540e\uff0c\u9700\u8981\u7ee7\u7eed\u6267\u884c\u4ee3\u7801\uff0c\u56e0\u6b64\u7cfb\u7edf\u9700\u8981\u4fdd\u5b58\u4e0a\u4e00\u5c42\u8c03\u7528\u7684\u4e0a\u4e0b\u6587\u3002
  • \u5c3e\u9012\u5f52\uff1a\u9012\u5f52\u8c03\u7528\u662f\u51fd\u6570\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u4e2a\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u540e\uff0c\u65e0\u987b\u7ee7\u7eed\u6267\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7edf\u65e0\u987b\u4fdd\u5b58\u4e0a\u4e00\u5c42\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u3002

\u4ee5\u8ba1\u7b97 \\(1 + 2 + \\dots + n\\) \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u7ed3\u679c\u53d8\u91cf res \u8bbe\u4e3a\u51fd\u6570\u53c2\u6570\uff0c\u4ece\u800c\u5b9e\u73b0\u5c3e\u9012\u5f52\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5c3e\u9012\u5f52\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u56fe 2-5 \u6240\u793a\u3002\u5bf9\u6bd4\u666e\u901a\u9012\u5f52\u548c\u5c3e\u9012\u5f52\uff0c\u4e24\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u6267\u884c\u70b9\u662f\u4e0d\u540c\u7684\u3002

  • \u666e\u901a\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u6bcf\u5c42\u8fd4\u56de\u540e\u90fd\u8981\u518d\u6267\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
  • \u5c3e\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u53ea\u9700\u5c42\u5c42\u8fd4\u56de\u3002

\u56fe 2-5 \u00a0 \u5c3e\u9012\u5f52\u8fc7\u7a0b

Tip

\u8bf7\u6ce8\u610f\uff0c\u8bb8\u591a\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u5e76\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\u3002\u4f8b\u5982\uff0cPython \u9ed8\u8ba4\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u6570\u662f\u5c3e\u9012\u5f52\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u4f1a\u9047\u5230\u6808\u6ea2\u51fa\u95ee\u9898\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u9012\u5f52\u6811","text":"

\u5f53\u5904\u7406\u4e0e\u201c\u5206\u6cbb\u201d\u76f8\u5173\u7684\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u9012\u5f52\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c2\u3001\u4ee3\u7801\u66f4\u52a0\u6613\u8bfb\u3002\u4ee5\u201c\u6590\u6ce2\u90a3\u5951\u6570\u5217\u201d\u4e3a\u4f8b\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6590\u6ce2\u90a3\u5951\u6570\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8be5\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u3002

\u8bbe\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u4e3a \\(f(n)\\) \uff0c\u6613\u5f97\u4e24\u4e2a\u7ed3\u8bba\u3002

  • \u6570\u5217\u7684\u524d\u4e24\u4e2a\u6570\u5b57\u4e3a \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
  • \u6570\u5217\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57\u662f\u524d\u4e24\u4e2a\u6570\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

\u6309\u7167\u9012\u63a8\u5173\u7cfb\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5c06\u524d\u4e24\u4e2a\u6570\u5b57\u4f5c\u4e3a\u7ec8\u6b62\u6761\u4ef6\uff0c\u4fbf\u53ef\u5199\u51fa\u9012\u5f52\u4ee3\u7801\u3002\u8c03\u7528 fib(n) \u5373\u53ef\u5f97\u5230\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
recursion.cpp
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.js
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
recursion.c
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
recursion.rb
### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
recursion.zig
// \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u6211\u4eec\u5728\u51fd\u6570\u5185\u9012\u5f52\u8c03\u7528\u4e86\u4e24\u4e2a\u51fd\u6570\uff0c\u8fd9\u610f\u5473\u7740\u4ece\u4e00\u4e2a\u8c03\u7528\u4ea7\u751f\u4e86\u4e24\u4e2a\u8c03\u7528\u5206\u652f\u3002\u5982\u56fe 2-6 \u6240\u793a\uff0c\u8fd9\u6837\u4e0d\u65ad\u9012\u5f52\u8c03\u7528\u4e0b\u53bb\uff0c\u6700\u7ec8\u5c06\u4ea7\u751f\u4e00\u68f5\u5c42\u6570\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff08recursion tree\uff09\u3002

\u56fe 2-6 \u00a0 \u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u9012\u5f52\u6811

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9012\u5f52\u4f53\u73b0\u4e86\u201c\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u5b50\u95ee\u9898\u201d\u7684\u601d\u7ef4\u8303\u5f0f\uff0c\u8fd9\u79cd\u5206\u6cbb\u7b56\u7565\u81f3\u5173\u91cd\u8981\u3002

  • \u4ece\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u7d22\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u7b49\u8bb8\u591a\u91cd\u8981\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5e94\u7528\u4e86\u8fd9\u79cd\u601d\u7ef4\u65b9\u5f0f\u3002
  • \u4ece\u6570\u636e\u7ed3\u6784\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u5929\u7136\u9002\u5408\u5904\u7406\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u76f8\u5173\u95ee\u9898\uff0c\u56e0\u4e3a\u5b83\u4eec\u975e\u5e38\u9002\u5408\u7528\u5206\u6cbb\u601d\u60f3\u8fdb\u884c\u5206\u6790\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u4e24\u8005\u5bf9\u6bd4","text":"

\u603b\u7ed3\u4ee5\u4e0a\u5185\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5b9e\u73b0\u3001\u6027\u80fd\u548c\u9002\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

\u8868 2-1 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52\u7279\u70b9\u5bf9\u6bd4

\u8fed\u4ee3 \u9012\u5f52 \u5b9e\u73b0\u65b9\u5f0f \u5faa\u73af\u7ed3\u6784 \u51fd\u6570\u8c03\u7528\u81ea\u8eab \u65f6\u95f4\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f83\u9ad8\uff0c\u65e0\u51fd\u6570\u8c03\u7528\u5f00\u9500 \u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u90fd\u4f1a\u4ea7\u751f\u5f00\u9500 \u5185\u5b58\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u5185\u5b58\u7a7a\u95f4 \u7d2f\u79ef\u51fd\u6570\u8c03\u7528\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u6808\u5e27\u7a7a\u95f4 \u9002\u7528\u95ee\u9898 \u9002\u7528\u4e8e\u7b80\u5355\u5faa\u73af\u4efb\u52a1\uff0c\u4ee3\u7801\u76f4\u89c2\u3001\u53ef\u8bfb\u6027\u597d \u9002\u7528\u4e8e\u5b50\u95ee\u9898\u5206\u89e3\uff0c\u5982\u6811\u3001\u56fe\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u4ee3\u7801\u7ed3\u6784\u7b80\u6d01\u3001\u6e05\u6670

Tip

\u5982\u679c\u611f\u89c9\u4ee5\u4e0b\u5185\u5bb9\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5728\u8bfb\u5b8c\u201c\u6808\u201d\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\u3002

\u90a3\u4e48\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5177\u6709\u4ec0\u4e48\u5185\u5728\u8054\u7cfb\u5462\uff1f\u4ee5\u4e0a\u8ff0\u9012\u5f52\u51fd\u6570\u4e3a\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u9012\u5f52\u7684\u201c\u5f52\u201d\u9636\u6bb5\u8fdb\u884c\u3002\u8fd9\u610f\u5473\u7740\u6700\u521d\u88ab\u8c03\u7528\u7684\u51fd\u6570\u5b9e\u9645\u4e0a\u662f\u6700\u540e\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u8fd9\u79cd\u5de5\u4f5c\u673a\u5236\u4e0e\u6808\u7684\u201c\u5148\u5165\u540e\u51fa\u201d\u539f\u5219\u5f02\u66f2\u540c\u5de5\u3002

\u4e8b\u5b9e\u4e0a\uff0c\u201c\u8c03\u7528\u6808\u201d\u548c\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u8fd9\u7c7b\u9012\u5f52\u672f\u8bed\u5df2\u7ecf\u6697\u793a\u4e86\u9012\u5f52\u4e0e\u6808\u4e4b\u95f4\u7684\u5bc6\u5207\u5173\u7cfb\u3002

  1. \u9012\uff1a\u5f53\u51fd\u6570\u88ab\u8c03\u7528\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5728\u201c\u8c03\u7528\u6808\u201d\u4e0a\u4e3a\u8be5\u51fd\u6570\u5206\u914d\u65b0\u7684\u6808\u5e27\uff0c\u7528\u4e8e\u5b58\u50a8\u51fd\u6570\u7684\u5c40\u90e8\u53d8\u91cf\u3001\u53c2\u6570\u3001\u8fd4\u56de\u5730\u5740\u7b49\u6570\u636e\u3002
  2. \u5f52\uff1a\u5f53\u51fd\u6570\u5b8c\u6210\u6267\u884c\u5e76\u8fd4\u56de\u65f6\uff0c\u5bf9\u5e94\u7684\u6808\u5e27\u4f1a\u88ab\u4ece\u201c\u8c03\u7528\u6808\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u590d\u4e4b\u524d\u51fd\u6570\u7684\u6267\u884c\u73af\u5883\u3002

\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u8c03\u7528\u6808\u7684\u884c\u4e3a\uff0c\u4ece\u800c\u5c06\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u5f62\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u5f53\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u540e\uff0c\u4ee3\u7801\u53d8\u5f97\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5c3d\u7ba1\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5f88\u591a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f6c\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u8fd9\u6837\u505a\uff0c\u6709\u4ee5\u4e0b\u4e24\u70b9\u539f\u56e0\u3002

  • \u8f6c\u5316\u540e\u7684\u4ee3\u7801\u53ef\u80fd\u66f4\u52a0\u96be\u4ee5\u7406\u89e3\uff0c\u53ef\u8bfb\u6027\u66f4\u5dee\u3002
  • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\u7684\u884c\u4e3a\u53ef\u80fd\u975e\u5e38\u56f0\u96be\u3002

\u603b\u4e4b\uff0c\u9009\u62e9\u8fed\u4ee3\u8fd8\u662f\u9012\u5f52\u53d6\u51b3\u4e8e\u7279\u5b9a\u95ee\u9898\u7684\u6027\u8d28\u3002\u5728\u7f16\u7a0b\u5b9e\u8df5\u4e2d\uff0c\u6743\u8861\u4e24\u8005\u7684\u4f18\u52a3\u5e76\u6839\u636e\u60c5\u5883\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u81f3\u5173\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":"

\u5728\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\u3002

  1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\uff1a\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
  2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\uff1a\u540c\u4e00\u4e2a\u95ee\u9898\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u89e3\u6cd5\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u5c3d\u53ef\u80fd\u9ad8\u6548\u7684\u7b97\u6cd5\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u4e3a\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u4e24\u4e2a\u7ef4\u5ea6\u3002

  • \u65f6\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u7684\u5927\u5c0f\u3002

\u7b80\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u8bbe\u8ba1\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u8fd9\u6837\uff0c\u6211\u4eec\u624d\u80fd\u5c06\u5404\u79cd\u7b97\u6cd5\u8fdb\u884c\u5bf9\u6bd4\uff0c\u8fdb\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

\u6548\u7387\u8bc4\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u4e3a\u4e24\u79cd\uff1a\u5b9e\u9645\u6d4b\u8bd5\u3001\u7406\u8bba\u4f30\u7b97\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5b9e\u9645\u6d4b\u8bd5","text":"

\u5047\u8bbe\u6211\u4eec\u73b0\u5728\u6709\u7b97\u6cd5 A \u548c\u7b97\u6cd5 B \uff0c\u5b83\u4eec\u90fd\u80fd\u89e3\u51b3\u540c\u4e00\u95ee\u9898\uff0c\u73b0\u5728\u9700\u8981\u5bf9\u6bd4\u8fd9\u4e24\u4e2a\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u53f0\u8ba1\u7b97\u673a\uff0c\u8fd0\u884c\u8fd9\u4e24\u4e2a\u7b97\u6cd5\uff0c\u5e76\u76d1\u63a7\u8bb0\u5f55\u5b83\u4eec\u7684\u8fd0\u884c\u65f6\u95f4\u548c\u5185\u5b58\u5360\u7528\u60c5\u51b5\u3002\u8fd9\u79cd\u8bc4\u4f30\u65b9\u5f0f\u80fd\u591f\u53cd\u6620\u771f\u5b9e\u60c5\u51b5\uff0c\u4f46\u4e5f\u5b58\u5728\u8f83\u5927\u7684\u5c40\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u96be\u4ee5\u6392\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5e72\u6270\u56e0\u7d20\u3002\u786c\u4ef6\u914d\u7f6e\u4f1a\u5f71\u54cd\u7b97\u6cd5\u7684\u6027\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u53f0\u8ba1\u7b97\u673a\u4e2d\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u53f0\u914d\u7f6e\u4e0d\u540c\u7684\u8ba1\u7b97\u673a\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6d4b\u8bd5\u7ed3\u679c\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u9700\u8981\u5728\u5404\u79cd\u673a\u5668\u4e0a\u8fdb\u884c\u6d4b\u8bd5\uff0c\u7edf\u8ba1\u5e73\u5747\u6548\u7387\uff0c\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u5f00\u5b8c\u6574\u6d4b\u8bd5\u975e\u5e38\u8017\u8d39\u8d44\u6e90\u3002\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u7684\u53d8\u5316\uff0c\u7b97\u6cd5\u4f1a\u8868\u73b0\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u5f97\u5230\u6709\u8bf4\u670d\u529b\u7684\u7ed3\u8bba\uff0c\u6211\u4eec\u9700\u8981\u6d4b\u8bd5\u5404\u79cd\u89c4\u6a21\u7684\u8f93\u5165\u6570\u636e\uff0c\u800c\u8fd9\u9700\u8981\u8017\u8d39\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8bba\u4f30\u7b97","text":"

\u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4ec5\u901a\u8fc7\u4e00\u4e9b\u8ba1\u7b97\u6765\u8bc4\u4f30\u7b97\u6cd5\u7684\u6548\u7387\u3002\u8fd9\u79cd\u4f30\u7b97\u65b9\u6cd5\u88ab\u79f0\u4e3a\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7b80\u79f0\u590d\u6742\u5ea6\u5206\u6790\u3002

\u590d\u6742\u5ea6\u5206\u6790\u80fd\u591f\u4f53\u73b0\u7b97\u6cd5\u8fd0\u884c\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e4b\u95f4\u7684\u5173\u7cfb\u3002\u5b83\u63cf\u8ff0\u4e86\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u7b97\u6cd5\u6267\u884c\u6240\u9700\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u5b9a\u4e49\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u5206\u4e3a\u4e09\u4e2a\u91cd\u70b9\u6765\u7406\u89e3\u3002

  • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u201d\u5206\u522b\u5bf9\u5e94\u65f6\u95f4\u590d\u6742\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u3002
  • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u7740\u590d\u6742\u5ea6\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u4f53\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\u3002
  • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u4e0d\u662f\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\u7684\u5177\u4f53\u503c\uff0c\u800c\u662f\u65f6\u95f4\u6216\u7a7a\u95f4\u589e\u957f\u7684\u201c\u5feb\u6162\u201d\u3002

\u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u4f53\u73b0\u5728\u4ee5\u4e0b\u4e24\u4e2a\u65b9\u9762\u3002

  • \u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002
  • \u5b83\u53ef\u4ee5\u4f53\u73b0\u4e0d\u540c\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6027\u80fd\u3002

Tip

\u5982\u679c\u4f60\u4ecd\u5bf9\u590d\u6742\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u987b\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

\u590d\u6742\u5ea6\u5206\u6790\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u628a\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6807\u5c3a\u201d\uff0c\u4f7f\u6211\u4eec\u53ef\u4ee5\u8861\u91cf\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5bf9\u6bd4\u4e0d\u540c\u7b97\u6cd5\u4e4b\u95f4\u7684\u6548\u7387\u3002

\u590d\u6742\u5ea6\u662f\u4e2a\u6570\u5b66\u6982\u5ff5\uff0c\u5bf9\u4e8e\u521d\u5b66\u8005\u53ef\u80fd\u6bd4\u8f83\u62bd\u8c61\uff0c\u5b66\u4e60\u96be\u5ea6\u76f8\u5bf9\u8f83\u9ad8\u3002\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u770b\uff0c\u590d\u6742\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9002\u5408\u4f5c\u4e3a\u6700\u5148\u4ecb\u7ecd\u7684\u5185\u5bb9\u3002\u7136\u800c\uff0c\u5f53\u6211\u4eec\u8ba8\u8bba\u67d0\u4e2a\u6570\u636e\u7ed3\u6784\u6216\u7b97\u6cd5\u7684\u7279\u70b9\u65f6\uff0c\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002

\u7efc\u4e0a\u6240\u8ff0\uff0c\u5efa\u8bae\u4f60\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u4ee5\u4fbf\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u7b97\u6cd5\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u6982\u5ff5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u5e38\u7c7b\u4f3c\uff0c\u53ea\u9700\u5c06\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u66ff\u6362\u4e3a\u201c\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u201d\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

  • \u8f93\u5165\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\u3002
  • \u6682\u5b58\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\u3002
  • \u8f93\u51fa\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\u3002

\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u7edf\u8ba1\u8303\u56f4\u662f\u201c\u6682\u5b58\u7a7a\u95f4\u201d\u52a0\u4e0a\u201c\u8f93\u51fa\u7a7a\u95f4\u201d\u3002

\u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

  • \u6682\u5b58\u6570\u636e\uff1a\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
  • \u6808\u5e27\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u8c03\u7528\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u3002\u7cfb\u7edf\u5728\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\u90fd\u4f1a\u5728\u6808\u9876\u90e8\u521b\u5efa\u4e00\u4e2a\u6808\u5e27\uff0c\u51fd\u6570\u8fd4\u56de\u540e\uff0c\u6808\u5e27\u7a7a\u95f4\u4f1a\u88ab\u91ca\u653e\u3002
  • \u6307\u4ee4\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u7f16\u8bd1\u540e\u7684\u7a0b\u5e8f\u6307\u4ee4\uff0c\u5728\u5b9e\u9645\u7edf\u8ba1\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8ba1\u3002

\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u7edf\u8ba1\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u8f93\u51fa\u6570\u636e\u4e09\u90e8\u5206\uff0c\u5982\u56fe 2-15 \u6240\u793a\u3002

\u56fe 2-15 \u00a0 \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class Node:\n    \"\"\"\u7c7b\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u8282\u70b9\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\n    A = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function()        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return A + b + c      # \u8f93\u51fa\u6570\u636e\n
/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    final int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new(0);       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = Function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7ed3\u6784\u4f53 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\n    const a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    newNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u6570 */\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\n    let a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\n    const a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\n    const a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f93\u5165\u6570\u636e\n  const int a = 0;      // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n  int b = 0;            // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n  Node node = Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n  int c = function();   // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n  return a + b + c;     // \u8f93\u51fa\u6570\u636e\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u521b\u5efa Node \u7ed3\u6784\u4f53 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u6570 */\nfn function() -> i32 {      \n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f93\u5165\u6570\u636e\n    const a: i32 = 0;               // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let mut b = 0;                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node::new(0);        // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function();             // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;               // \u8f93\u51fa\u6570\u636e\n}\n
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\n    const int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    int c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
/* \u7c7b */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f93\u5165\u6570\u636e\n    val a = 0                // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    val node = Node(0)       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    val c = function()       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c         // \u8f93\u51fa\u6570\u636e\n}\n
### \u7c7b ###\nclass Node\n    attr_accessor :val      # \u8282\u70b9\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u6570 ###\ndef function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f93\u5165\u6570\u636e\n    a = 0               # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b = 0               # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node.new(0)  # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    a + b + c           # \u8f93\u51fa\u6570\u636e\nend\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002

\u800c\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u3002\u8fd9\u662f\u56e0\u4e3a\u5185\u5b58\u7a7a\u95f4\u662f\u4e00\u9879\u786c\u6027\u8981\u6c42\uff0c\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u5728\u6240\u6709\u8f93\u5165\u6570\u636e\u4e0b\u90fd\u6709\u8db3\u591f\u7684\u5185\u5b58\u7a7a\u95f4\u9884\u7559\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\u3002

  1. \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\uff1a\u5f53 \\(n < 10\\) \u65f6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u4f46\u5f53 \\(n > 10\\) \u65f6\uff0c\u521d\u59cb\u5316\u7684\u6570\u7ec4 nums \u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
  2. \u4ee5\u7b97\u6cd5\u8fd0\u884c\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\uff1a\u4f8b\u5982\uff0c\u7a0b\u5e8f\u5728\u6267\u884c\u6700\u540e\u4e00\u884c\u4e4b\u524d\uff0c\u5360\u7528 \\(O(1)\\) \u7a7a\u95f4\uff1b\u5f53\u521d\u59cb\u5316\u6570\u7ec4 nums \u65f6\uff0c\u7a0b\u5e8f\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
\n

\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def function() -> int:\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
fun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
def function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
\n

\u51fd\u6570 loop() \u548c recur() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u4f46\u7a7a\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u3002

  • \u51fd\u6570 loop() \u5728\u5faa\u73af\u4e2d\u8c03\u7528\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f6e\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u5e76\u91ca\u653e\u4e86\u6808\u5e27\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002
  • \u9012\u5f52\u51fd\u6570 recur() \u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 recur() \uff0c\u4ece\u800c\u5360\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002
"},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u56fe 2-16 \u5c55\u793a\u4e86\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} \\end{aligned} \\]

\u56fe 2-16 \u00a0 \u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

"},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

\u5e38\u6570\u9636\u5e38\u89c1\u4e8e\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u7684\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u5faa\u73af\u4e2d\u521d\u59cb\u5316\u53d8\u91cf\u6216\u8c03\u7528\u51fd\u6570\u800c\u5360\u7528\u7684\u5185\u5b58\uff0c\u5728\u8fdb\u5165\u4e0b\u4e00\u5faa\u73af\u540e\u5c31\u4f1a\u88ab\u91ca\u653e\uff0c\u56e0\u6b64\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u5e38\u89c1\u4e8e\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u6b63\u6bd4\u7684\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u7b49\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5373\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-17 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u5e38\u89c1\u4e8e\u77e9\u9635\u548c\u56fe\uff0c\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u5e73\u65b9\u5173\u7cfb\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 2-18 \u6240\u793a\uff0c\u8be5\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5728\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(n / 2\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-18 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u89c2\u5bdf\u56fe 2-19 \uff0c\u5c42\u6570\u4e3a \\(n\\) \u7684\u201c\u6ee1\u4e8c\u53c9\u6811\u201d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-19 \u00a0 \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u3002\u4f8b\u5982\u5f52\u5e76\u6392\u5e8f\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6808\u5e27\u7a7a\u95f4\u3002

\u518d\u4f8b\u5982\u5c06\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\uff0c\u8f93\u5165\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6743\u8861\u65f6\u95f4\u4e0e\u7a7a\u95f4","text":"

\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u80fd\u8fbe\u5230\u6700\u4f18\u3002\u7136\u800c\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u540c\u65f6\u4f18\u5316\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96be\u3002

\u964d\u4f4e\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a\u4ee3\u4ef7\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u4eec\u5c06\u727a\u7272\u5185\u5b58\u7a7a\u95f4\u6765\u63d0\u5347\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u601d\u8def\u79f0\u4e3a\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff1b\u53cd\u4e4b\uff0c\u5219\u79f0\u4e3a\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002

\u9009\u62e9\u54ea\u79cd\u601d\u8def\u53d6\u51b3\u4e8e\u6211\u4eec\u66f4\u770b\u91cd\u54ea\u4e2a\u65b9\u9762\u3002\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u65f6\u95f4\u6bd4\u7a7a\u95f4\u66f4\u5b9d\u8d35\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u5f53\u7136\uff0c\u5728\u6570\u636e\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u63a7\u5236\u7a7a\u95f4\u590d\u6742\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"

\u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

  • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e24\u4e2a\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\u3002
  • \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u6d4b\u8bd5\u6765\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96be\u4ee5\u6d88\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5f71\u54cd\uff0c\u4e14\u4f1a\u8017\u8d39\u5927\u91cf\u8ba1\u7b97\u8d44\u6e90\u3002
  • \u590d\u6742\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5b9e\u9645\u6d4b\u8bd5\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\uff0c\u5e76\u4e14\u80fd\u591f\u63ed\u793a\u7b97\u6cd5\u5728\u4e0d\u540c\u6570\u636e\u89c4\u6a21\u4e0b\u7684\u6548\u7387\u3002

\u65f6\u95f4\u590d\u6742\u5ea6

  • \u65f6\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\uff0c\u53ef\u4ee5\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f93\u5165\u7684\u6570\u636e\u91cf\u8f83\u5c0f\u6216\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\u65f6\uff0c\u65e0\u6cd5\u7cbe\u786e\u5bf9\u6bd4\u7b97\u6cd5\u6548\u7387\u7684\u4f18\u52a3\u3002
  • \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u53f7\u8868\u793a\uff0c\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
  • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
  • \u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u51e0\u4e4e\u4e0d\u7528\uff0c\u56e0\u4e3a\u8f93\u5165\u6570\u636e\u4e00\u822c\u9700\u8981\u6ee1\u8db3\u4e25\u683c\u6761\u4ef6\u624d\u80fd\u8fbe\u5230\u6700\u4f73\u60c5\u51b5\u3002
  • \u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53cd\u6620\u7b97\u6cd5\u5728\u968f\u673a\u6570\u636e\u8f93\u5165\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u7b97\u6cd5\u6027\u80fd\u3002\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u9700\u8981\u7edf\u8ba1\u8f93\u5165\u6570\u636e\u5206\u5e03\u4ee5\u53ca\u7efc\u5408\u540e\u7684\u6570\u5b66\u671f\u671b\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6

  • \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\u3002
  • \u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u76f8\u5173\u5185\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u8f93\u5165\u7a7a\u95f4\u3001\u6682\u5b58\u7a7a\u95f4\u3001\u8f93\u51fa\u7a7a\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u8f93\u5165\u7a7a\u95f4\u4e0d\u7eb3\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u6307\u4ee4\u7a7a\u95f4\uff0c\u5176\u4e2d\u6808\u5e27\u7a7a\u95f4\u901a\u5e38\u4ec5\u5728\u9012\u5f52\u51fd\u6570\u4e2d\u5f71\u54cd\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5373\u7edf\u8ba1\u7b97\u6cd5\u5728\u6700\u5dee\u8f93\u5165\u6570\u636e\u548c\u6700\u5dee\u8fd0\u884c\u65f6\u523b\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

\u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u901a\u5e38\u8ba4\u4e3a\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

Q\uff1a\u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

\u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u88ab\u72ec\u7acb\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002\u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

\u4e0b\u9762\u4ee5\u51e0\u79cd\u5e38\u89c1\u7684\u7f16\u7a0b\u8bed\u8a00\u4e3a\u4f8b\u6765\u8bf4\u660e\u3002

  • C \u8bed\u8a00\u662f\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u6ca1\u6709\u9762\u5411\u5bf9\u8c61\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u6570\u3002\u4f46\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u521b\u5efa\u7ed3\u6784\u4f53\uff08struct\uff09\u6765\u6a21\u62df\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff0c\u4e0e\u7ed3\u6784\u4f53\u76f8\u5173\u8054\u7684\u51fd\u6570\u5c31\u76f8\u5f53\u4e8e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
  • Java \u548c C# \u662f\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u4ee3\u7801\u5757\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u4e3a\u67d0\u4e2a\u7c7b\u7684\u4e00\u90e8\u5206\u3002\u9759\u6001\u65b9\u6cd5\u7684\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u51fd\u6570\uff0c\u56e0\u4e3a\u5b83\u88ab\u7ed1\u5b9a\u5728\u7c7b\u4e0a\uff0c\u4e0d\u80fd\u8bbf\u95ee\u7279\u5b9a\u7684\u5b9e\u4f8b\u53d8\u91cf\u3002
  • C++ \u548c Python \u65e2\u652f\u6301\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\uff08\u51fd\u6570\uff09\uff0c\u4e5f\u652f\u6301\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff08\u65b9\u6cd5\uff09\u3002

Q\uff1a\u56fe\u89e3\u201c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

\u4e0d\u662f\uff0c\u8be5\u56fe\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002

\u5047\u8bbe\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u6bcf\u6761\u66f2\u7ebf\u7684\u503c\u4e0e\u51fd\u6570\u5bf9\u5e94\u4e0d\u4e0a\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6761\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u4e8e\u5c06\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002

\u5728\u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\u3002\u4f46\u5bf9\u4e8e \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u65f6\u589e\u957f\u8d8b\u52bf\u5df2\u7ecf\u5360\u4e3b\u5bfc\u4e86\u3002

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u4eec\u60f3\u51c6\u786e\u9884\u4f30\u4e00\u6bb5\u4ee3\u7801\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u5e94\u8be5\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

  1. \u786e\u5b9a\u8fd0\u884c\u5e73\u53f0\uff0c\u5305\u62ec\u786c\u4ef6\u914d\u7f6e\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u7cfb\u7edf\u73af\u5883\u7b49\uff0c\u8fd9\u4e9b\u56e0\u7d20\u90fd\u4f1a\u5f71\u54cd\u4ee3\u7801\u7684\u8fd0\u884c\u6548\u7387\u3002
  2. \u8bc4\u4f30\u5404\u79cd\u8ba1\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u6253\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
  3. \u7edf\u8ba1\u4ee3\u7801\u4e2d\u6240\u6709\u7684\u8ba1\u7b97\u64cd\u4f5c\uff0c\u5e76\u5c06\u6240\u6709\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u6c42\u548c\uff0c\u4ece\u800c\u5f97\u5230\u8fd0\u884c\u65f6\u95f4\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u5faa\u73af n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n    print(0); // 5 ns\n  }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
# \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
// \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

\u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u4e3a \\((6n + 12)\\) ns \uff1a

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

\u4f46\u5b9e\u9645\u4e0a\uff0c\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73b0\u5b9e\u3002\u9996\u5148\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u5c06\u9884\u4f30\u65f6\u95f4\u548c\u8fd0\u884c\u5e73\u53f0\u7ed1\u5b9a\uff0c\u56e0\u4e3a\u7b97\u6cd5\u9700\u8981\u5728\u5404\u79cd\u4e0d\u540c\u7684\u5e73\u53f0\u4e0a\u8fd0\u884c\u3002\u5176\u6b21\uff0c\u6211\u4eec\u5f88\u96be\u83b7\u77e5\u6bcf\u79cd\u64cd\u4f5c\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u8fd9\u7ed9\u9884\u4f30\u8fc7\u7a0b\u5e26\u6765\u4e86\u6781\u5927\u7684\u96be\u5ea6\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u7edf\u8ba1\u7684\u4e0d\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u800c\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002

\u201c\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u201d\u8fd9\u4e2a\u6982\u5ff5\u6bd4\u8f83\u62bd\u8c61\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7ed9\u5b9a\u4e09\u4e2a\u7b97\u6cd5 A\u3001B \u548c C \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int):\n    print(0)\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
# \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
// \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

\u56fe 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u4e2a\u7b97\u6cd5\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

  • \u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u4e2a\u6253\u5370\u64cd\u4f5c\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e0d\u968f\u7740 \\(n\\) \u589e\u5927\u800c\u589e\u957f\u3002\u6211\u4eec\u79f0\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002
  • \u7b97\u6cd5 B \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(n\\) \u6b21\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740 \\(n\\) \u589e\u5927\u5448\u7ebf\u6027\u589e\u957f\u3002\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u9636\u201d\u3002
  • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u867d\u7136\u8fd0\u884c\u65f6\u95f4\u5f88\u957f\uff0c\u4f46\u5b83\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u3002\u56e0\u6b64 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002

\u56fe 2-7 \u00a0 \u7b97\u6cd5 A\u3001B \u548c C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

\u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u70b9\u5462\uff1f

  • \u65f6\u95f4\u590d\u6742\u5ea6\u80fd\u591f\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u7b97\u6cd5 B \u7684\u8fd0\u884c\u65f6\u95f4\u5448\u7ebf\u6027\u589e\u957f\uff0c\u5728 \\(n > 1\\) \u65f6\u6bd4\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u201c\u7ebf\u6027\u9636\u201d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u7684\u542b\u4e49\u3002
  • \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7b80\u4fbf\u3002\u663e\u7136\uff0c\u8fd0\u884c\u5e73\u53f0\u548c\u8ba1\u7b97\u64cd\u4f5c\u7c7b\u578b\u90fd\u4e0e\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u65e0\u5173\u3002\u56e0\u6b64\u5728\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u5c06\u6240\u6709\u8ba1\u7b97\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u89c6\u4e3a\u76f8\u540c\u7684\u201c\u5355\u4f4d\u65f6\u95f4\u201d\uff0c\u4ece\u800c\u5c06\u201c\u8ba1\u7b97\u64cd\u4f5c\u8fd0\u884c\u65f6\u95f4\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u4e00\u6765\u4f30\u7b97\u96be\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u5c40\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5c3d\u7ba1\u7b97\u6cd5 A \u548c C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\uff0c\u4f46\u5b9e\u9645\u8fd0\u884c\u65f6\u95f4\u5dee\u522b\u5f88\u5927\u3002\u540c\u6837\uff0c\u5c3d\u7ba1\u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 B \u660e\u663e\u4f18\u4e8e\u7b97\u6cd5 C \u3002\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5f88\u96be\u4ec5\u51ed\u65f6\u95f4\u590d\u6742\u5ea6\u5224\u65ad\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u5f53\u7136\uff0c\u5c3d\u7ba1\u5b58\u5728\u4e0a\u8ff0\u95ee\u9898\uff0c\u590d\u6742\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8bc4\u5224\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
"},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u8f93\u5165\u5927\u5c0f\u4e3a \\(n\\) \u7684\u51fd\u6570\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u5faa\u73af n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

\u8bbe\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u662f\u4e00\u4e2a\u5173\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u7684\u51fd\u6570\uff0c\u8bb0\u4e3a \\(T(n)\\) \uff0c\u5219\u4ee5\u4e0a\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a\uff1a

\\[ T(n) = 3 + 2n \\]

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u5176\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u7ebf\u6027\u9636\u3002

\u6211\u4eec\u5c06\u7ebf\u6027\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8bb0\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e2a\u6570\u5b66\u7b26\u53f7\u79f0\u4e3a\u5927 \\(O\\) \u8bb0\u53f7\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u6e10\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u786e\u7684\u6570\u5b66\u5b9a\u4e49\u3002

\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c

\u82e5\u5b58\u5728\u6b63\u5b9e\u6570 \\(c\\) \u548c\u5b9e\u6570 \\(n_0\\) \uff0c\u4f7f\u5f97\u5bf9\u4e8e\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5219\u53ef\u8ba4\u4e3a \\(f(n)\\) \u7ed9\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u4e2a\u6e10\u8fd1\u4e0a\u754c\uff0c\u8bb0\u4e3a \\(T(n) = O(f(n))\\) \u3002

\u5982\u56fe 2-8 \u6240\u793a\uff0c\u8ba1\u7b97\u6e10\u8fd1\u4e0a\u754c\u5c31\u662f\u5bfb\u627e\u4e00\u4e2a\u51fd\u6570 \\(f(n)\\) \uff0c\u4f7f\u5f97\u5f53 \\(n\\) \u8d8b\u5411\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u5904\u4e8e\u76f8\u540c\u7684\u589e\u957f\u7ea7\u522b\uff0c\u4ec5\u76f8\u5dee\u4e00\u4e2a\u5e38\u6570\u9879 \\(c\\) \u7684\u500d\u6570\u3002

\u56fe 2-8 \u00a0 \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

"},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u6e10\u8fd1\u4e0a\u754c\u7684\u6570\u5b66\u5473\u513f\u6709\u70b9\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89c9\u6ca1\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u65e0\u987b\u62c5\u5fc3\u3002\u6211\u4eec\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65ad\u7684\u5b9e\u8df5\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6e10\u9886\u609f\u5176\u6570\u5b66\u610f\u4e49\u3002

\u6839\u636e\u5b9a\u4e49\uff0c\u786e\u5b9a \\(f(n)\\) \u4e4b\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u4e48\u5982\u4f55\u786e\u5b9a\u6e10\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u603b\u4f53\u5206\u4e3a\u4e24\u6b65\uff1a\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf","text":"

\u9488\u5bf9\u4ee3\u7801\uff0c\u9010\u884c\u4ece\u4e0a\u5230\u4e0b\u8ba1\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u4e8e\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6570\u9879 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u79cd\u7cfb\u6570\u3001\u5e38\u6570\u9879\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\u3002

  1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u4e0e \\(n\\) \u65e0\u5173\uff0c\u6240\u4ee5\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4ea7\u751f\u5f71\u54cd\u3002
  2. \u7701\u7565\u6240\u6709\u7cfb\u6570\u3002\u4f8b\u5982\uff0c\u5faa\u73af \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7b80\u5316\u8bb0\u4e3a \\(n\\) \u6b21\uff0c\u56e0\u4e3a \\(n\\) \u524d\u9762\u7684\u7cfb\u6570\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u6ca1\u6709\u5f71\u54cd\u3002
  3. \u5faa\u73af\u5d4c\u5957\u65f6\u4f7f\u7528\u4e58\u6cd5\u3002\u603b\u64cd\u4f5c\u6570\u91cf\u7b49\u4e8e\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u64cd\u4f5c\u6570\u91cf\u4e4b\u79ef\uff0c\u6bcf\u4e00\u5c42\u5faa\u73af\u4f9d\u7136\u53ef\u4ee5\u5206\u522b\u5957\u7528\u7b2c 1. \u70b9\u548c\u7b2c 2. \u70b9\u7684\u6280\u5de7\u3002

\u7ed9\u5b9a\u4e00\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u6765\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

\u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\uff0c\u4e24\u8005\u63a8\u7b97\u51fa\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7edf\u8ba1 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61d2\u7edf\u8ba1 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u9636\u7684\u9879\u6765\u51b3\u5b9a\u3002\u8fd9\u662f\u56e0\u4e3a\u5728 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u6700\u9ad8\u9636\u7684\u9879\u5c06\u53d1\u6325\u4e3b\u5bfc\u4f5c\u7528\uff0c\u5176\u4ed6\u9879\u7684\u5f71\u54cd\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

\u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u5938\u5f20\u7684\u503c\u662f\u4e3a\u4e86\u5f3a\u8c03\u201c\u7cfb\u6570\u65e0\u6cd5\u64bc\u52a8\u9636\u6570\u201d\u8fd9\u4e00\u7ed3\u8bba\u3002\u5f53 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u8fd9\u4e9b\u5e38\u6570\u53d8\u5f97\u65e0\u8db3\u8f7b\u91cd\u3002

\u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6570\u91cf\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u5982\u56fe 2-9 \u6240\u793a\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u7ebf\u6027\u5bf9\u6570\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} < \\text{\u9636\u4e58\u9636} \\end{aligned} \\]

\u56fe 2-9 \u00a0 \u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

"},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

\u5e38\u6570\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u5373\u4e0d\u968f\u7740 \\(n\\) \u7684\u53d8\u5316\u800c\u53d8\u5316\u3002

\u5728\u4ee5\u4e0b\u51fd\u6570\u4e2d\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

\u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u904d\u5386\u6570\u7ec4\u548c\u904d\u5386\u94fe\u8868\u7b49\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u6216\u94fe\u8868\u7684\u957f\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53d8\u91cf \\(n\\) \u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u4e3a\u6570\u636e\u5927\u5c0f\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

\u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7ea7\u522b\u589e\u957f\u3002\u5e73\u65b9\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-10 \u5bf9\u6bd4\u4e86\u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u4e09\u79cd\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\u56fe 2-10 \u00a0 \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4ee5\u5192\u6ce1\u6392\u5e8f\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

\u751f\u7269\u5b66\u7684\u201c\u7ec6\u80de\u5206\u88c2\u201d\u662f\u6307\u6570\u9636\u589e\u957f\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72b6\u6001\u4e3a \\(1\\) \u4e2a\u7ec6\u80de\uff0c\u5206\u88c2\u4e00\u8f6e\u540e\u53d8\u4e3a \\(2\\) \u4e2a\uff0c\u5206\u88c2\u4e24\u8f6e\u540e\u53d8\u4e3a \\(4\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f6e\u540e\u6709 \\(2^n\\) \u4e2a\u7ec6\u80de\u3002

\u56fe 2-11 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u7ec6\u80de\u5206\u88c2\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-11 \u00a0 \u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u5728\u5b9e\u9645\u7b97\u6cd5\u4e2d\uff0c\u6307\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u5176\u9012\u5f52\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7a77\u4e3e\u6cd5\uff08\u66b4\u529b\u641c\u7d22\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f83\u5e38\u89c1\u3002\u5bf9\u4e8e\u6570\u636e\u89c4\u6a21\u8f83\u5927\u7684\u95ee\u9898\uff0c\u6307\u6570\u9636\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u6216\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u6765\u89e3\u51b3\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

\u4e0e\u6307\u6570\u9636\u76f8\u53cd\uff0c\u5bf9\u6570\u9636\u53cd\u6620\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u60c5\u51b5\u3002\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7531\u4e8e\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u6570\u3002

\u56fe 2-12 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_2 n)\\) \uff0c\u7b80\u8bb0\u4e3a \\(O(\\log n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-12 \u00a0 \u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4e0e\u6307\u6570\u9636\u7c7b\u4f3c\uff0c\u5bf9\u6570\u9636\u4e5f\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u7b97\u6cd5\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u957f\u7f13\u6162\uff0c\u662f\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\u7684\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

\\(O(\\log n)\\) \u7684\u5e95\u6570\u662f\u591a\u5c11\uff1f

\u51c6\u786e\u6765\u8bf4\uff0c\u201c\u4e00\u5206\u4e3a \\(m\\)\u201d\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u901a\u8fc7\u5bf9\u6570\u6362\u5e95\u516c\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6570\u3001\u76f8\u7b49\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5e95\u6570 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u590d\u6742\u5ea6\u7684\u524d\u63d0\u4e0b\u8f6c\u6362\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u7701\u7565\u5e95\u6570 \\(m\\) \uff0c\u5c06\u5bf9\u6570\u9636\u76f4\u63a5\u8bb0\u4e3a \\(O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636 \\(O(n \\log n)\\)","text":"

\u7ebf\u6027\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u4e24\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u522b\u4e3a \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-13 \u5c55\u793a\u4e86\u7ebf\u6027\u5bf9\u6570\u9636\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u53c9\u6811\u7684\u6bcf\u4e00\u5c42\u7684\u64cd\u4f5c\u603b\u6570\u90fd\u4e3a \\(n\\) \uff0c\u6811\u5171\u6709 \\(\\log_2 n + 1\\) \u5c42\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u56fe 2-13 \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u7b49\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u9636\u4e58\u9636 \\(O(n!)\\)","text":"

\u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u95ee\u9898\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u4e92\u4e0d\u91cd\u590d\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6570\u91cf\u4e3a\uff1a

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

\u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u5982\u56fe 2-14 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u7b2c\u4e00\u5c42\u5206\u88c2\u51fa \\(n\\) \u4e2a\uff0c\u7b2c\u4e8c\u5c42\u5206\u88c2\u51fa \\(n - 1\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c42\u65f6\u505c\u6b62\u5206\u88c2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 2-14 \u00a0 \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

\u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u5f53 \\(n \\geq 4\\) \u65f6\u6052\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u9636\u4e58\u9636\u6bd4\u6307\u6570\u9636\u589e\u957f\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f83\u5927\u65f6\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

\u7b97\u6cd5\u7684\u65f6\u95f4\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u5047\u8bbe\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d nums \u7531\u4ece \\(1\\) \u81f3 \\(n\\) \u7684\u6570\u5b57\u7ec4\u6210\uff0c\u6bcf\u4e2a\u6570\u5b57\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff0c\u4efb\u52a1\u76ee\u6807\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

  • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
  • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u5143\u7d20\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\) \u3002

\u201c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\u3002\u76f8\u5e94\u5730\uff0c\u201c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8bb0\u53f7\u8868\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6211\u4eec\u5728\u5b9e\u9645\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u56e0\u4e3a\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6982\u7387\u4e0b\u624d\u80fd\u8fbe\u5230\uff0c\u53ef\u80fd\u4f1a\u5e26\u6765\u4e00\u5b9a\u7684\u8bef\u5bfc\u6027\u3002\u800c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u6548\u7387\u5b89\u5168\u503c\uff0c\u8ba9\u6211\u4eec\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u7b97\u6cd5\u3002

\u4ece\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u4e8e\u201c\u7279\u6b8a\u7684\u6570\u636e\u5206\u5e03\u201d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u5e76\u4e0d\u80fd\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f53\u73b0\u7b97\u6cd5\u5728\u968f\u673a\u8f93\u5165\u6570\u636e\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8bb0\u53f7\u6765\u8868\u793a\u3002

\u5bf9\u4e8e\u90e8\u5206\u7b97\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u63a8\u7b97\u51fa\u968f\u673a\u6570\u636e\u5206\u5e03\u4e0b\u7684\u5e73\u5747\u60c5\u51b5\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u4e8e\u8f93\u5165\u6570\u7ec4\u662f\u88ab\u6253\u4e71\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73b0\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6982\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u4e48\u7b97\u6cd5\u7684\u5e73\u5747\u5faa\u73af\u6b21\u6570\u5c31\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

\u4f46\u5bf9\u4e8e\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5f80\u5f80\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u5206\u6790\u51fa\u5728\u6570\u636e\u5206\u5e03\u4e0b\u7684\u6574\u4f53\u6570\u5b66\u671f\u671b\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f5c\u4e3a\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u5224\u6807\u51c6\u3002

\u4e3a\u4ec0\u4e48\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u53f7\uff1f

\u53ef\u80fd\u7531\u4e8e \\(O\\) \u7b26\u53f7\u8fc7\u4e8e\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u8bb2\uff0c\u8fd9\u79cd\u505a\u6cd5\u5e76\u4e0d\u89c4\u8303\u3002\u5728\u672c\u4e66\u548c\u5176\u4ed6\u8d44\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u7c7b\u4f3c\u201c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8bf7\u5c06\u5176\u76f4\u63a5\u7406\u89e3\u4e3a \\(\\Theta(n)\\) \u3002

"},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u6570\u636e\u7ed3\u6784","text":"

Abstract

\u6570\u636e\u7ed3\u6784\u5982\u540c\u4e00\u526f\u7a33\u56fa\u800c\u591a\u6837\u7684\u6846\u67b6\u3002

\u5b83\u4e3a\u6570\u636e\u7684\u6709\u5e8f\u7ec4\u7ec7\u63d0\u4f9b\u4e86\u84dd\u56fe\uff0c\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u751f\u52a8\u8d77\u6765\u3002

"},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b
  • 3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b
  • 3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *
  • 3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *
  • 3.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

\u5f53\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\u65f6\uff0c\u6211\u4eec\u4f1a\u60f3\u5230\u6587\u672c\u3001\u56fe\u7247\u3001\u89c6\u9891\u3001\u8bed\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u79cd\u5f62\u5f0f\u3002\u5c3d\u7ba1\u8fd9\u4e9b\u6570\u636e\u7684\u7ec4\u7ec7\u5f62\u5f0f\u5404\u5f02\uff0c\u4f46\u5b83\u4eec\u90fd\u7531\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6784\u6210\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

  • \u6574\u6570\u7c7b\u578b byte\u3001short\u3001int\u3001long \u3002
  • \u6d6e\u70b9\u6570\u7c7b\u578b float\u3001double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\u3002
  • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002
  • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u4e00\u4e2a\u4e8c\u8fdb\u5236\u4f4d\u5373\u4e3a \\(1\\) \u6bd4\u7279\u3002\u5728\u7edd\u5927\u591a\u6570\u73b0\u4ee3\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bit\uff09\u7ec4\u6210\u3002

\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u4e3a\u4f8b\u3002

  • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) \u5b57\u8282 = \\(8\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u6570\u5b57\u3002
  • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) \u5b57\u8282 = \\(32\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\u3002

\u8868 3-1 \u5217\u4e3e\u4e86 Java \u4e2d\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u987b\u6b7b\u8bb0\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

\u8868 3-1 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u548c\u53d6\u503c\u8303\u56f4

\u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 \u5b57\u8282 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u5b57\u8282 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u5b57\u8282 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u5b57\u8282 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 \u5b57\u8282 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u5b57\u8282 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 \u5b57\u8282 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 \u5b57\u8282 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

\u8bf7\u6ce8\u610f\uff0c\u8868 3-1 \u9488\u5bf9\u7684\u662f Java \u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u60c5\u51b5\u3002\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u6709\u5404\u81ea\u7684\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\uff0c\u5b83\u4eec\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002

  • \u5728 Python \u4e2d\uff0c\u6574\u6570\u7c7b\u578b int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\uff1b\u6d6e\u70b9\u6570 float \u662f\u53cc\u7cbe\u5ea6 64 \u4f4d\uff1b\u6ca1\u6709 char \u7c7b\u578b\uff0c\u5355\u4e2a\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32 str \u3002
  • C \u548c C++ \u672a\u660e\u786e\u89c4\u5b9a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5b9e\u73b0\u548c\u5e73\u53f0\u5404\u5f02\u3002\u8868 3-1 \u9075\u5faa LP64 \u6570\u636e\u6a21\u578b\uff0c\u5176\u7528\u4e8e\u5305\u62ec Linux \u548c macOS \u5728\u5185\u7684 Unix 64 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u3002
  • \u5b57\u7b26 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u4e3a 1 \u5b57\u8282\uff0c\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\u53d6\u51b3\u4e8e\u7279\u5b9a\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u201c\u5b57\u7b26\u7f16\u7801\u201d\u7ae0\u8282\u3002
  • \u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u4e5f\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a\u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002

\u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u8fd9\u53e5\u8bdd\u7684\u4e3b\u8bed\u662f\u201c\u7ed3\u6784\u201d\u800c\u975e\u201c\u6570\u636e\u201d\u3002

\u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int\u3001\u5c0f\u6570 float \u8fd8\u662f\u5b57\u7b26 char \uff0c\u5219\u4e0e\u201c\u6570\u636e\u7ed3\u6784\u201d\u65e0\u5173\u3002

\u6362\u53e5\u8bdd\u8bf4\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u5185\u5bb9\u7c7b\u578b\u201d\uff0c\u800c\u6570\u636e\u7ed3\u6784\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u7ec4\u7ec7\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u7528\u76f8\u540c\u7684\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\uff09\u6765\u5b58\u50a8\u4e0e\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript \u7684\u6570\u7ec4\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nconst array = [0, 0.0, 'a', false];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
// \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
# Ruby \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

\u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

"},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u79f0\u4e3a American Standard Code for Information Interchange\uff08\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5982\u56fe 3-6 \u6240\u793a\uff0cASCII \u7801\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

\u56fe 3-6 \u00a0 ASCII \u7801

\u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002

\u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

"},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

\u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6c49\u5b57\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

\u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\u6269\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7684\u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

"},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

\u968f\u7740\u8ba1\u7b97\u673a\u6280\u672f\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u8ba1\u7b97\u673a\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

\u90a3\u4e2a\u65f6\u4ee3\u7684\u7814\u7a76\u4eba\u5458\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

Unicode \u7684\u4e2d\u6587\u540d\u79f0\u4e3a\u201c\u7edf\u4e00\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3 100 \u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

\u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360\u7528 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

Unicode \u662f\u4e00\u79cd\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

\u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u56fe 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

\u56fe 3-7 \u00a0 Unicode \u7f16\u7801\u793a\u4f8b

\u7136\u800c ASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u7684\u4e24\u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7f16\u7801","text":"

\u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u5ea6\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700 1 \u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u5b57\u8282\u3002

UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff0c\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
  • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

\u56fe 3-8 \u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u89c2\u5bdf\u53d1\u73b0\uff0c\u7531\u4e8e\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7\u8bfb\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u4e2a\u6570\u6765\u89e3\u6790\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002

\u4f46\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u5224\u65ad\u51fa\u5f02\u5e38\u3002

\u4e4b\u6240\u4ee5\u5c06 \\(10\\) \u5f53\u4f5c\u6821\u9a8c\u7b26\uff0c\u662f\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u4e2a\u7ed3\u8bba\u53ef\u4ee5\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\uff1a\u5047\u8bbe\u4e00\u4e2a\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \uff0c\u8bf4\u660e\u8be5\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(1\\) \uff0c\u5bf9\u5e94 ASCII \u7801\u3002\u800c ASCII \u7801\u7684\u6700\u9ad8\u4f4d\u5e94\u8be5\u662f \\(0\\) \uff0c\u4e0e\u5047\u8bbe\u77db\u76fe\u3002

\u56fe 3-8 \u00a0 UTF-8 \u7f16\u7801\u793a\u4f8b

\u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec\u4ee5\u4e0b\u4e24\u79cd\u3002

  • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
  • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e ASCII \u5b57\u7b26\u5360\u6bd4\u8f83\u9ad8\u7684\u6587\u672c\u3002

\u4ece\u5b58\u50a8\u7a7a\u95f4\u5360\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 2 \u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u5b57\u8282\u3002

\u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u4f18\u5148\u652f\u6301 UTF-8 \u3002

"},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

\u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7f16\u7801\u3002\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u8fd9\u79cd\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

  • \u968f\u673a\u8bbf\u95ee\uff1aUTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
  • \u5b57\u7b26\u8ba1\u6570\uff1a\u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
  • \u5b57\u7b26\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

\u5b9e\u9645\u4e0a\uff0c\u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u8bb8\u591a\u56e0\u7d20\u3002

  • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
  • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8bed\u8a00\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u53d1\u5c55\u65e9\u671f\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
  • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff08\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff09\u90fd\u5e7f\u6cdb\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

\u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u4ece\u800c\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u989d\u5916\u589e\u52a0\u4ee3\u7801\uff0c\u8fd9\u63d0\u9ad8\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c\u8c03\u8bd5\u96be\u5ea6\u3002

\u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\u3002

  • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7f16\u7801\uff0c\u5e76\u91c7\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u82e5\u5b57\u7b26\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff1b\u5982\u679c\u6709\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u5b57\u8282\u3002
  • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
  • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\uff0c\u5b83\u4eec\u53ef\u4ee5\u4ece\u201c\u903b\u8f91\u7ed3\u6784\u201d\u548c\u201c\u7269\u7406\u7ed3\u6784\u201d\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

\u903b\u8f91\u7ed3\u6784\u63ed\u793a\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\u3002\u5728\u6570\u7ec4\u548c\u94fe\u8868\u4e2d\uff0c\u6570\u636e\u6309\u7167\u4e00\u5b9a\u987a\u5e8f\u6392\u5217\uff0c\u4f53\u73b0\u4e86\u6570\u636e\u4e4b\u95f4\u7684\u7ebf\u6027\u5173\u7cfb\uff1b\u800c\u5728\u6811\u4e2d\uff0c\u6570\u636e\u4ece\u9876\u90e8\u5411\u4e0b\u6309\u5c42\u6b21\u6392\u5217\uff0c\u8868\u73b0\u51fa\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff1b\u56fe\u5219\u7531\u8282\u70b9\u548c\u8fb9\u6784\u6210\uff0c\u53cd\u6620\u4e86\u590d\u6742\u7684\u7f51\u7edc\u5173\u7cfb\u3002

\u5982\u56fe 3-1 \u6240\u793a\uff0c\u903b\u8f91\u7ed3\u6784\u53ef\u5206\u4e3a\u201c\u7ebf\u6027\u201d\u548c\u201c\u975e\u7ebf\u6027\u201d\u4e24\u5927\u7c7b\u3002\u7ebf\u6027\u7ed3\u6784\u6bd4\u8f83\u76f4\u89c2\uff0c\u6307\u6570\u636e\u5728\u903b\u8f91\u5173\u7cfb\u4e0a\u5448\u7ebf\u6027\u6392\u5217\uff1b\u975e\u7ebf\u6027\u7ed3\u6784\u5219\u76f8\u53cd\uff0c\u5448\u975e\u7ebf\u6027\u6392\u5217\u3002

  • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u4e00\u7684\u987a\u5e8f\u5173\u7cfb\u3002
  • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u56fe\u3001\u54c8\u5e0c\u8868\u3002

\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u6811\u5f62\u7ed3\u6784\u548c\u7f51\u72b6\u7ed3\u6784\u3002

  • \u6811\u5f62\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\u3002
  • \u7f51\u72b6\u7ed3\u6784\uff1a\u56fe\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u591a\u5bf9\u591a\u7684\u5173\u7cfb\u3002

\u56fe 3-1 \u00a0 \u7ebf\u6027\u6570\u636e\u7ed3\u6784\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

"},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u5206\u6563","text":"

\u5f53\u7b97\u6cd5\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u56fe 3-2 \u5c55\u793a\u4e86\u4e00\u4e2a\u8ba1\u7b97\u673a\u5185\u5b58\u6761\uff0c\u5176\u4e2d\u6bcf\u4e2a\u9ed1\u8272\u65b9\u5757\u90fd\u5305\u542b\u4e00\u5757\u5185\u5b58\u7a7a\u95f4\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u5185\u5b58\u60f3\u8c61\u6210\u4e00\u4e2a\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5355\u5143\u683c\u90fd\u53ef\u4ee5\u5b58\u50a8\u4e00\u5b9a\u5927\u5c0f\u7684\u6570\u636e\u3002

\u7cfb\u7edf\u901a\u8fc7\u5185\u5b58\u5730\u5740\u6765\u8bbf\u95ee\u76ee\u6807\u4f4d\u7f6e\u7684\u6570\u636e\u3002\u5982\u56fe 3-2 \u6240\u793a\uff0c\u8ba1\u7b97\u673a\u6839\u636e\u7279\u5b9a\u89c4\u5219\u4e3a\u8868\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5206\u914d\u7f16\u53f7\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u6709\u552f\u4e00\u7684\u5185\u5b58\u5730\u5740\u3002\u6709\u4e86\u8fd9\u4e9b\u5730\u5740\uff0c\u7a0b\u5e8f\u4fbf\u53ef\u4ee5\u8bbf\u95ee\u5185\u5b58\u4e2d\u7684\u6570\u636e\u3002

\u56fe 3-2 \u00a0 \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

Tip

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5c06\u5185\u5b58\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u4e2a\u7b80\u5316\u7684\u7c7b\u6bd4\uff0c\u5b9e\u9645\u5185\u5b58\u7684\u5de5\u4f5c\u673a\u5236\u6bd4\u8f83\u590d\u6742\uff0c\u6d89\u53ca\u5730\u5740\u7a7a\u95f4\u3001\u5185\u5b58\u7ba1\u7406\u3001\u7f13\u5b58\u673a\u5236\u3001\u865a\u62df\u5185\u5b58\u548c\u7269\u7406\u5185\u5b58\u7b49\u6982\u5ff5\u3002

\u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u67d0\u5757\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5219\u65e0\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5e8f\u540c\u65f6\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bbe\u8ba1\u4e2d\uff0c\u5185\u5b58\u8d44\u6e90\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u8003\u8651\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u7b97\u6cd5\u6240\u5360\u7528\u7684\u5185\u5b58\u5cf0\u503c\u4e0d\u5e94\u8d85\u8fc7\u7cfb\u7edf\u5269\u4f59\u7a7a\u95f2\u5185\u5b58\uff1b\u5982\u679c\u7f3a\u5c11\u8fde\u7eed\u5927\u5757\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u5206\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

\u5982\u56fe 3-3 \u6240\u793a\uff0c\u7269\u7406\u7ed3\u6784\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u7269\u7406\u7ed3\u6784\u4ece\u5e95\u5c42\u51b3\u5b9a\u4e86\u6570\u636e\u7684\u8bbf\u95ee\u3001\u66f4\u65b0\u3001\u589e\u5220\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

\u56fe 3-3 \u00a0 \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u5206\u6563\u7a7a\u95f4\u5b58\u50a8

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u57fa\u4e8e\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e8c\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002\u4f8b\u5982\uff0c\u6808\u548c\u961f\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff1b\u800c\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u6570\u7ec4\u548c\u94fe\u8868\u3002

  • \u57fa\u4e8e\u6570\u7ec4\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u3001\u77e9\u9635\u3001\u5f20\u91cf\uff08\u7ef4\u5ea6 \\(\\geq 3\\) \u7684\u6570\u7ec4\uff09\u7b49\u3002
  • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u3002

\u94fe\u8868\u5728\u521d\u59cb\u5316\u540e\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u5bf9\u5176\u957f\u5ea6\u8fdb\u884c\u8c03\u6574\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u7ec4\u53ef\u901a\u8fc7\u91cd\u65b0\u5206\u914d\u5185\u5b58\u5b9e\u73b0\u957f\u5ea6\u53d8\u5316\uff0c\u4ece\u800c\u5177\u5907\u4e00\u5b9a\u7684\u201c\u52a8\u6001\u6027\u201d\u3002

Tip

\u5982\u679c\u4f60\u611f\u89c9\u7269\u7406\u7ed3\u6784\u7406\u89e3\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\uff0c\u7136\u540e\u518d\u56de\u987e\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

Tip

\u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

"},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

\u5728\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002

\u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6570\u5b57\u662f\u4ee5\u201c\u8865\u7801\u201d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u5728\u5206\u6790\u8fd9\u6837\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\u3002

  • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
  • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
  • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

\u56fe 3-4 \u5c55\u793a\u4e86\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\u3002

\u56fe 3-4 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

\u539f\u7801\uff08sign-magnitude\uff09\u867d\u7136\u6700\u76f4\u89c2\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u53cd\u7801\uff081's complement\uff09\u3002\u5982\u679c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u540e\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u6362\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u7801)} + 1000 \\; 0010 \\; \\text{(\u539f\u7801)} \\newline & = 0000 \\; 0001 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1101 \\; \\text{(\u53cd\u7801)} \\newline & = 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & \\rightarrow -1 \\end{aligned} \\]

\u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u3002\u6bd4\u5982\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u5219\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5224\u65ad\u7ed3\u679c\u51fa\u9519\u3002\u800c\u5982\u679c\u6211\u4eec\u60f3\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u8fd9\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

\u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\uff0c\u56e0\u6b64\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u8865\u7801\uff082's complement\uff09\u3002\u6211\u4eec\u5148\u6765\u89c2\u5bdf\u4e00\u4e0b\u8d1f\u96f6\u7684\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u8f6c\u6362\u8fc7\u7a0b\uff1a

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u7801)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u53cd\u7801)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

\u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u4f46 byte \u7c7b\u578b\u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\; 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u6b63\u8d1f\u96f6\u6b67\u4e49\u4ece\u800c\u5f97\u5230\u89e3\u51b3\u3002

\u8fd8\u5269\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u3002

\u7136\u800c\uff0c\u8865\u7801 \\(1000 \\; 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\; 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u7801)} + 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u8865\u7801)} + 1111 \\; 1111 \\; \\text{(\u8865\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline & \\rightarrow -128 \\end{aligned} \\]

\u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u8fd0\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

\u8bf7\u6ce8\u610f\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u987b\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

\u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5c31\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\uff0c\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5165\u4e86\u89e3\u3002

"},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u5b57\u8282 \uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

\u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8bb0\u4e00\u4e2a 32 \u6bd4\u7279\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570\u4e3a\uff1a

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

\u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u4e2a\u90e8\u5206\u6784\u6210\u3002

  • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{31}\\) \u3002
  • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
  • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 23 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

\u4e8c\u8fdb\u5236\u6570 float \u5bf9\u5e94\u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff1a

\\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

\u8f6c\u5316\u5230\u5341\u8fdb\u5236\u4e0b\u7684\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff1a

\\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

\u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

\u56fe 3-5 \u00a0 IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u7684\u8ba1\u7b97\u793a\u4f8b

\u89c2\u5bdf\u56fe 3-5 \uff0c\u7ed9\u5b9a\u4e00\u4e2a\u793a\u4f8b\u6570\u636e \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5219\u6709\uff1a

\\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u95ee\u9898\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6570\u4f4d\uff0c\u5bfc\u81f4\u5176\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \u3002\u6839\u636e\u4ee5\u4e0a\u8ba1\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6570\u4e3a \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u6362\u7b26\u53f7\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8d1f\u6570\u3002

\u5c3d\u7ba1\u6d6e\u70b9\u6570 float \u6269\u5c55\u4e86\u53d6\u503c\u8303\u56f4\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6570\u7c7b\u578b int \u5c06\u5168\u90e8 32 \u6bd4\u7279\u7528\u4e8e\u8868\u793a\u6570\u5b57\uff0c\u6570\u5b57\u662f\u5747\u5300\u5206\u5e03\u7684\uff1b\u800c\u7531\u4e8e\u6307\u6570\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u70b9\u6570 float \u7684\u6570\u503c\u8d8a\u5927\uff0c\u76f8\u90bb\u4e24\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u5dee\u503c\u5c31\u4f1a\u8d8b\u5411\u8d8a\u5927\u3002

\u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6570\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\u8868 3-2 \u00a0 \u6307\u6570\u4f4d\u542b\u4e49

\u6307\u6570\u4f4d E \u5206\u6570\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6570\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8ba1\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u89c4\u6570 \u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23}\\) \u3002

\u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c\u4e8e float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d58\u8ff0\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u89d2\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002\u903b\u8f91\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\uff0c\u800c\u7269\u7406\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\u3002
  • \u5e38\u89c1\u7684\u903b\u8f91\u7ed3\u6784\u5305\u62ec\u7ebf\u6027\u3001\u6811\u72b6\u548c\u7f51\u72b6\u7b49\u3002\u901a\u5e38\u6211\u4eec\u6839\u636e\u903b\u8f91\u7ed3\u6784\u5c06\u6570\u636e\u7ed3\u6784\u5206\u4e3a\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\u3001\u56fe\u3001\u5806\uff09\u4e24\u79cd\u3002\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002
  • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
  • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u7531\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e24\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002
  • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u70b9\u6570 float\u3001double \uff0c\u5b57\u7b26 char \u548c\u5e03\u5c14 bool \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
  • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
  • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
  • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u56e0\u6b64\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
  • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u4e0a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
  • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u5360\u7528\u7684\u7a7a\u95f4\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

\u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u94fe\u5f0f\u5730\u5740\u201d\uff08\u540e\u7eed\u201c\u54c8\u5e0c\u51b2\u7a81\u201d\u7ae0\u8282\u4f1a\u8bb2\uff09\uff1a\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u6876\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff0c\u5f53\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002

\u4ece\u5b58\u50a8\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u94fe\u8868\u6216\u4e00\u68f5\u6811\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6811\uff09\u3002

Q\uff1achar \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 \u5b57\u8282\u5417\uff1f

char \u7c7b\u578b\u7684\u957f\u5ea6\u7531\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u51b3\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u3002

Q\uff1a\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d \u662f\u5426\u6709\u6b67\u4e49\uff1f\u6808\u4e5f\u53ef\u4ee5\u8fdb\u884c\u51fa\u6808\u548c\u5165\u6808\u7b49\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52a8\u6001\u201d\u7684\u3002

\u6808\u786e\u5b9e\u53ef\u4ee5\u5b9e\u73b0\u52a8\u6001\u7684\u6570\u636e\u64cd\u4f5c\uff0c\u4f46\u6570\u636e\u7ed3\u6784\u4ecd\u7136\u662f\u201c\u9759\u6001\u201d\uff08\u957f\u5ea6\u4e0d\u53ef\u53d8\uff09\u7684\u3002\u5c3d\u7ba1\u57fa\u4e8e\u6570\u7ec4\u7684\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u52a8\u6001\u5730\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u4eec\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u6570\u636e\u91cf\u8d85\u51fa\u4e86\u9884\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u65e7\u6570\u7ec4\u7684\u5185\u5bb9\u590d\u5236\u5230\u65b0\u6570\u7ec4\u4e2d\u3002

Q\uff1a\u5728\u6784\u5efa\u6808\uff08\u961f\u5217\uff09\u7684\u65f6\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u4e3a\u4ec0\u4e48\u5b83\u4eec\u662f\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u5462\uff1f

\u5728\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e0\u987b\u4eba\u5de5\u6307\u5b9a\u6808\uff08\u961f\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u7531\u7c7b\u5185\u90e8\u81ea\u52a8\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u4e3a 10\u3002\u53e6\u5916\uff0c\u6269\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52a8\u5b9e\u73b0\u7684\u3002\u8be6\u89c1\u540e\u7eed\u7684\u201c\u5217\u8868\u201d\u7ae0\u8282\u3002

Q\uff1a\u539f\u7801\u8f6c\u8865\u7801\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\uff0c\u90a3\u4e48\u8865\u7801\u8f6c\u539f\u7801\u5e94\u8be5\u662f\u9006\u8fd0\u7b97\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff0c\u800c\u8865\u7801\u8f6c\u539f\u7801\u4e5f\u4e00\u6837\u53ef\u4ee5\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f

A\uff1a\u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u548c\u8865\u7801\u7684\u76f8\u4e92\u8f6c\u6362\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u201c\u8865\u6570\u201d\u7684\u8fc7\u7a0b\u3002\u6211\u4eec\u5148\u7ed9\u51fa\u8865\u6570\u7684\u5b9a\u4e49\uff1a\u5047\u8bbe \\(a + b = c\\) \uff0c\u90a3\u4e48\u6211\u4eec\u79f0 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u8865\u6570\uff0c\u53cd\u4e4b\u4e5f\u79f0 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u8865\u6570\u3002

\u7ed9\u5b9a\u4e00\u4e2a \\(n = 4\\) \u4f4d\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570 \\(0010\\) \uff0c\u5982\u679c\u5c06\u8fd9\u4e2a\u6570\u5b57\u770b\u4f5c\u539f\u7801\uff08\u4e0d\u8003\u8651\u7b26\u53f7\u4f4d\uff09\uff0c\u90a3\u4e48\u5b83\u7684\u8865\u7801\u9700\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff1a

\\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

\u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u539f\u7801\u548c\u8865\u7801\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u8865\u7801 \\(1110\\) \u662f\u539f\u7801 \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\u7684\u8fc7\u7a0b\u3002

\u90a3\u4e48\uff0c\u8865\u7801 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u4eec\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

\\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

\u6362\u53e5\u8bdd\u8bf4\uff0c\u539f\u7801\u548c\u8865\u7801\u4e92\u4e3a\u5bf9\u65b9\u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\uff0c\u56e0\u6b64\u201c\u539f\u7801\u8f6c\u8865\u7801\u201d\u548c\u201c\u8865\u7801\u8f6c\u539f\u7801\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u540e\u52a0 1 \uff09\u5b9e\u73b0\u3002

\u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u9006\u8fd0\u7b97\u6765\u6c42\u8865\u7801 \\(1110\\) \u7684\u539f\u7801\uff0c\u5373\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff1a

\\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

\u603b\u7ed3\u6765\u770b\uff0c\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u548c\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\u8fd9\u4e24\u79cd\u8fd0\u7b97\u90fd\u662f\u5728\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\uff0c\u5b83\u4eec\u662f\u7b49\u4ef7\u7684\u3002

\u672c\u8d28\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u8865\u6570\uff08\u56e0\u4e3a\u6052\u6709 \u539f\u7801 + \u53cd\u7801 = 1111\uff09\uff1b\u800c\u5728\u53cd\u7801\u57fa\u7840\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u8865\u7801\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u8865\u6570\u3002

\u4e0a\u8ff0 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\u63a8\u5e7f\u81f3\u4efb\u610f\u4f4d\u6570\u7684\u4e8c\u8fdb\u5236\u6570\u3002

"},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

Abstract

\u96be\u9898\u88ab\u9010\u5c42\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u53d8\u5f97\u66f4\u4e3a\u7b80\u5355\u3002

\u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u4e8b\u5b9e\uff1a\u4ece\u7b80\u5355\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u590d\u6742\u3002

"},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5
  • 12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565
  • 12.3 \u00a0 \u6784\u5efa\u6811\u95ee\u9898
  • 12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898
  • 12.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565","text":"

\u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\uff0c\u641c\u7d22\u7b97\u6cd5\u5206\u4e3a\u4e24\u5927\u7c7b\u3002

  • \u66b4\u529b\u641c\u7d22\uff1a\u5b83\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
  • \u81ea\u9002\u5e94\u641c\u7d22\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u6570\u636e\u7ec4\u7ec7\u5f62\u5f0f\u6216\u5148\u9a8c\u4fe1\u606f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u548c\u6811\u3002

  • \u4e8c\u5206\u67e5\u627e\u7684\u6bcf\u4e00\u6b65\u90fd\u5c06\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\u5206\u89e3\u4e3a\u4e00\u4e2a\u5c0f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u76f4\u6301\u7eed\u5230\u6570\u7ec4\u4e3a\u7a7a\u6216\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
  • \u6811\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u5806\u7b49\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7686\u4e3a \\(O(\\log n)\\) \u3002

\u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

  • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u67e5\u627e\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\u5206\u89e3\u4e3a\u5b50\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\uff0c\u8fd9\u662f\u901a\u8fc7\u6bd4\u8f83\u4e2d\u95f4\u5143\u7d20\u548c\u76ee\u6807\u5143\u7d20\u6765\u5b9e\u73b0\u7684\u3002
  • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u5904\u7406\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u95ee\u9898\u7684\u5f71\u54cd\u3002
  • \u5b50\u95ee\u9898\u7684\u89e3\u65e0\u987b\u5408\u5e76\uff1a\u4e8c\u5206\u67e5\u627e\u65e8\u5728\u67e5\u627e\u4e00\u4e2a\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u3002\u5f53\u5b50\u95ee\u9898\u5f97\u5230\u89e3\u51b3\u65f6\uff0c\u539f\u95ee\u9898\u4e5f\u4f1a\u540c\u65f6\u5f97\u5230\u89e3\u51b3\u3002

\u5206\u6cbb\u80fd\u591f\u63d0\u5347\u641c\u7d22\u6548\u7387\uff0c\u672c\u8d28\u4e0a\u662f\u56e0\u4e3a\u66b4\u529b\u641c\u7d22\u6bcf\u8f6e\u53ea\u80fd\u6392\u9664\u4e00\u4e2a\u9009\u9879\uff0c\u800c\u5206\u6cbb\u641c\u7d22\u6bcf\u8f6e\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9009\u9879\u3002

"},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u4e8e\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e","text":"

\u5728\u4e4b\u524d\u7684\u7ae0\u8282\u4e2d\uff0c\u4e8c\u5206\u67e5\u627e\u662f\u57fa\u4e8e\u9012\u63a8\uff08\u8fed\u4ee3\uff09\u5b9e\u73b0\u7684\u3002\u73b0\u5728\u6211\u4eec\u57fa\u4e8e\u5206\u6cbb\uff08\u9012\u5f52\uff09\u6765\u5b9e\u73b0\u5b83\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8bf7\u67e5\u627e\u5143\u7d20 target \u3002

\u4ece\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u4eec\u5c06\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u8bb0\u4e3a \\(f(i, j)\\) \u3002

\u4ee5\u539f\u95ee\u9898 \\(f(0, n-1)\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u901a\u8fc7\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002

  1. \u8ba1\u7b97\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u7684\u4e2d\u70b9 \\(m\\) \uff0c\u6839\u636e\u5b83\u6392\u9664\u4e00\u534a\u641c\u7d22\u533a\u95f4\u3002
  2. \u9012\u5f52\u6c42\u89e3\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u80fd\u4e3a \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
  3. \u5faa\u73af\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u533a\u95f4\u4e3a\u7a7a\u65f6\u8fd4\u56de\u3002

\u56fe 12-4 \u5c55\u793a\u4e86\u5728\u6570\u7ec4\u4e2d\u4e8c\u5206\u67e5\u627e\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u8fc7\u7a0b\u3002

\u56fe 12-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u8fc7\u7a0b

\u5728\u5b9e\u73b0\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \u6765\u6c42\u89e3\u95ee\u9898 \\(f(i, j)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j)\"\"\"\n    # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
binary_search_recur.cpp
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.java
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.cs
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
binary_search_recur.go
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u6ca1\u6709\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8ba1\u7b97\u7d22\u5f15\u4e2d\u70b9\n    m := i + ((j - i) >> 1)\n    //\u5224\u65ad\u4e2d\u70b9\u4e0e\u76ee\u6807\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u53f3\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u5de6\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
binary_search_recur.swift
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
binary_search_recur.js
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.ts
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.dart
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.rs
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.c
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.kt
/* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
binary_search_recur.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \uff0c\u8bf7\u4ece\u4e2d\u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u8fd4\u56de\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u3002\u5047\u8bbe\u4e8c\u53c9\u6811\u4e2d\u6ca1\u6709\u503c\u91cd\u590d\u7684\u8282\u70b9\uff08\u5982\u56fe 12-5 \u6240\u793a\uff09\u3002

\u56fe 12-5 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65ad\u662f\u5426\u4e3a\u5206\u6cbb\u95ee\u9898","text":"

\u539f\u95ee\u9898\u5b9a\u4e49\u4e3a\u4ece preorder \u548c inorder \u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u662f\u4e00\u4e2a\u5178\u578b\u7684\u5206\u6cbb\u95ee\u9898\u3002

  • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4ece\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\u3001\u6784\u5efa\u53f3\u5b50\u6811\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u8282\u70b9\u3002\u800c\u5bf9\u4e8e\u6bcf\u68f5\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u590d\u7528\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u5c06\u5176\u5212\u5206\u4e3a\u66f4\u5c0f\u7684\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u7a7a\u5b50\u6811\uff09\u65f6\u7ec8\u6b62\u3002
  • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u4ea4\u96c6\u3002\u5728\u6784\u5efa\u5de6\u5b50\u6811\u65f6\uff0c\u6211\u4eec\u53ea\u9700\u5173\u6ce8\u4e2d\u5e8f\u904d\u5386\u548c\u524d\u5e8f\u904d\u5386\u4e2d\u4e0e\u5de6\u5b50\u6811\u5bf9\u5e94\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6811\u540c\u7406\u3002
  • \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u5b83\u4eec\u94fe\u63a5\u5230\u6839\u8282\u70b9\u4e0a\uff0c\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5212\u5206\u5b50\u6811","text":"

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u8fd9\u9053\u9898\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u6765\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u901a\u8fc7\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u6765\u5212\u5206\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u5462\uff1f

\u6839\u636e\u5b9a\u4e49\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

  • \u524d\u5e8f\u904d\u5386\uff1a[ \u6839\u8282\u70b9 | \u5de6\u5b50\u6811 | \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 3 | 9 | 2 1 7 ] \u3002
  • \u4e2d\u5e8f\u904d\u5386\uff1a[ \u5de6\u5b50\u6811 | \u6839\u8282\u70b9 \uff5c \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 9 | 3 | 1 2 7 ] \u3002

\u4ee5\u4e0a\u56fe\u6570\u636e\u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u56fe 12-6 \u6240\u793a\u7684\u6b65\u9aa4\u5f97\u5230\u5212\u5206\u7ed3\u679c\u3002

  1. \u524d\u5e8f\u904d\u5386\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u8282\u70b9\u7684\u503c\u3002
  2. \u67e5\u627e\u6839\u8282\u70b9 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8be5\u7d22\u5f15\u53ef\u5c06 inorder \u5212\u5206\u4e3a [ 9 | 3 \uff5c 1 2 7 ] \u3002
  3. \u6839\u636e inorder \u7684\u5212\u5206\u7ed3\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u5206\u522b\u4e3a 1 \u548c 3 \uff0c\u4ece\u800c\u53ef\u5c06 preorder \u5212\u5206\u4e3a [ 3 | 9 | 2 1 7 ] \u3002

\u56fe 12-6 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u5212\u5206\u5b50\u6811

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u4e8e\u53d8\u91cf\u63cf\u8ff0\u5b50\u6811\u533a\u95f4","text":"

\u6839\u636e\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u6211\u4eec\u5df2\u7ecf\u5f97\u5230\u6839\u8282\u70b9\u3001\u5de6\u5b50\u6811\u3001\u53f3\u5b50\u6811\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002\u800c\u4e3a\u4e86\u63cf\u8ff0\u8fd9\u4e9b\u7d22\u5f15\u533a\u95f4\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u3002

  • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(i\\) \u3002
  • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(m\\) \u3002
  • \u5c06\u5f53\u524d\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u8bb0\u4e3a \\([l, r]\\) \u3002

\u5982\u8868 12-1 \u6240\u793a\uff0c\u901a\u8fc7\u4ee5\u4e0a\u53d8\u91cf\u5373\u53ef\u8868\u793a\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002

\u8868 12-1 \u00a0 \u6839\u8282\u70b9\u548c\u5b50\u6811\u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u7684\u7d22\u5f15

\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4 \u5f53\u524d\u6811 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6811 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6811 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

\u8bf7\u6ce8\u610f\uff0c\u53f3\u5b50\u6811\u6839\u8282\u70b9\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u4e49\u662f\u201c\u5de6\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u201d\uff0c\u5efa\u8bae\u7ed3\u5408\u56fe 12-7 \u7406\u89e3\u3002

\u56fe 12-7 \u00a0 \u6839\u8282\u70b9\u548c\u5de6\u53f3\u5b50\u6811\u7684\u7d22\u5f15\u533a\u95f4\u8868\u793a

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4e3a\u4e86\u63d0\u5347\u67e5\u8be2 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 hmap \u6765\u5b58\u50a8\u6570\u7ec4 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root = TreeNode(preorder[i])\n    # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m = inorder_map[preorder[i]]\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\"\"\"\n    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
build_tree.cpp
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
build_tree.java
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.cs
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
build_tree.go
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m := inorderMap[preorder[i]]\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
build_tree.swift
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
build_tree.js
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.ts
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.dart
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u8282\u70b9\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u8282\u70b9\n  return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
build_tree.rs
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    Some(root)\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
build_tree.c
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
build_tree.kt
/* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
build_tree.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
build_tree.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 12-8 \u5c55\u793a\u4e86\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5404\u4e2a\u8282\u70b9\u662f\u5728\u5411\u4e0b\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u6761\u8fb9\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

<1><2><3><4><5><6><7><8><9>

\u56fe 12-8 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b

\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u5185\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u7684\u5212\u5206\u7ed3\u679c\u5982\u56fe 12-9 \u6240\u793a\u3002

\u56fe 12-9 \u00a0 \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u7684\u5212\u5206\u7ed3\u679c

\u8bbe\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u4e2a\u8282\u70b9\uff08\u6267\u884c\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u54c8\u5e0c\u8868\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5","text":"

\u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u79f0\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u79cd\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u89c1\u7684\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u4e24\u4e2a\u6b65\u9aa4\u3002

  1. \u5206\uff08\u5212\u5206\u9636\u6bb5\uff09\uff1a\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u6216\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898\u65f6\u7ec8\u6b62\u3002
  2. \u6cbb\uff08\u5408\u5e76\u9636\u6bb5\uff09\uff1a\u4ece\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u95ee\u9898\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

\u5982\u56fe 12-1 \u6240\u793a\uff0c\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\u4e4b\u4e00\u3002

  1. \u5206\uff1a\u9012\u5f52\u5730\u5c06\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u5230\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u95ee\u9898\uff09\u3002
  2. \u6cbb\uff1a\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u6709\u5e8f\u7684\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002

\u56fe 12-1 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65ad\u5206\u6cbb\u95ee\u9898","text":"

\u4e00\u4e2a\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u51b3\uff0c\u901a\u5e38\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u51e0\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

  1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u95ee\u9898\u53ef\u4ee5\u5206\u89e3\u6210\u89c4\u6a21\u66f4\u5c0f\u3001\u7c7b\u4f3c\u7684\u5b50\u95ee\u9898\uff0c\u4ee5\u53ca\u80fd\u591f\u4ee5\u76f8\u540c\u65b9\u5f0f\u9012\u5f52\u5730\u8fdb\u884c\u5212\u5206\u3002
  2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5b50\u95ee\u9898\u4e4b\u95f4\u6ca1\u6709\u91cd\u53e0\uff0c\u4e92\u4e0d\u4f9d\u8d56\uff0c\u53ef\u4ee5\u72ec\u7acb\u89e3\u51b3\u3002
  3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u539f\u95ee\u9898\u7684\u89e3\u901a\u8fc7\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\u5f97\u6765\u3002

\u663e\u7136\uff0c\u5f52\u5e76\u6392\u5e8f\u6ee1\u8db3\u4ee5\u4e0a\u4e09\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

  1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u9012\u5f52\u5730\u5c06\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\u3002
  2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u53ef\u4ee5\u72ec\u7acb\u5730\u8fdb\u884c\u6392\u5e8f\uff08\u5b50\u95ee\u9898\u53ef\u4ee5\u72ec\u7acb\u8fdb\u884c\u6c42\u89e3\uff09\u3002
  3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e24\u4e2a\u6709\u5e8f\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002
"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u901a\u8fc7\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\uff0c\u5f80\u5f80\u8fd8\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u76f8\u8f83\u4e8e\u9009\u62e9\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u4e3a\u5b83\u4eec\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

\u90a3\u4e48\uff0c\u6211\u4eec\u4e0d\u7981\u53d1\u95ee\uff1a\u4e3a\u4ec0\u4e48\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c42\u903b\u8f91\u662f\u4ec0\u4e48\uff1f\u6362\u53e5\u8bdd\u8bf4\uff0c\u5c06\u5927\u95ee\u9898\u5206\u89e3\u4e3a\u591a\u4e2a\u5b50\u95ee\u9898\u3001\u89e3\u51b3\u5b50\u95ee\u9898\u3001\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u5408\u5e76\u4e3a\u539f\u95ee\u9898\u7684\u89e3\uff0c\u8fd9\u51e0\u6b65\u7684\u6548\u7387\u4e3a\u4ec0\u4e48\u6bd4\u76f4\u63a5\u89e3\u51b3\u539f\u95ee\u9898\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u8fd9\u4e2a\u95ee\u9898\u53ef\u4ee5\u4ece\u64cd\u4f5c\u6570\u91cf\u548c\u5e76\u884c\u8ba1\u7b97\u4e24\u65b9\u9762\u6765\u8ba8\u8bba\u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6570\u91cf\u4f18\u5316","text":"

\u4ee5\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u4e3a\u4f8b\uff0c\u5176\u5904\u7406\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u9700\u8981 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5047\u8bbe\u6211\u4eec\u6309\u7167\u56fe 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u5219\u5212\u5206\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6bcf\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O((n / 2)^2)\\) \u65f6\u95f4\uff0c\u5408\u5e76\u4e24\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

\\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

\u56fe 12-2 \u00a0 \u5212\u5206\u6570\u7ec4\u524d\u540e\u7684\u5192\u6ce1\u6392\u5e8f

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8ba1\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u8fb9\u548c\u53f3\u8fb9\u5206\u522b\u4e3a\u5212\u5206\u524d\u548c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u603b\u6570\uff1a

\\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

\u8fd9\u610f\u5473\u7740\u5f53 \\(n > 4\\) \u65f6\uff0c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u6570\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u5e94\u8be5\u66f4\u9ad8\u3002\u8bf7\u6ce8\u610f\uff0c\u5212\u5206\u540e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u9636 \\(O(n^2)\\) \uff0c\u53ea\u662f\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\u4e86\u3002

\u8fdb\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u4eec\u628a\u5b50\u6570\u7ec4\u4e0d\u65ad\u5730\u518d\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u505c\u6b62\u5212\u5206\u5462\uff1f\u8fd9\u79cd\u601d\u8def\u5b9e\u9645\u4e0a\u5c31\u662f\u201c\u5f52\u5e76\u6392\u5e8f\u201d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u4eec\u591a\u8bbe\u7f6e\u51e0\u4e2a\u5212\u5206\u70b9\uff0c\u5c06\u539f\u6570\u7ec4\u5e73\u5747\u5212\u5206\u4e3a \\(k\\) \u4e2a\u5b50\u6570\u7ec4\u5462\uff1f\u8fd9\u79cd\u60c5\u51b5\u4e0e\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u7c7b\u4f3c\uff0c\u5b83\u975e\u5e38\u9002\u5408\u6392\u5e8f\u6d77\u91cf\u6570\u636e\uff0c\u7406\u8bba\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230 \\(O(n + k)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e76\u884c\u8ba1\u7b97\u4f18\u5316","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u5e76\u884c\u89e3\u51b3\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8fd8\u6709\u5229\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002

\u5e76\u884c\u4f18\u5316\u5728\u591a\u6838\u6216\u591a\u5904\u7406\u5668\u7684\u73af\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u4e3a\u7cfb\u7edf\u53ef\u4ee5\u540c\u65f6\u5904\u7406\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8ba1\u7b97\u8d44\u6e90\uff0c\u4ece\u800c\u663e\u8457\u51cf\u5c11\u603b\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u3002

\u6bd4\u5982\u5728\u56fe 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u4eec\u5c06\u6d77\u91cf\u7684\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u5219\u53ef\u5c06\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52a1\u5206\u6563\u5230\u5404\u4e2a\u8ba1\u7b97\u5355\u5143\uff0c\u5b8c\u6210\u540e\u518d\u5408\u5e76\u7ed3\u679c\u3002

\u56fe 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e76\u884c\u8ba1\u7b97

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u89c1\u5e94\u7528","text":"

\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u6765\u89e3\u51b3\u8bb8\u591a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\u3002

  • \u5bfb\u627e\u6700\u8fd1\u70b9\u5bf9\uff1a\u8be5\u7b97\u6cd5\u9996\u5148\u5c06\u70b9\u96c6\u5206\u6210\u4e24\u90e8\u5206\uff0c\u7136\u540e\u5206\u522b\u627e\u51fa\u4e24\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u70b9\u5bf9\uff0c\u6700\u540e\u627e\u51fa\u8de8\u8d8a\u4e24\u90e8\u5206\u7684\u6700\u8fd1\u70b9\u5bf9\u3002
  • \u5927\u6574\u6570\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u6574\u6570\u4e58\u6cd5\u5206\u89e3\u4e3a\u51e0\u4e2a\u8f83\u5c0f\u7684\u6574\u6570\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u77e9\u9635\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u77e9\u9635\u4e58\u6cd5\u5206\u89e3\u4e3a\u591a\u4e2a\u5c0f\u77e9\u9635\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u6c49\u8bfa\u5854\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u89e3\u51b3\uff0c\u8fd9\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u5e94\u7528\u3002
  • \u6c42\u89e3\u9006\u5e8f\u5bf9\uff1a\u5728\u4e00\u4e2a\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6570\u5b57\u5927\u4e8e\u540e\u9762\u7684\u6570\u5b57\uff0c\u90a3\u4e48\u8fd9\u4e24\u4e2a\u6570\u5b57\u6784\u6210\u4e00\u4e2a\u9006\u5e8f\u5bf9\u3002\u6c42\u89e3\u9006\u5e8f\u5bf9\u95ee\u9898\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u501f\u52a9\u5f52\u5e76\u6392\u5e8f\u8fdb\u884c\u6c42\u89e3\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u4e2d\u5e94\u7528\u5f97\u975e\u5e38\u5e7f\u6cdb\u3002

  • \u4e8c\u5206\u67e5\u627e\uff1a\u4e8c\u5206\u67e5\u627e\u662f\u5c06\u6709\u5e8f\u6570\u7ec4\u4ece\u4e2d\u70b9\u7d22\u5f15\u5904\u5206\u4e3a\u4e24\u90e8\u5206\uff0c\u7136\u540e\u6839\u636e\u76ee\u6807\u503c\u4e0e\u4e2d\u95f4\u5143\u7d20\u503c\u6bd4\u8f83\u7ed3\u679c\uff0c\u51b3\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u533a\u95f4\uff0c\u5e76\u5728\u5269\u4f59\u533a\u95f4\u6267\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
  • \u5f52\u5e76\u6392\u5e8f\uff1a\u672c\u8282\u5f00\u5934\u5df2\u4ecb\u7ecd\uff0c\u4e0d\u518d\u8d58\u8ff0\u3002
  • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9009\u53d6\u4e00\u4e2a\u57fa\u51c6\u503c\uff0c\u7136\u540e\u628a\u6570\u7ec4\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5927\uff0c\u518d\u5bf9\u8fd9\u4e24\u90e8\u5206\u8fdb\u884c\u76f8\u540c\u7684\u5212\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e0b\u4e00\u4e2a\u5143\u7d20\u3002
  • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c06\u6570\u636e\u5206\u6563\u5230\u591a\u4e2a\u6876\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u5404\u4e2a\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002
  • \u6811\uff1a\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u7ea2\u9ed1\u6811\u3001B \u6811\u3001B+ \u6811\u7b49\uff0c\u5b83\u4eec\u7684\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u89c6\u4e3a\u5206\u6cbb\u7b56\u7565\u7684\u5e94\u7528\u3002
  • \u5806\uff1a\u5806\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u5176\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u5220\u9664\u548c\u5806\u5316\uff0c\u5b9e\u9645\u4e0a\u90fd\u9690\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
  • \u54c8\u5e0c\u8868\uff1a\u867d\u7136\u54c8\u5e0c\u8868\u5e76\u4e0d\u76f4\u63a5\u5e94\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u54c8\u5e0c\u51b2\u7a81\u89e3\u51b3\u65b9\u6848\u95f4\u63a5\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u94fe\u5f0f\u5730\u5740\u4e2d\u7684\u957f\u94fe\u8868\u4f1a\u88ab\u8f6c\u5316\u4e3a\u7ea2\u9ed1\u6811\uff0c\u4ee5\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002

\u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u79cd\u201c\u6da6\u7269\u7ec6\u65e0\u58f0\u201d\u7684\u7b97\u6cd5\u601d\u60f3\uff0c\u9690\u542b\u5728\u5404\u79cd\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u4e2d\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898","text":"

\u5728\u5f52\u5e76\u6392\u5e8f\u548c\u6784\u5efa\u4e8c\u53c9\u6811\u4e2d\uff0c\u6211\u4eec\u90fd\u662f\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a\u539f\u95ee\u9898\u4e00\u534a\u7684\u5b50\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u6c49\u8bfa\u5854\u95ee\u9898\uff0c\u6211\u4eec\u91c7\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

Question

\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8bb0\u4e3a A\u3001B \u548c C \u3002\u8d77\u59cb\u72b6\u6001\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u7740 \\(n\\) \u4e2a\u5706\u76d8\uff0c\u5b83\u4eec\u4ece\u4e0a\u5230\u4e0b\u6309\u7167\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6211\u4eec\u7684\u4efb\u52a1\u662f\u8981\u628a\u8fd9 \\(n\\) \u4e2a\u5706\u76d8\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u5e76\u4fdd\u6301\u5b83\u4eec\u7684\u539f\u6709\u987a\u5e8f\u4e0d\u53d8\uff08\u5982\u56fe 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52a8\u5706\u76d8\u7684\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u89c4\u5219\u3002

  1. \u5706\u76d8\u53ea\u80fd\u4ece\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u62ff\u51fa\uff0c\u4ece\u53e6\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u653e\u5165\u3002
  2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\u3002
  3. \u5c0f\u5706\u76d8\u5fc5\u987b\u65f6\u523b\u4f4d\u4e8e\u5927\u5706\u76d8\u4e4b\u4e0a\u3002

\u56fe 12-10 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u793a\u4f8b

\u6211\u4eec\u5c06\u89c4\u6a21\u4e3a \\(i\\) \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u8bb0\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c06 \\(3\\) \u4e2a\u5706\u76d8\u4ece A \u79fb\u52a8\u81f3 C \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u8651\u57fa\u672c\u60c5\u51b5","text":"

\u5982\u56fe 12-11 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(1)\\) \uff0c\u5373\u5f53\u53ea\u6709\u4e00\u4e2a\u5706\u76d8\u65f6\uff0c\u6211\u4eec\u5c06\u5b83\u76f4\u63a5\u4ece A \u79fb\u52a8\u81f3 C \u5373\u53ef\u3002

<1><2>

\u56fe 12-11 \u00a0 \u89c4\u6a21\u4e3a 1 \u7684\u95ee\u9898\u7684\u89e3

\u5982\u56fe 12-12 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(2)\\) \uff0c\u5373\u5f53\u6709\u4e24\u4e2a\u5706\u76d8\u65f6\uff0c\u7531\u4e8e\u8981\u65f6\u523b\u6ee1\u8db3\u5c0f\u5706\u76d8\u5728\u5927\u5706\u76d8\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u501f\u52a9 B \u6765\u5b8c\u6210\u79fb\u52a8\u3002

  1. \u5148\u5c06\u4e0a\u9762\u7684\u5c0f\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
  2. \u518d\u5c06\u5927\u5706\u76d8\u4ece A \u79fb\u81f3 C \u3002
  3. \u6700\u540e\u5c06\u5c0f\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u56fe 12-12 \u00a0 \u89c4\u6a21\u4e3a 2 \u7684\u95ee\u9898\u7684\u89e3

\u89e3\u51b3\u95ee\u9898 \\(f(2)\\) \u7684\u8fc7\u7a0b\u53ef\u603b\u7ed3\u4e3a\uff1a\u5c06\u4e24\u4e2a\u5706\u76d8\u501f\u52a9 B \u4ece A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u79f0\u4e3a\u76ee\u6807\u67f1\u3001B \u79f0\u4e3a\u7f13\u51b2\u67f1\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u95ee\u9898\u5206\u89e3","text":"

\u5bf9\u4e8e\u95ee\u9898 \\(f(3)\\) \uff0c\u5373\u5f53\u6709\u4e09\u4e2a\u5706\u76d8\u65f6\uff0c\u60c5\u51b5\u53d8\u5f97\u7a0d\u5fae\u590d\u6742\u4e86\u4e00\u4e9b\u3002

\u56e0\u4e3a\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ece\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c06 A \u9876\u90e8\u7684\u4e24\u4e2a\u5706\u76d8\u770b\u4f5c\u4e00\u4e2a\u6574\u4f53\uff0c\u6267\u884c\u56fe 12-13 \u6240\u793a\u7684\u6b65\u9aa4\u3002\u8fd9\u6837\u4e09\u4e2a\u5706\u76d8\u5c31\u88ab\u987a\u5229\u5730\u4ece A \u79fb\u81f3 C \u4e86\u3002

  1. \u4ee4 B \u4e3a\u76ee\u6807\u67f1\u3001C \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
  2. \u5c06 A \u4e2d\u5269\u4f59\u7684\u4e00\u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u52a8\u81f3 C \u3002
  3. \u4ee4 C \u4e3a\u76ee\u6807\u67f1\u3001A \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u56fe 12-13 \u00a0 \u89c4\u6a21\u4e3a 3 \u7684\u95ee\u9898\u7684\u89e3

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u5c06\u95ee\u9898 \\(f(3)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(2)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u4e4b\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002\u8fd9\u8bf4\u660e\u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u5e76\u3002

\u81f3\u6b64\uff0c\u6211\u4eec\u53ef\u603b\u7ed3\u51fa\u56fe 12-14 \u6240\u793a\u7684\u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c06\u539f\u95ee\u9898 \\(f(n)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \uff0c\u5e76\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u3002

  1. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 C \u4ece A \u79fb\u81f3 B \u3002
  2. \u5c06\u5269\u4f59 \\(1\\) \u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u81f3 C \u3002
  3. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 A \u4ece B \u79fb\u81f3 C \u3002

\u5bf9\u4e8e\u8fd9\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u901a\u8fc7\u76f8\u540c\u7684\u65b9\u5f0f\u8fdb\u884c\u9012\u5f52\u5212\u5206\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52a8\u64cd\u4f5c\u5373\u53ef\u3002

\u56fe 12-14 \u00a0 \u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c06\u67f1 src \u9876\u90e8\u7684 \\(i\\) \u4e2a\u5706\u76d8\u501f\u52a9\u7f13\u51b2\u67f1 buf \u79fb\u52a8\u81f3\u76ee\u6807\u67f1 tar \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\"\"\"\n    # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan = src.pop()\n    # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898\"\"\"\n    n = len(A)\n    # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
hanota.cpp
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src.back();\n    src.pop_back();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.java
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.cs
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
hanota.go
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src, tar *list.List) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan := src.Back()\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9876\u90e8\u5706\u76d8\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
hanota.swift
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.popLast()!\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u5217\u8868\u5c3e\u90e8\u662f\u67f1\u5b50\u9876\u90e8\n    // \u5c06 src \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
hanota.js
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src, tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.ts
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src: number[], tar: number[]): void {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.dart
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<int> src, List<int> tar) {\n  // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  int pan = src.removeLast();\n  // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
hanota.rs
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.remove(src.len() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.c
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
hanota.kt
/* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    val pan = src.removeAt(src.size - 1)\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
hanota.rb
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
hanota.zig
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 12-15 \u6240\u793a\uff0c\u6c49\u8bfa\u5854\u95ee\u9898\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5bf9\u5e94\u4e00\u4e2a\u5f00\u542f\u7684 dfs() \u51fd\u6570\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u56fe 12-15 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u7684\u9012\u5f52\u6811

Quote

\u6c49\u8bfa\u5854\u95ee\u9898\u6e90\u81ea\u4e00\u4e2a\u53e4\u8001\u7684\u4f20\u8bf4\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u4e2a\u5bfa\u5e99\u91cc\uff0c\u50e7\u4fa3\u4eec\u6709\u4e09\u6839\u9ad8\u5927\u7684\u94bb\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u4e2a\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5706\u76d8\u3002\u50e7\u4fa3\u4eec\u4e0d\u65ad\u5730\u79fb\u52a8\u5706\u76d8\uff0c\u4ed6\u4eec\u76f8\u4fe1\u5728\u6700\u540e\u4e00\u4e2a\u5706\u76d8\u88ab\u6b63\u786e\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u8fd9\u4e2a\u4e16\u754c\u5c31\u4f1a\u7ed3\u675f\u3002

\u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fa3\u4eec\u6bcf\u79d2\u949f\u79fb\u52a8\u4e00\u6b21\uff0c\u603b\u5171\u9700\u8981\u5927\u7ea6 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7ea6 \\(5850\\) \u4ebf\u5e74\uff0c\u8fdc\u8fdc\u8d85\u8fc7\u4e86\u73b0\u5728\u5bf9\u5b87\u5b99\u5e74\u9f84\u7684\u4f30\u8ba1\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u8fd9\u4e2a\u4f20\u8bf4\u662f\u771f\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u4e0d\u9700\u8981\u62c5\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u6765\u3002

"},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7ed3","text":"
  • \u5206\u6cbb\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u7b97\u6cd5\u8bbe\u8ba1\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5212\u5206\uff09\u548c\u6cbb\uff08\u5408\u5e76\uff09\u4e24\u4e2a\u9636\u6bb5\uff0c\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002
  • \u5224\u65ad\u662f\u5426\u662f\u5206\u6cbb\u7b97\u6cd5\u95ee\u9898\u7684\u4f9d\u636e\u5305\u62ec\uff1a\u95ee\u9898\u80fd\u5426\u5206\u89e3\u3001\u5b50\u95ee\u9898\u662f\u5426\u72ec\u7acb\u3001\u5b50\u95ee\u9898\u80fd\u5426\u5408\u5e76\u3002
  • \u5f52\u5e76\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\uff0c\u5176\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u7b49\u957f\u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u5f00\u59cb\u9010\u5c42\u5408\u5e76\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002
  • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u51cf\u5c11\u4e86\u64cd\u4f5c\u6570\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u540e\u6709\u5229\u4e8e\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002
  • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u51b3\u8bb8\u591a\u7b97\u6cd5\u95ee\u9898\uff0c\u4e5f\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u5904\u5904\u53ef\u89c1\u5176\u8eab\u5f71\u3002
  • \u76f8\u8f83\u4e8e\u66b4\u529b\u641c\u7d22\uff0c\u81ea\u9002\u5e94\u641c\u7d22\u6548\u7387\u66f4\u9ad8\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\u3002
  • \u4e8c\u5206\u67e5\u627e\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u4e2a\u5178\u578b\u5e94\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u7684\u6b65\u9aa4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\u3002
  • \u5728\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u95ee\u9898\u4e2d\uff0c\u6784\u5efa\u6811\uff08\u539f\u95ee\u9898\uff09\u53ef\u4ee5\u5212\u5206\u4e3a\u6784\u5efa\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5212\u5206\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u7684\u7d22\u5f15\u533a\u95f4\u6765\u5b9e\u73b0\u3002
  • \u5728\u6c49\u8bfa\u5854\u95ee\u9898\u4e2d\uff0c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(n\\) \u7684\u95ee\u9898\u53ef\u4ee5\u5212\u5206\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a \\(n-1\\) \u7684\u5b50\u95ee\u9898\u548c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(1\\) \u7684\u5b50\u95ee\u9898\u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002
"},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52a8\u6001\u89c4\u5212","text":"

Abstract

\u5c0f\u6eaa\u6c47\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u6c47\u5165\u5927\u6d77\u3002

\u52a8\u6001\u89c4\u5212\u5c06\u5c0f\u95ee\u9898\u7684\u89e3\u6c47\u96c6\u6210\u5927\u95ee\u9898\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9886\u6211\u4eec\u8d70\u5411\u89e3\u51b3\u95ee\u9898\u7684\u5f7c\u5cb8\u3002

"},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212
  • 14.2 \u00a0 DP \u95ee\u9898\u7279\u6027
  • 14.3 \u00a0 DP \u89e3\u9898\u601d\u8def
  • 14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898
  • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898
  • 14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898
  • 14.7 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52a8\u6001\u89c4\u5212\u95ee\u9898\u7279\u6027","text":"

\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u52a8\u6001\u89c4\u5212\u662f\u5982\u4f55\u901a\u8fc7\u5b50\u95ee\u9898\u5206\u89e3\u6765\u6c42\u89e3\u539f\u95ee\u9898\u7684\u3002\u5b9e\u9645\u4e0a\uff0c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u7684\u4fa7\u91cd\u70b9\u4e0d\u540c\u3002

  • \u5206\u6cbb\u7b97\u6cd5\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u591a\u4e2a\u76f8\u4e92\u72ec\u7acb\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u95ee\u9898\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6700\u7ec8\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
  • \u52a8\u6001\u89c4\u5212\u4e5f\u5bf9\u95ee\u9898\u8fdb\u884c\u9012\u5f52\u5206\u89e3\uff0c\u4f46\u4e0e\u5206\u6cbb\u7b97\u6cd5\u7684\u4e3b\u8981\u533a\u522b\u662f\uff0c\u52a8\u6001\u89c4\u5212\u4e2d\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u4f9d\u8d56\u7684\uff0c\u5728\u5206\u89e3\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0\u8bb8\u591a\u91cd\u53e0\u5b50\u95ee\u9898\u3002
  • \u56de\u6eaf\u7b97\u6cd5\u5728\u5c1d\u8bd5\u548c\u56de\u9000\u4e2d\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u5e76\u901a\u8fc7\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\u3002\u539f\u95ee\u9898\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\u6784\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6bcf\u4e2a\u51b3\u7b56\u6b65\u9aa4\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u4e2a\u5b50\u95ee\u9898\u3002

\u5b9e\u9645\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u5e38\u7528\u6765\u6c42\u89e3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5b83\u4eec\u4e0d\u4ec5\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u8fd8\u5177\u6709\u53e6\u5916\u4e24\u5927\u7279\u6027\uff1a\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784","text":"

\u6211\u4eec\u5bf9\u722c\u697c\u68af\u95ee\u9898\u7a0d\u4f5c\u6539\u52a8\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9002\u5408\u5c55\u793a\u6700\u4f18\u5b50\u7ed3\u6784\u6982\u5ff5\u3002

\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7

\u7ed9\u5b9a\u4e00\u4e2a\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u6bcf\u4e00\u9636\u697c\u68af\u4e0a\u90fd\u8d34\u6709\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u4f60\u5728\u8be5\u53f0\u9636\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\u3002\u7ed9\u5b9a\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\u6570\u7ec4 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u4e2a\u53f0\u9636\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\\(cost[0]\\) \u4e3a\u5730\u9762\uff08\u8d77\u59cb\u70b9\uff09\u3002\u8bf7\u8ba1\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u4ef7\u624d\u80fd\u5230\u8fbe\u9876\u90e8\uff1f

\u5982\u56fe 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9636\u7684\u4ee3\u4ef7\u5206\u522b\u4e3a \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5219\u4ece\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7\u4e3a \\(2\\) \u3002

\u56fe 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7

\u8bbe \\(dp[i]\\) \u4e3a\u722c\u5230\u7b2c \\(i\\) \u9636\u7d2f\u8ba1\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\u7531\u4e8e\u7b2c \\(i\\) \u9636\u53ea\u53ef\u80fd\u4ece \\(i - 1\\) \u9636\u6216 \\(i - 2\\) \u9636\u8d70\u6765\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u4e8e \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u4e3a\u4e86\u5c3d\u53ef\u80fd\u51cf\u5c11\u4ee3\u4ef7\uff0c\u6211\u4eec\u5e94\u8be5\u9009\u62e9\u4e24\u8005\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\uff1a

\\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

\u8fd9\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u542b\u4e49\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u662f\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\u7684\u3002

\u672c\u9898\u663e\u7136\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6211\u4eec\u4ece\u4e24\u4e2a\u5b50\u95ee\u9898\u6700\u4f18\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9009\u51fa\u8f83\u4f18\u7684\u90a3\u4e00\u4e2a\uff0c\u5e76\u7528\u5b83\u6784\u5efa\u51fa\u539f\u95ee\u9898 \\(dp[i]\\) \u7684\u6700\u4f18\u89e3\u3002

\u90a3\u4e48\uff0c\u4e0a\u4e00\u8282\u7684\u722c\u697c\u68af\u9898\u76ee\u6709\u6ca1\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u5462\uff1f\u5b83\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u4e2a\u8ba1\u6570\u95ee\u9898\uff0c\u4f46\u5982\u679c\u6362\u4e00\u79cd\u95ee\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6570\u91cf\u201d\u3002\u6211\u4eec\u610f\u5916\u5730\u53d1\u73b0\uff0c\u867d\u7136\u9898\u76ee\u4fee\u6539\u524d\u540e\u662f\u7b49\u4ef7\u7684\uff0c\u4f46\u6700\u4f18\u5b50\u7ed3\u6784\u6d6e\u73b0\u51fa\u6765\u4e86\uff1a\u7b2c \\(n\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u7b49\u4e8e\u7b2c \\(n-1\\) \u9636\u548c\u7b2c \\(n-2\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8bf4\uff0c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u89e3\u91ca\u65b9\u5f0f\u6bd4\u8f83\u7075\u6d3b\uff0c\u5728\u4e0d\u540c\u95ee\u9898\u4e2d\u4f1a\u6709\u4e0d\u540c\u7684\u542b\u4e49\u3002

\u6839\u636e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72b6\u6001 \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f97\u5230\u52a8\u6001\u89c4\u5212\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\u3002

\u56fe 14-7 \u00a0 \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u672c\u9898\u4e5f\u53ef\u4ee5\u8fdb\u884c\u7a7a\u95f4\u4f18\u5316\uff0c\u5c06\u4e00\u7ef4\u538b\u7f29\u81f3\u96f6\u7ef4\uff0c\u4f7f\u5f97\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u65e0\u540e\u6548\u6027","text":"

\u65e0\u540e\u6548\u6027\u662f\u52a8\u6001\u89c4\u5212\u80fd\u591f\u6709\u6548\u89e3\u51b3\u95ee\u9898\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u4e49\u4e3a\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u786e\u5b9a\u7684\u72b6\u6001\uff0c\u5b83\u7684\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u5f53\u524d\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002

\u4ee5\u722c\u697c\u68af\u95ee\u9898\u4e3a\u4f8b\uff0c\u7ed9\u5b9a\u72b6\u6001 \\(i\\) \uff0c\u5b83\u4f1a\u53d1\u5c55\u51fa\u72b6\u6001 \\(i+1\\) \u548c\u72b6\u6001 \\(i+2\\) \uff0c\u5206\u522b\u5bf9\u5e94\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u8fd9\u4e24\u79cd\u9009\u62e9\u65f6\uff0c\u6211\u4eec\u65e0\u987b\u8003\u8651\u72b6\u6001 \\(i\\) \u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5b83\u4eec\u5bf9\u72b6\u6001 \\(i\\) \u7684\u672a\u6765\u6ca1\u6709\u5f71\u54cd\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u7ed9\u722c\u697c\u68af\u95ee\u9898\u6dfb\u52a0\u4e00\u4e2a\u7ea6\u675f\uff0c\u60c5\u51b5\u5c31\u4e0d\u4e00\u6837\u4e86\u3002

\u5e26\u7ea6\u675f\u722c\u697c\u68af

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u4f46\u4e0d\u80fd\u8fde\u7eed\u4e24\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5982\u56fe 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u9636\u4ec5\u5269 \\(2\\) \u79cd\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u8fde\u7eed\u4e09\u6b21\u8df3 \\(1\\) \u9636\u7684\u65b9\u6848\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\uff0c\u56e0\u6b64\u88ab\u820d\u5f03\u3002

\u56fe 14-8 \u00a0 \u5e26\u7ea6\u675f\u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

\u5728\u8be5\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\uff0c\u90a3\u4e48\u4e0b\u4e00\u8f6e\u5c31\u5fc5\u987b\u8df3 \\(2\\) \u9636\u3002\u8fd9\u610f\u5473\u7740\uff0c\u4e0b\u4e00\u6b65\u9009\u62e9\u4e0d\u80fd\u7531\u5f53\u524d\u72b6\u6001\uff08\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u72ec\u7acb\u51b3\u5b9a\uff0c\u8fd8\u548c\u524d\u4e00\u4e2a\u72b6\u6001\uff08\u4e0a\u4e00\u8f6e\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u6709\u5173\u3002

\u4e0d\u96be\u53d1\u73b0\uff0c\u6b64\u95ee\u9898\u5df2\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u4e3a \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8bb8\u591a\u201c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\u201d\u65b9\u6848\uff0c\u800c\u4e3a\u4e86\u6ee1\u8db3\u7ea6\u675f\uff0c\u6211\u4eec\u5c31\u4e0d\u80fd\u5c06 \\(dp[i-1]\\) \u76f4\u63a5\u8ba1\u5165 \\(dp[i]\\) \u4e2d\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff1a\u72b6\u6001 \\([i, j]\\) \u8868\u793a\u5904\u5728\u7b2c \\(i\\) \u9636\u5e76\u4e14\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(j\\) \u9636\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72b6\u6001\u5b9a\u4e49\u6709\u6548\u5730\u533a\u5206\u4e86\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u8fd8\u662f \\(2\\) \u9636\uff0c\u6211\u4eec\u53ef\u4ee5\u636e\u6b64\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u4ece\u4f55\u800c\u6765\u7684\u3002

  • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ea\u80fd\u9009\u62e9\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u4ece \\(dp[i-1, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002
  • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(2\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ef\u9009\u62e9\u8df3 \\(1\\) \u9636\u6216\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u4ece \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002

\u5982\u56fe 14-9 \u6240\u793a\uff0c\u5728\u8be5\u5b9a\u4e49\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u65b9\u6848\u6570\u3002\u6b64\u65f6\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

\u56fe 14-9 \u00a0 \u8003\u8651\u7ea6\u675f\u4e0b\u7684\u9012\u63a8\u5173\u7cfb

\u6700\u7ec8\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u4e24\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u9636\u7684\u65b9\u6848\u603b\u6570\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
climbing_stairs_constraint_dp.cpp
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.java
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.cs
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
climbing_stairs_constraint_dp.go
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.swift
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.js
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.ts
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.dart
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.rs
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.c
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
climbing_stairs_constraint_dp.kt
/* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.rb
[class]{}-[func]{climbing_stairs_constraint_dp}\n
climbing_stairs_constraint_dp.zig
// \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u4e8e\u4ec5\u9700\u591a\u8003\u8651\u524d\u9762\u4e00\u4e2a\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff0c\u4f7f\u5f97\u95ee\u9898\u91cd\u65b0\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u95ee\u9898\u5177\u6709\u975e\u5e38\u4e25\u91cd\u7684\u201c\u6709\u540e\u6548\u6027\u201d\u3002

\u722c\u697c\u68af\u4e0e\u969c\u788d\u751f\u6210

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\u3002\u89c4\u5b9a\u5f53\u722c\u5230\u7b2c \\(i\\) \u9636\u65f6\uff0c\u7cfb\u7edf\u81ea\u52a8\u4f1a\u5728\u7b2c \\(2i\\) \u9636\u4e0a\u653e\u4e0a\u969c\u788d\u7269\uff0c\u4e4b\u540e\u6240\u6709\u8f6e\u90fd\u4e0d\u5141\u8bb8\u8df3\u5230\u7b2c \\(2i\\) \u9636\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u4e24\u8f6e\u5206\u522b\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u9636\u4e0a\uff0c\u5219\u4e4b\u540e\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u9636\u4e0a\u3002\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5728\u8fd9\u4e2a\u95ee\u9898\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8dc3\u4f9d\u8d56\u8fc7\u53bb\u6240\u6709\u7684\u72b6\u6001\uff0c\u56e0\u4e3a\u6bcf\u4e00\u6b21\u8df3\u8dc3\u90fd\u4f1a\u5728\u66f4\u9ad8\u7684\u9636\u68af\u4e0a\u8bbe\u7f6e\u969c\u788d\uff0c\u5e76\u5f71\u54cd\u672a\u6765\u7684\u8df3\u8dc3\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u52a8\u6001\u89c4\u5212\u5f80\u5f80\u96be\u4ee5\u89e3\u51b3\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u590d\u6742\u7684\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff08\u4f8b\u5982\u65c5\u884c\u5546\u95ee\u9898\uff09\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u542f\u53d1\u5f0f\u641c\u7d22\u3001\u9057\u4f20\u7b97\u6cd5\u3001\u5f3a\u5316\u5b66\u4e60\u7b49\uff0c\u4ece\u800c\u5728\u6709\u9650\u65f6\u95f4\u5185\u5f97\u5230\u53ef\u7528\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52a8\u6001\u89c4\u5212\u89e3\u9898\u601d\u8def","text":"

\u4e0a\u4e24\u8282\u4ecb\u7ecd\u4e86\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4e3b\u8981\u7279\u5f81\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u4e00\u8d77\u63a2\u7a76\u4e24\u4e2a\u66f4\u52a0\u5b9e\u7528\u7684\u95ee\u9898\u3002

  1. \u5982\u4f55\u5224\u65ad\u4e00\u4e2a\u95ee\u9898\u662f\u4e0d\u662f\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff1f
  2. \u6c42\u89e3\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8be5\u4ece\u4f55\u5904\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9aa4\u662f\u4ec0\u4e48\uff1f
"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u95ee\u9898\u5224\u65ad","text":"

\u603b\u7684\u6765\u8bf4\uff0c\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u90a3\u4e48\u5b83\u901a\u5e38\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u4eec\u5f88\u96be\u4ece\u95ee\u9898\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u8fd9\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u653e\u5bbd\u6761\u4ef6\uff0c\u5148\u89c2\u5bdf\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7a77\u4e3e\uff09\u89e3\u51b3\u3002

\u9002\u5408\u7528\u56de\u6eaf\u89e3\u51b3\u7684\u95ee\u9898\u901a\u5e38\u6ee1\u8db3\u201c\u51b3\u7b56\u6811\u6a21\u578b\u201d\uff0c\u8fd9\u79cd\u95ee\u9898\u53ef\u4ee5\u4f7f\u7528\u6811\u5f62\u7ed3\u6784\u6765\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\uff0c\u6bcf\u4e00\u6761\u8def\u5f84\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\u3002

\u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u95ee\u9898\u5305\u542b\u660e\u786e\u7684\u51b3\u7b56\u6982\u5ff5\uff0c\u5e76\u4e14\u89e3\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u51b3\u7b56\u4ea7\u751f\u7684\uff0c\u90a3\u4e48\u5b83\u5c31\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u6765\u89e3\u51b3\u3002

\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8fd8\u6709\u4e00\u4e9b\u5224\u65ad\u7684\u201c\u52a0\u5206\u9879\u201d\u3002

  • \u95ee\u9898\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u4f18\u5316\u63cf\u8ff0\u3002
  • \u95ee\u9898\u7684\u72b6\u6001\u80fd\u591f\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u3001\u591a\u7ef4\u77e9\u9635\u6216\u6811\u6765\u8868\u793a\uff0c\u5e76\u4e14\u4e00\u4e2a\u72b6\u6001\u4e0e\u5176\u5468\u56f4\u7684\u72b6\u6001\u5b58\u5728\u9012\u63a8\u5173\u7cfb\u3002

\u76f8\u5e94\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u51cf\u5206\u9879\u201d\u3002

  • \u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u4f18\u89e3\u3002
  • \u95ee\u9898\u63cf\u8ff0\u4e2d\u6709\u660e\u663e\u7684\u6392\u5217\u7ec4\u5408\u7684\u7279\u5f81\uff0c\u9700\u8981\u8fd4\u56de\u5177\u4f53\u7684\u591a\u4e2a\u65b9\u6848\u3002

\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u5e76\u5177\u6709\u8f83\u4e3a\u660e\u663e\u7684\u201c\u52a0\u5206\u9879\u201d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5047\u8bbe\u5b83\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff0c\u5e76\u5728\u6c42\u89e3\u8fc7\u7a0b\u4e2d\u9a8c\u8bc1\u5b83\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u95ee\u9898\u6c42\u89e3\u6b65\u9aa4","text":"

\u52a8\u6001\u89c4\u5212\u7684\u89e3\u9898\u6d41\u7a0b\u4f1a\u56e0\u95ee\u9898\u7684\u6027\u8d28\u548c\u96be\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\u63cf\u8ff0\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5bfc\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u7b49\u3002

\u4e3a\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u9898\u6b65\u9aa4\uff0c\u6211\u4eec\u4f7f\u7528\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\u201c\u6700\u5c0f\u8def\u5f84\u548c\u201d\u6765\u4e3e\u4f8b\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a \\(n \\times m\\) \u7684\u4e8c\u7ef4\u7f51\u683c grid \uff0c\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5305\u542b\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u8be5\u5355\u5143\u683c\u7684\u4ee3\u4ef7\u3002\u673a\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u5355\u5143\u683c\u4e3a\u8d77\u59cb\u70b9\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52a8\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u8fbe\u53f3\u4e0b\u89d2\u5355\u5143\u683c\u3002\u8bf7\u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f84\u548c\u3002

\u56fe 14-10 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u7f51\u683c\u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e3a \\(13\\) \u3002

\u56fe 14-10 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u793a\u4f8b\u6570\u636e

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u672c\u9898\u7684\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u5c31\u662f\u4ece\u5f53\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8bbe\u5f53\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\([i, j]\\) \uff0c\u5219\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u540e\uff0c\u7d22\u5f15\u53d8\u4e3a \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72b6\u6001\u5e94\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u4e24\u4e2a\u53d8\u91cf\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u4ece\u8d77\u59cb\u70b9 \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\uff0c\u89e3\u8bb0\u4e3a \\(dp[i, j]\\) \u3002

\u81f3\u6b64\uff0c\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u56fe 14-11 \u6240\u793a\u7684\u4e8c\u7ef4 \\(dp\\) \u77e9\u9635\uff0c\u5176\u5c3a\u5bf8\u4e0e\u8f93\u5165\u7f51\u683c \\(grid\\) \u76f8\u540c\u3002

\u56fe 14-11 \u00a0 \u72b6\u6001\u5b9a\u4e49\u4e0e dp \u8868

Note

\u52a8\u6001\u89c4\u5212\u548c\u56de\u6eaf\u8fc7\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u4e3a\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\uff0c\u800c\u72b6\u6001\u7531\u6240\u6709\u51b3\u7b56\u53d8\u91cf\u6784\u6210\u3002\u5b83\u5e94\u5f53\u5305\u542b\u63cf\u8ff0\u89e3\u9898\u8fdb\u5ea6\u7684\u6240\u6709\u53d8\u91cf\uff0c\u5176\u5305\u542b\u4e86\u8db3\u591f\u7684\u4fe1\u606f\uff0c\u80fd\u591f\u7528\u6765\u63a8\u5bfc\u51fa\u4e0b\u4e00\u4e2a\u72b6\u6001\u3002

\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5b9a\u4e49\u4e00\u4e2a \\(dp\\) \u8868\u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u72b6\u6001\u7684\u6bcf\u4e2a\u72ec\u7acb\u53d8\u91cf\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\u3002\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72b6\u6001\u548c\u5b50\u95ee\u9898\u7684\u89e3\u4e4b\u95f4\u7684\u6620\u5c04\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u5bf9\u4e8e\u72b6\u6001 \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u4ece\u4e0a\u8fb9\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u8fb9\u683c\u5b50 \\([i, j-1]\\) \u8f6c\u79fb\u800c\u6765\u3002\u56e0\u6b64\u6700\u4f18\u5b50\u7ed3\u6784\u4e3a\uff1a\u5230\u8fbe \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e0e \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\u51b3\u5b9a\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u56fe 14-12 \u6240\u793a\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

\u56fe 14-12 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

Note

\u6839\u636e\u5b9a\u4e49\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u95ee\u9898\u548c\u5b50\u95ee\u9898\u7684\u5173\u7cfb\uff0c\u627e\u51fa\u901a\u8fc7\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6765\u6784\u9020\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u4f18\u5b50\u7ed3\u6784\u3002

\u4e00\u65e6\u6211\u4eec\u627e\u5230\u4e86\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5728\u672c\u9898\u4e2d\uff0c\u5904\u5728\u9996\u884c\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u5de6\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u5904\u5728\u9996\u5217\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u4e0a\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u8fb9\u754c\u6761\u4ef6\u3002

\u5982\u56fe 14-13 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528\u5faa\u73af\u6765\u904d\u5386\u77e9\u9635\uff0c\u5916\u5faa\u73af\u904d\u5386\u5404\u884c\uff0c\u5185\u5faa\u73af\u904d\u5386\u5404\u5217\u3002

\u56fe 14-13 \u00a0 \u8fb9\u754c\u6761\u4ef6\u4e0e\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

Note

\u8fb9\u754c\u6761\u4ef6\u5728\u52a8\u6001\u89c4\u5212\u4e2d\u7528\u4e8e\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u7d22\u4e2d\u7528\u4e8e\u526a\u679d\u3002

\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8bc1\u5728\u8ba1\u7b97\u5f53\u524d\u95ee\u9898\u7684\u89e3\u65f6\uff0c\u6240\u6709\u5b83\u4f9d\u8d56\u7684\u66f4\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u90fd\u5df2\u7ecf\u88ab\u6b63\u786e\u5730\u8ba1\u7b97\u51fa\u6765\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u5df2\u7ecf\u53ef\u4ee5\u76f4\u63a5\u5199\u51fa\u52a8\u6001\u89c4\u5212\u4ee3\u7801\u3002\u7136\u800c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u7d22 \\(\\rightarrow\\) \u8bb0\u5fc6\u5316\u641c\u7d22 \\(\\rightarrow\\) \u52a8\u6001\u89c4\u5212\u201d\u7684\u987a\u5e8f\u5b9e\u73b0\u66f4\u52a0\u7b26\u5408\u601d\u7ef4\u4e60\u60ef\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u4ece\u72b6\u6001 \\([i, j]\\) \u5f00\u59cb\u641c\u7d22\uff0c\u4e0d\u65ad\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u72b6\u6001 \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u9012\u5f52\u51fd\u6570\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, j]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u4ece \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c \\(dp[i, j]\\) \u3002
  • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53 \\(i = 0\\) \u4e14 \\(j = 0\\) \u65f6\uff0c\u8fd4\u56de\u4ee3\u4ef7 \\(grid[0, 0]\\) \u3002
  • \u526a\u679d\uff1a\u5f53 \\(i < 0\\) \u65f6\u6216 \\(j < 0\\) \u65f6\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u65f6\u8fd4\u56de\u4ee3\u4ef7 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.Min(left, up) + grid[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  return min(left, up) + grid[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-14 \u7ed9\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u4e3a\u6839\u8282\u70b9\u7684\u9012\u5f52\u6811\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5176\u6570\u91cf\u4f1a\u968f\u7740\u7f51\u683c grid \u7684\u5c3a\u5bf8\u53d8\u5927\u800c\u6025\u5267\u589e\u591a\u3002

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u539f\u56e0\u4e3a\uff1a\u5b58\u5728\u591a\u6761\u8def\u5f84\u53ef\u4ee5\u4ece\u5de6\u4e0a\u89d2\u5230\u8fbe\u67d0\u4e00\u5355\u5143\u683c\u3002

\u56fe 14-14 \u00a0 \u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

\u6bcf\u4e2a\u72b6\u6001\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u4e24\u79cd\u9009\u62e9\uff0c\u4ece\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u603b\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^{m + n})\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u79cd\u8ba1\u7b97\u65b9\u5f0f\u672a\u8003\u8651\u4e34\u8fd1\u7f51\u683c\u8fb9\u754c\u7684\u60c5\u51b5\uff0c\u5f53\u5230\u8fbe\u7f51\u7edc\u8fb9\u754c\u65f6\u53ea\u5269\u4e0b\u4e00\u79cd\u9009\u62e9\uff0c\u56e0\u6b64\u5b9e\u9645\u7684\u8def\u5f84\u6570\u91cf\u4f1a\u5c11\u4e00\u4e9b\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u6211\u4eec\u5f15\u5165\u4e00\u4e2a\u548c\u7f51\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8bb0\u5fc6\u5217\u8868 mem \uff0c\u7528\u4e8e\u8bb0\u5f55\u5404\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u8fdb\u884c\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs_mem}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8bb0\u5fc6\u5316\u540e\uff0c\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u72b6\u6001\u603b\u6570\uff0c\u5373\u7f51\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

\u56fe 14-15 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f84\u548c\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\uff0c\u5176\u904d\u5386\u4e86\u6574\u4e2a\u7f51\u683c\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

\u6570\u7ec4 dp \u5927\u5c0f\u4e3a \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u56fe 14-16 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u53ea\u4e0e\u5176\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u683c\u5b50\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u7528\u4e00\u4e2a\u5355\u884c\u6570\u7ec4\u6765\u5b9e\u73b0 \\(dp\\) \u8868\u3002

\u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u6570\u7ec4 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72b6\u6001\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72b6\u6001\uff0c\u800c\u662f\u5728\u904d\u5386\u6bcf\u884c\u65f6\u66f4\u65b0\u5b83\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ..< n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..<n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp_comp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898","text":"

\u7f16\u8f91\u8ddd\u79bb\uff0c\u4e5f\u79f0 Levenshtein \u8ddd\u79bb\uff0c\u6307\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u4e92\u76f8\u8f6c\u6362\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6570\uff0c\u901a\u5e38\u7528\u4e8e\u5728\u4fe1\u606f\u68c0\u7d22\u548c\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e2d\u5ea6\u91cf\u4e24\u4e2a\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

Question

\u8f93\u5165\u4e24\u4e2a\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c06 \\(s\\) \u8f6c\u6362\u4e3a \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

\u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\u8fdb\u884c\u4e09\u79cd\u7f16\u8f91\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u4e2a\u5b57\u7b26\u3001\u5220\u9664\u4e00\u4e2a\u5b57\u7b26\u3001\u5c06\u5b57\u7b26\u66ff\u6362\u4e3a\u4efb\u610f\u4e00\u4e2a\u5b57\u7b26\u3002

\u5982\u56fe 14-27 \u6240\u793a\uff0c\u5c06 kitten \u8f6c\u6362\u4e3a sitting \u9700\u8981\u7f16\u8f91 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u4e0e 1 \u6b21\u6dfb\u52a0\u64cd\u4f5c\uff1b\u5c06 hello \u8f6c\u6362\u4e3a algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u548c 1 \u6b21\u5220\u9664\u64cd\u4f5c\u3002

\u56fe 14-27 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u793a\u4f8b\u6570\u636e

\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u51b3\u7b56\u6811\u6a21\u578b\u6765\u89e3\u91ca\u3002\u5b57\u7b26\u4e32\u5bf9\u5e94\u6811\u8282\u70b9\uff0c\u4e00\u8f6e\u51b3\u7b56\uff08\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\uff09\u5bf9\u5e94\u6811\u7684\u4e00\u6761\u8fb9\u3002

\u5982\u56fe 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u51b5\u4e0b\uff0c\u6bcf\u4e2a\u8282\u70b9\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8bb8\u591a\u6761\u8fb9\uff0c\u6bcf\u6761\u8fb9\u5bf9\u5e94\u4e00\u79cd\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u4ece hello \u8f6c\u6362\u5230 algo \u6709\u8bb8\u591a\u79cd\u53ef\u80fd\u7684\u8def\u5f84\u3002

\u4ece\u51b3\u7b56\u6811\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u8282\u70b9 hello \u548c\u8282\u70b9 algo \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\u3002

\u56fe 14-28 \u00a0 \u57fa\u4e8e\u51b3\u7b56\u6811\u6a21\u578b\u8868\u793a\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u662f\u5bf9\u5b57\u7b26\u4e32 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\u3002

\u6211\u4eec\u5e0c\u671b\u5728\u7f16\u8f91\u64cd\u4f5c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u95ee\u9898\u7684\u89c4\u6a21\u9010\u6e10\u7f29\u5c0f\uff0c\u8fd9\u6837\u624d\u80fd\u6784\u5efa\u5b50\u95ee\u9898\u3002\u8bbe\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \uff0c\u6211\u4eec\u5148\u8003\u8651\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u4eec\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u76f4\u63a5\u8003\u8651 \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u4eec\u9700\u8981\u5bf9 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\uff08\u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\uff09\uff0c\u4f7f\u5f97\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26\u76f8\u540c\uff0c\u4ece\u800c\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u8003\u8651\u89c4\u6a21\u66f4\u5c0f\u7684\u95ee\u9898\u3002

\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u5728\u5b57\u7b26\u4e32 \\(s\\) \u4e2d\u8fdb\u884c\u7684\u6bcf\u4e00\u8f6e\u51b3\u7b56\uff08\u7f16\u8f91\u64cd\u4f5c\uff09\uff0c\u90fd\u4f1a\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u4f59\u7684\u5f85\u5339\u914d\u5b57\u7b26\u53d1\u751f\u53d8\u5316\u3002\u56e0\u6b64\uff0c\u72b6\u6001\u4e3a\u5f53\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u8651\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u4e2a\u5b57\u7b26\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\uff1a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

\u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u8003\u8651\u5b50\u95ee\u9898 \\(dp[i, j]\\) \uff0c\u5176\u5bf9\u5e94\u7684\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5c3e\u90e8\u5b57\u7b26\u4e3a \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u636e\u4e0d\u540c\u7f16\u8f91\u64cd\u4f5c\u5206\u4e3a\u56fe 14-29 \u6240\u793a\u7684\u4e09\u79cd\u60c5\u51b5\u3002

  1. \u5728 \\(s[i-1]\\) \u4e4b\u540e\u6dfb\u52a0 \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i, j-1]\\) \u3002
  2. \u5220\u9664 \\(s[i-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j]\\) \u3002
  3. \u5c06 \\(s[i-1]\\) \u66ff\u6362\u4e3a \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j-1]\\) \u3002

\u56fe 14-29 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u72b6\u6001\u8f6c\u79fb

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7f16\u8f91\u6b65\u6570 \\(1\\) \u3002\u5bf9\u5e94\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

\u8bf7\u6ce8\u610f\uff0c\u5f53 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, j] = dp[i-1, j-1] \\]

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u4e24\u5b57\u7b26\u4e32\u90fd\u4e3a\u7a7a\u65f6\uff0c\u7f16\u8f91\u6b65\u6570\u4e3a \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u5f53 \\(s\\) \u4e3a\u7a7a\u4f46 \\(t\\) \u4e0d\u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(t\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u5f53 \\(s\\) \u4e0d\u4e3a\u7a7a\u4f46 \\(t\\) \u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(s\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

\u89c2\u5bdf\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8d56\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
edit_distance.cpp
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.java
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.cs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
edit_distance.go
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.swift
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.js
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.ts
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.dart
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
edit_distance.rs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
edit_distance.c
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
edit_distance.kt
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp}\n
edit_distance.zig
// \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-30 \u6240\u793a\uff0c\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\u4e0e\u80cc\u5305\u95ee\u9898\u975e\u5e38\u7c7b\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5199\u4e00\u4e2a\u4e8c\u7ef4\u7f51\u683c\u7684\u8fc7\u7a0b\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u56fe 14-30 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f6c\u79fb\u800c\u6765\u7684\uff0c\u800c\u6b63\u5e8f\u904d\u5386\u4f1a\u4e22\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u904d\u5386\u65e0\u6cd5\u63d0\u524d\u6784\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u4e24\u79cd\u904d\u5386\u987a\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf leftup \u6765\u6682\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u4ece\u800c\u53ea\u9700\u8003\u8651\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u65f6\u7684\u60c5\u51b5\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u904d\u5386\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n + 1):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u6682\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    return dp[m]\n
edit_distance.cpp
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.java
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.cs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.go
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i := 1; i <= n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.swift
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ... n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.js
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.ts
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.dart
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
edit_distance.rs
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..=n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
edit_distance.c
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
edit_distance.kt
/* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp_comp}\n
edit_distance.zig
// \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n + 1) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212","text":"

\u52a8\u6001\u89c4\u5212\uff08dynamic programming\uff09\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u7b97\u6cd5\u8303\u5f0f\uff0c\u5b83\u5c06\u4e00\u4e2a\u95ee\u9898\u5206\u89e3\u4e3a\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u907f\u514d\u91cd\u590d\u8ba1\u7b97\uff0c\u4ece\u800c\u5927\u5e45\u63d0\u5347\u65f6\u95f4\u6548\u7387\u3002

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u4ece\u4e00\u4e2a\u7ecf\u5178\u4f8b\u9898\u5165\u624b\uff0c\u5148\u7ed9\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c2\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u518d\u9010\u6b65\u5bfc\u51fa\u66f4\u9ad8\u6548\u7684\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

\u722c\u697c\u68af

\u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

\u5982\u56fe 14-1 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e00\u4e2a \\(3\\) \u9636\u697c\u68af\uff0c\u5171\u6709 \\(3\\) \u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\u3002

\u56fe 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u56de\u6eaf\u6765\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5c06\u722c\u697c\u68af\u60f3\u8c61\u4e3a\u4e00\u4e2a\u591a\u8f6e\u9009\u62e9\u7684\u8fc7\u7a0b\uff1a\u4ece\u5730\u9762\u51fa\u53d1\uff0c\u6bcf\u8f6e\u9009\u62e9\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u6bcf\u5f53\u5230\u8fbe\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u65b9\u6848\u6570\u91cf\u52a0 \\(1\\) \uff0c\u5f53\u8d8a\u8fc7\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u5176\u526a\u679d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    state = 0  # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
climbing_stairs_backtrack.cpp
/* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;                // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.java
/* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.cs
/* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.go
/* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state+choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    choices := []int{1, 2}\n    // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.swift
/* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
climbing_stairs_backtrack.js
/* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.ts
/* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.dart
/* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    if (state + choice > n) continue;\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
climbing_stairs_backtrack.rs
/* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
climbing_stairs_backtrack.c
/* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;           // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
climbing_stairs_backtrack.kt
/* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    val state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
climbing_stairs_backtrack.zig
// \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u697c\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    var state: i32 = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u5e76\u4e0d\u663e\u5f0f\u5730\u5bf9\u95ee\u9898\u8fdb\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c06\u6c42\u89e3\u95ee\u9898\u770b\u4f5c\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\uff0c\u901a\u8fc7\u8bd5\u63a2\u548c\u526a\u679d\uff0c\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

\u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u4ece\u95ee\u9898\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u8fd9\u9053\u9898\u3002\u8bbe\u722c\u5230\u7b2c \\(i\\) \u9636\u5171\u6709 \\(dp[i]\\) \u79cd\u65b9\u6848\uff0c\u90a3\u4e48 \\(dp[i]\\) \u5c31\u662f\u539f\u95ee\u9898\uff0c\u5176\u5b50\u95ee\u9898\u5305\u62ec\uff1a

\\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

\u7531\u4e8e\u6bcf\u8f6e\u53ea\u80fd\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u56e0\u6b64\u5f53\u6211\u4eec\u7ad9\u5728\u7b2c \\(i\\) \u9636\u697c\u68af\u4e0a\u65f6\uff0c\u4e0a\u4e00\u8f6e\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u4e0a\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ea\u80fd\u4ece\u7b2c \\(i -1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u8fc8\u5411\u7b2c \\(i\\) \u9636\u3002

\u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u63a8\u8bba\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u9636\u7684\u65b9\u6848\u6570\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u9636\u7684\u65b9\u6848\u6570\u5c31\u7b49\u4e8e\u722c\u5230\u7b2c \\(i\\) \u9636\u7684\u65b9\u6848\u6570\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

\\[ dp[i] = dp[i-1] + dp[i-2] \\]

\u8fd9\u610f\u5473\u7740\u5728\u722c\u697c\u68af\u95ee\u9898\u4e2d\uff0c\u5404\u4e2a\u5b50\u95ee\u9898\u4e4b\u95f4\u5b58\u5728\u9012\u63a8\u5173\u7cfb\uff0c\u539f\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u95ee\u9898\u7684\u89e3\u6784\u5efa\u5f97\u6765\u3002\u56fe 14-2 \u5c55\u793a\u4e86\u8be5\u9012\u63a8\u5173\u7cfb\u3002

\u56fe 14-2 \u00a0 \u65b9\u6848\u6570\u91cf\u9012\u63a8\u5173\u7cfb

\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9012\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u7d22\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u9012\u5f52\u5730\u5c06\u4e00\u4e2a\u8f83\u5927\u95ee\u9898\u62c6\u89e3\u4e3a\u4e24\u4e2a\u8f83\u5c0f\u95ee\u9898\u7684\u548c\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898 \\(dp[1]\\) \u548c \\(dp[2]\\) \u65f6\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u9636\u5206\u522b\u6709 \\(1\\)\u3001\\(2\\) \u79cd\u65b9\u6848\u3002

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5b83\u548c\u6807\u51c6\u56de\u6eaf\u4ee3\u7801\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u4f46\u66f4\u52a0\u7b80\u6d01\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
def dfs(i: int) -> int:\n    \"\"\"\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u641c\u7d22\"\"\"\n    return dfs(n)\n
climbing_stairs_dfs.cpp
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.java
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.cs
/* \u641c\u7d22 */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
climbing_stairs_dfs.go
/* \u641c\u7d22 */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.swift
/* \u641c\u7d22 */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
climbing_stairs_dfs.js
/* \u641c\u7d22 */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.ts
/* \u641c\u7d22 */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
climbing_stairs_dfs.dart
/* \u641c\u7d22 */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
climbing_stairs_dfs.rs
/* \u641c\u7d22 */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
climbing_stairs_dfs.c
/* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.kt
/* \u641c\u7d22 */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
climbing_stairs_dfs.zig
// \u641c\u7d22\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u641c\u7d22\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u7d22\u5f62\u6210\u7684\u9012\u5f52\u6811\u3002\u5bf9\u4e8e\u95ee\u9898 \\(dp[n]\\) \uff0c\u5176\u9012\u5f52\u6811\u7684\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002\u6307\u6570\u9636\u5c5e\u4e8e\u7206\u70b8\u5f0f\u589e\u957f\uff0c\u5982\u679c\u6211\u4eec\u8f93\u5165\u4e00\u4e2a\u6bd4\u8f83\u5927\u7684 \\(n\\) \uff0c\u5219\u4f1a\u9677\u5165\u6f2b\u957f\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

\u56fe 14-3 \u00a0 \u722c\u697c\u68af\u5bf9\u5e94\u9012\u5f52\u6811

\u89c2\u5bdf\u56fe 14-3 \uff0c\u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u201c\u91cd\u53e0\u5b50\u95ee\u9898\u201d\u5bfc\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u4e24\u8005\u90fd\u5305\u542b\u5b50\u95ee\u9898 \\(dp[7]\\) \u3002

\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5b50\u95ee\u9898\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5b50\u5b50\u5b59\u5b59\u65e0\u7a77\u5c3d\u4e5f\u3002\u7edd\u5927\u90e8\u5206\u8ba1\u7b97\u8d44\u6e90\u90fd\u6d6a\u8d39\u5728\u8fd9\u4e9b\u91cd\u53e0\u7684\u5b50\u95ee\u9898\u4e0a\u3002

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u4e3a\u4e86\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u4eec\u5e0c\u671b\u6240\u6709\u7684\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u6570\u7ec4 mem \u6765\u8bb0\u5f55\u6bcf\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u526a\u679d\u3002

  1. \u5f53\u9996\u6b21\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u5c06\u5176\u8bb0\u5f55\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u540e\u4f7f\u7528\u3002
  2. \u5f53\u518d\u6b21\u9700\u8981\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u4fbf\u53ef\u76f4\u63a5\u4ece mem[i] \u4e2d\u83b7\u53d6\u7ed3\u679c\uff0c\u4ece\u800c\u907f\u514d\u91cd\u590d\u8ba1\u7b97\u8be5\u5b50\u95ee\u9898\u3002

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
climbing_stairs_dfs_mem.cpp
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.java
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.cs
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
climbing_stairs_dfs_mem.go
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
climbing_stairs_dfs_mem.swift
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
climbing_stairs_dfs_mem.js
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.ts
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.dart
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8bb0\u5f55 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.rs
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
climbing_stairs_dfs_mem.c
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
climbing_stairs_dfs_mem.kt
/* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
climbing_stairs_dfs_mem.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
climbing_stairs_dfs_mem.zig
// \u8bb0\u5fc6\u5316\u641c\u7d22\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u56fe 14-4 \uff0c\u7ecf\u8fc7\u8bb0\u5fc6\u5316\u5904\u7406\u540e\uff0c\u6240\u6709\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u8fd9\u662f\u4e00\u4e2a\u5de8\u5927\u7684\u98de\u8dc3\u3002

\u56fe 14-4 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u5bf9\u5e94\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u201c\u4ece\u9876\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u4eec\u4ece\u539f\u95ee\u9898\uff08\u6839\u8282\u70b9\uff09\u5f00\u59cb\uff0c\u9012\u5f52\u5730\u5c06\u8f83\u5927\u5b50\u95ee\u9898\u5206\u89e3\u4e3a\u8f83\u5c0f\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u53f6\u8282\u70b9\uff09\u3002\u4e4b\u540e\uff0c\u901a\u8fc7\u56de\u6eaf\u9010\u5c42\u6536\u96c6\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

\u4e0e\u4e4b\u76f8\u53cd\uff0c\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u201c\u4ece\u5e95\u81f3\u9876\u201d\u7684\u65b9\u6cd5\uff1a\u4ece\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u6784\u5efa\u66f4\u5927\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002

\u7531\u4e8e\u52a8\u6001\u89c4\u5212\u4e0d\u5305\u542b\u56de\u6eaf\u8fc7\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u5faa\u73af\u8fed\u4ee3\u5b9e\u73b0\uff0c\u65e0\u987b\u4f7f\u7528\u9012\u5f52\u3002\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u4e0e\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u6570\u7ec4 mem \u76f8\u540c\u7684\u8bb0\u5f55\u4f5c\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.java
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.cs
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.go
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.swift
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.js
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.ts
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.dart
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
climbing_stairs_dp.rs
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
climbing_stairs_dp.c
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
climbing_stairs_dp.kt
/* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp}\n
climbing_stairs_dp.zig
// \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-5 \u6a21\u62df\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\u3002

\u56fe 14-5 \u00a0 \u722c\u697c\u68af\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u4e0e\u56de\u6eaf\u7b97\u6cd5\u4e00\u6837\uff0c\u52a8\u6001\u89c4\u5212\u4e5f\u4f7f\u7528\u201c\u72b6\u6001\u201d\u6982\u5ff5\u6765\u8868\u793a\u95ee\u9898\u6c42\u89e3\u7684\u7279\u5b9a\u9636\u6bb5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\u4ee5\u53ca\u76f8\u5e94\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u697c\u68af\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570 \\(i\\) \u3002

\u6839\u636e\u4ee5\u4e0a\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u52a8\u6001\u89c4\u5212\u7684\u5e38\u7528\u672f\u8bed\u3002

  • \u5c06\u6570\u7ec4 dp \u79f0\u4e3a dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72b6\u6001 \\(i\\) \u5bf9\u5e94\u5b50\u95ee\u9898\u7684\u89e3\u3002
  • \u5c06\u6700\u5c0f\u5b50\u95ee\u9898\u5bf9\u5e94\u7684\u72b6\u6001\uff08\u7b2c \\(1\\) \u9636\u548c\u7b2c \\(2\\) \u9636\u697c\u68af\uff09\u79f0\u4e3a\u521d\u59cb\u72b6\u6001\u3002
  • \u5c06\u9012\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u79f0\u4e3a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002
"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u7531\u4e8e \\(dp[i]\\) \u53ea\u4e0e \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u987b\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u800c\u53ea\u9700\u4e24\u4e2a\u53d8\u91cf\u6eda\u52a8\u524d\u8fdb\u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
climbing_stairs_dp.cpp
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.java
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.cs
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.go
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
climbing_stairs_dp.swift
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
climbing_stairs_dp.js
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.ts
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.dart
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
climbing_stairs_dp.rs
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
climbing_stairs_dp.c
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.kt
/* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp_comp}\n
climbing_stairs_dp.zig
// \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u7531\u4e8e\u7701\u53bb\u4e86\u6570\u7ec4 dp \u5360\u7528\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

\u5728\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e2d\uff0c\u5f53\u524d\u72b6\u6001\u5f80\u5f80\u4ec5\u4e0e\u524d\u9762\u6709\u9650\u4e2a\u72b6\u6001\u6709\u5173\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72b6\u6001\uff0c\u901a\u8fc7\u201c\u964d\u7ef4\u201d\u6765\u8282\u7701\u5185\u5b58\u7a7a\u95f4\u3002\u8fd9\u79cd\u7a7a\u95f4\u4f18\u5316\u6280\u5de7\u88ab\u79f0\u4e3a\u201c\u6eda\u52a8\u53d8\u91cf\u201d\u6216\u201c\u6eda\u52a8\u6570\u7ec4\u201d\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898","text":"

\u80cc\u5305\u95ee\u9898\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u52a8\u6001\u89c4\u5212\u5165\u95e8\u9898\u76ee\uff0c\u662f\u52a8\u6001\u89c4\u5212\u4e2d\u6700\u5e38\u89c1\u7684\u95ee\u9898\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u95ee\u9898\u3001\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u3001\u591a\u91cd\u80cc\u5305\u95ee\u9898\u7b49\u3002

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6765\u6c42\u89e3\u6700\u5e38\u89c1\u7684 0-1 \u80cc\u5305\u95ee\u9898\u3002

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002

\u89c2\u5bdf\u56fe 14-17 \uff0c\u7531\u4e8e\u7269\u54c1\u7f16\u53f7 \\(i\\) \u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u6570\u7ec4\u7d22\u5f15\u4ece \\(0\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5bf9\u5e94\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u4ef7\u503c \\(val[i-1]\\) \u3002

\u56fe 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u6570\u636e

\u6211\u4eec\u53ef\u4ee5\u5c06 0-1 \u80cc\u5305\u95ee\u9898\u770b\u4f5c\u4e00\u4e2a\u7531 \\(n\\) \u8f6e\u51b3\u7b56\u7ec4\u6210\u7684\u8fc7\u7a0b\uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u4f53\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u4e24\u79cd\u51b3\u7b56\uff0c\u56e0\u6b64\u8be5\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\u3002

\u8be5\u95ee\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u201d\uff0c\u56e0\u6b64\u8f83\u5927\u6982\u7387\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u54c1\u6765\u8bf4\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u51cf\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72b6\u6001\u5b9a\u4e49\uff1a\u5f53\u524d\u7269\u54c1\u7f16\u53f7 \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8bb0\u4e3a \\([i, c]\\) \u3002

\u72b6\u6001 \\([i, c]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\uff0c\u8bb0\u4e3a \\(dp[i, c]\\) \u3002

\u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u5f53\u6211\u4eec\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u51b3\u7b56\u540e\uff0c\u5269\u4f59\u7684\u662f\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u51b3\u7b56\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u51cf\u5c11 \\(wgt[i-1]\\) \uff0c\u4ef7\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c-wgt[i-1]]\\) \u3002

\u4e0a\u8ff0\u5206\u6790\u5411\u6211\u4eec\u63ed\u793a\u4e86\u672c\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6700\u5927\u4ef7\u503c \\(dp[i, c]\\) \u7b49\u4e8e\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\u3002\u7531\u6b64\u53ef\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u4f59\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u65e0\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\u6700\u5927\u4ef7\u503c\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

\u5f53\u524d\u72b6\u6001 \\([i, c]\\) \u4ece\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c-wgt[i-1]]\\) \u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

\u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u6309\u987a\u5e8f\u5b9e\u73b0\u66b4\u529b\u641c\u7d22\u3001\u8bb0\u5fc6\u5316\u641c\u7d22\u3001\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

\u641c\u7d22\u4ee3\u7801\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, c]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5b50\u95ee\u9898\u7684\u89e3 \\(dp[i, c]\\) \u3002
  • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53\u7269\u54c1\u7f16\u53f7\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5e76\u8fd4\u56de\u4ef7\u503c \\(0\\) \u3002
  • \u526a\u679d\uff1a\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes);\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.Max(no, yes);\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return int(math.Max(float64(no), float64(yes)))\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  return max(no, yes);\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    std::cmp::max(no, yes)\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return myMax(no, yes);\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return @max(no, yes);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-18 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u7269\u54c1\u90fd\u4f1a\u4ea7\u751f\u4e0d\u9009\u548c\u9009\u4e24\u6761\u641c\u7d22\u5206\u652f\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002

\u89c2\u5bdf\u9012\u5f52\u6811\uff0c\u5bb9\u6613\u53d1\u73b0\u5176\u4e2d\u5b58\u5728\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u5f53\u7269\u54c1\u8f83\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f83\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f83\u591a\u65f6\uff0c\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u6570\u91cf\u5c06\u4f1a\u5927\u5e45\u589e\u591a\u3002

\u56fe 14-18 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

\u4e3a\u4e86\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u6211\u4eec\u501f\u52a9\u8bb0\u5fc6\u5217\u8868 mem \u6765\u8bb0\u5f55\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5bf9\u5e94 \\(dp[i, c]\\) \u3002

\u5f15\u5165\u8bb0\u5fc6\u5316\u4e4b\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5b50\u95ee\u9898\u6570\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs_mem}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-19 \u5c55\u793a\u4e86\u5728\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u88ab\u526a\u6389\u7684\u641c\u7d22\u5206\u652f\u3002

\u56fe 14-19 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

"},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

\u52a8\u6001\u89c4\u5212\u5b9e\u8d28\u4e0a\u5c31\u662f\u5728\u72b6\u6001\u8f6c\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u8fc7\u7a0b\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 14-20 \u6240\u793a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u7531\u6570\u7ec4 dp \u5927\u5c0f\u51b3\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14>

\u56fe 14-20 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u90fd\u53ea\u4e0e\u5176\u4e0a\u4e00\u884c\u7684\u72b6\u6001\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e24\u4e2a\u6570\u7ec4\u6eda\u52a8\u524d\u8fdb\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

\u8fdb\u4e00\u6b65\u601d\u8003\uff0c\u6211\u4eec\u80fd\u5426\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u5b9e\u73b0\u7a7a\u95f4\u4f18\u5316\u5462\uff1f\u89c2\u5bdf\u53ef\u77e5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f6c\u79fb\u8fc7\u6765\u7684\u3002\u5047\u8bbe\u53ea\u6709\u4e00\u4e2a\u6570\u7ec4\uff0c\u5f53\u5f00\u59cb\u904d\u5386\u7b2c \\(i\\) \u884c\u65f6\uff0c\u8be5\u6570\u7ec4\u5b58\u50a8\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72b6\u6001\u3002

  • \u5982\u679c\u91c7\u53d6\u6b63\u5e8f\u904d\u5386\uff0c\u90a3\u4e48\u904d\u5386\u5230 \\(dp[i, j]\\) \u65f6\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7ecf\u88ab\u8986\u76d6\uff0c\u6b64\u65f6\u5c31\u65e0\u6cd5\u5f97\u5230\u6b63\u786e\u7684\u72b6\u6001\u8f6c\u79fb\u7ed3\u679c\u3002
  • \u5982\u679c\u91c7\u53d6\u5012\u5e8f\u904d\u5386\uff0c\u5219\u4e0d\u4f1a\u53d1\u751f\u8986\u76d6\u95ee\u9898\uff0c\u72b6\u6001\u8f6c\u79fb\u53ef\u4ee5\u6b63\u786e\u8fdb\u884c\u3002

\u56fe 14-21 \u5c55\u793a\u4e86\u5728\u5355\u4e2a\u6570\u7ec4\u4e0b\u4ece\u7b2c \\(i = 1\\) \u884c\u8f6c\u6362\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u8fc7\u7a0b\u3002\u8bf7\u601d\u8003\u6b63\u5e8f\u904d\u5386\u548c\u5012\u5e8f\u904d\u5386\u7684\u533a\u522b\u3002

<1><2><3><4><5><6>

\u56fe 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4 \\(i\\) \u76f4\u63a5\u5220\u9664\uff0c\u5e76\u4e14\u628a\u5185\u5faa\u73af\u66f4\u6539\u4e3a\u5012\u5e8f\u904d\u5386\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u904d\u5386\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u904d\u5386\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u904d\u5386\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u904d\u5386\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp_comp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u904d\u5386\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7ed3","text":"
  • \u52a8\u6001\u89c4\u5212\u5bf9\u95ee\u9898\u8fdb\u884c\u5206\u89e3\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u89c4\u907f\u91cd\u590d\u8ba1\u7b97\uff0c\u63d0\u9ad8\u8ba1\u7b97\u6548\u7387\u3002
  • \u4e0d\u8003\u8651\u65f6\u95f4\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52a8\u6001\u89c4\u5212\u95ee\u9898\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u7d22\uff09\u8fdb\u884c\u6c42\u89e3\uff0c\u4f46\u9012\u5f52\u6811\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u6548\u7387\u6781\u4f4e\u3002\u901a\u8fc7\u5f15\u5165\u8bb0\u5fc6\u5316\u5217\u8868\uff0c\u53ef\u4ee5\u5b58\u50a8\u6240\u6709\u8ba1\u7b97\u8fc7\u7684\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u4ece\u800c\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002
  • \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u9012\u5f52\u5f0f\u89e3\u6cd5\uff0c\u800c\u4e0e\u4e4b\u5bf9\u5e94\u7684\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u4ece\u5e95\u81f3\u9876\u7684\u9012\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5199\u8868\u683c\u201d\u4e00\u6837\u3002\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u4ec5\u4f9d\u8d56\u67d0\u4e9b\u5c40\u90e8\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\uff0c\u4ece\u800c\u964d\u4f4e\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
  • \u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8d28\u3002
  • \u52a8\u6001\u89c4\u5212\u95ee\u9898\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002
  • \u5982\u679c\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u53ef\u4ee5\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\uff0c\u5219\u5b83\u5c31\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u3002
  • \u65e0\u540e\u6548\u6027\u6307\u5bf9\u4e8e\u4e00\u4e2a\u72b6\u6001\uff0c\u5176\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u8be5\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u4e0d\u5177\u6709\u65e0\u540e\u6548\u6027\uff0c\u65e0\u6cd5\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5feb\u901f\u6c42\u89e3\u3002

\u80cc\u5305\u95ee\u9898

  • \u80cc\u5305\u95ee\u9898\u662f\u6700\u5178\u578b\u7684\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u53d8\u79cd\u3002
  • 0-1 \u80cc\u5305\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\u3002\u6839\u636e\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u4e24\u79cd\u51b3\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\uff0c\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u904d\u5386\u5217\u8868\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72b6\u6001\u88ab\u8986\u76d6\u3002
  • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u6bcf\u79cd\u7269\u54c1\u7684\u9009\u53d6\u6570\u91cf\u65e0\u9650\u5236\uff0c\u56e0\u6b64\u9009\u62e9\u653e\u5165\u7269\u54c1\u7684\u72b6\u6001\u8f6c\u79fb\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\u3002\u7531\u4e8e\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\u5e94\u5f53\u6b63\u5e8f\u904d\u5386\u3002
  • \u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u4e2a\u53d8\u79cd\u3002\u5b83\u4ece\u6c42\u201c\u6700\u5927\u201d\u4ef7\u503c\u53d8\u4e3a\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e01\u6570\u91cf\uff0c\u56e0\u6b64\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u5e94\u6539\u4e3a \\(\\min()\\) \u3002\u4ece\u8ffd\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u6765\u8868\u793a\u201c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u201d\u7684\u65e0\u6548\u89e3\u3002
  • \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u4ece\u6c42\u201c\u6700\u5c11\u786c\u5e01\u6570\u91cf\u201d\u6539\u4e3a\u6c42\u201c\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u201d\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u76f8\u5e94\u5730\u4ece \\(\\min()\\) \u6539\u4e3a\u6c42\u548c\u8fd0\u7b97\u7b26\u3002

\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

  • \u7f16\u8f91\u8ddd\u79bb\uff08Levenshtein \u8ddd\u79bb\uff09\u7528\u4e8e\u8861\u91cf\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u4e49\u4e3a\u4ece\u4e00\u4e2a\u5b57\u7b26\u4e32\u5230\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u7f16\u8f91\u64cd\u4f5c\u5305\u62ec\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\u3002
  • \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002\u5f53 \\(s[i] \\ne t[j]\\) \u65f6\uff0c\u5177\u6709\u4e09\u79cd\u51b3\u7b56\uff1a\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\uff0c\u5b83\u4eec\u90fd\u6709\u76f8\u5e94\u7684\u5269\u4f59\u5b50\u95ee\u9898\u3002\u636e\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u6784\u5efa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u800c\u5f53 \\(s[i] = t[j]\\) \u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\u3002
  • \u5728\u7f16\u8f91\u8ddd\u79bb\u4e2d\uff0c\u72b6\u6001\u4f9d\u8d56\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u6b63\u5e8f\u6216\u5012\u5e8f\u904d\u5386\u90fd\u65e0\u6cd5\u6b63\u786e\u5730\u8fdb\u884c\u72b6\u6001\u8f6c\u79fb\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u53d8\u91cf\u6682\u5b58\u5de6\u4e0a\u65b9\u72b6\u6001\uff0c\u4ece\u800c\u8f6c\u5316\u5230\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7b49\u4ef7\u7684\u60c5\u51b5\uff0c\u53ef\u4ee5\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002
"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6c42\u89e3\u53e6\u4e00\u4e2a\u5e38\u89c1\u7684\u80cc\u5305\u95ee\u9898\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u4e86\u89e3\u5b83\u7684\u4e00\u79cd\u7279\u4f8b\uff1a\u96f6\u94b1\u5151\u6362\u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 14-22 \u6240\u793a\u3002

\u56fe 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\uff0c\u533a\u522b\u4ec5\u5728\u4e8e\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9009\u62e9\u6b21\u6570\u3002

  • \u5728 0-1 \u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u53ea\u6709\u4e00\u4e2a\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u53ea\u80fd\u4ece\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002
  • \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u7684\u6570\u91cf\u662f\u65e0\u9650\u7684\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u4ecd\u53ef\u4ee5\u4ece\u524d \\(i\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002

\u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u89c4\u5b9a\u4e0b\uff0c\u72b6\u6001 \\([i, c]\\) \u7684\u53d8\u5316\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

\u4ece\u800c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u53d8\u4e3a\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5bf9\u6bd4\u4e24\u9053\u9898\u76ee\u7684\u4ee3\u7801\uff0c\u72b6\u6001\u8f6c\u79fb\u4e2d\u6709\u4e00\u5904\u4ece \\(i-1\\) \u53d8\u4e3a \\(i\\) \uff0c\u5176\u4f59\u5b8c\u5168\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u662f\u4ece\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u72b6\u6001\u8f6c\u79fb\u800c\u6765\u7684\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u5e94\u8be5\u5bf9 \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002

\u8fd9\u4e2a\u904d\u5386\u987a\u5e8f\u4e0e 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8bf7\u501f\u52a9\u56fe 14-23 \u6765\u7406\u89e3\u4e24\u8005\u7684\u533a\u522b\u3002

<1><2><3><4><5><6>

\u56fe 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

\u4ee3\u7801\u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4\u5220\u9664\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp_comp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898","text":"

\u80cc\u5305\u95ee\u9898\u662f\u4e00\u5927\u7c7b\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4ee3\u8868\uff0c\u5176\u62e5\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 14-24 \u6240\u793a\u3002

\u56fe 14-24 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u96f6\u94b1\u5151\u6362\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\uff0c\u4e24\u8005\u5177\u6709\u4ee5\u4e0b\u8054\u7cfb\u4e0e\u4e0d\u540c\u70b9\u3002

  • \u4e24\u9053\u9898\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\uff0c\u201c\u7269\u54c1\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5bf9\u5e94\u201c\u76ee\u6807\u91d1\u989d\u201d\u3002
  • \u4f18\u5316\u76ee\u6807\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u4ef7\u503c\uff0c\u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e01\u6570\u91cf\u3002
  • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u94b1\u5151\u6362\u662f\u6c42\u201c\u6070\u597d\u201d\u51d1\u5230\u76ee\u6807\u91d1\u989d\u7684\u89e3\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

\u72b6\u6001 \\([i, a]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\uff0c\u8bb0\u4e3a \\(dp[i, a]\\) \u3002

\u4e8c\u7ef4 \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt+1)\\) \u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

\u672c\u9898\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u4e24\u70b9\u5dee\u5f02\u3002

  • \u672c\u9898\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c06\u8fd0\u7b97\u7b26 \\(\\max()\\) \u66f4\u6539\u4e3a \\(\\min()\\) \u3002
  • \u4f18\u5316\u4e3b\u4f53\u662f\u786c\u5e01\u6570\u91cf\u800c\u975e\u5546\u54c1\u4ef7\u503c\uff0c\u56e0\u6b64\u5728\u9009\u4e2d\u786c\u5e01\u65f6\u6267\u884c \\(+1\\) \u5373\u53ef\u3002
\\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

\u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

\u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u51d1\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u5373\u662f\u65e0\u6548\u89e3\u3002\u4e3a\u4f7f\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u6570\u80fd\u591f\u8bc6\u522b\u5e76\u8fc7\u6ee4\u65e0\u6548\u89e3\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528 \\(+ \\infty\\) \u6765\u8868\u793a\u5b83\u4eec\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(+ \\infty\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u5e76\u672a\u63d0\u4f9b \\(+ \\infty\\) \u53d8\u91cf\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u6765\u4ee3\u66ff\u3002\u800c\u8fd9\u53c8\u4f1a\u5bfc\u81f4\u5927\u6570\u8d8a\u754c\uff1a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u53d1\u751f\u6ea2\u51fa\u3002

\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u6570\u5b57 \\(amt + 1\\) \u6765\u8868\u793a\u65e0\u6548\u89e3\uff0c\u56e0\u4e3a\u51d1\u51fa \\(amt\\) \u7684\u786c\u5e01\u6570\u91cf\u6700\u591a\u4e3a \\(amt\\) \u3002\u6700\u540e\u8fd4\u56de\u524d\uff0c\u5224\u65ad \\(dp[n, amt]\\) \u662f\u5426\u7b49\u4e8e \\(amt + 1\\) \uff0c\u82e5\u662f\u5219\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
coin_change.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
coin_change.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp}\n
coin_change.zig
// \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 14-25 \u5c55\u793a\u4e86\u96f6\u94b1\u5151\u6362\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u56fe 14-25 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u96f6\u94b1\u5151\u6362\u7684\u7a7a\u95f4\u4f18\u5316\u7684\u5904\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
coin_change.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp_comp}\n
coin_change.zig
// \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II","text":"

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u3002\u793a\u4f8b\u5982\u56fe 14-26 \u6240\u793a\u3002

\u56fe 14-26 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u7684\u793a\u4f8b\u6570\u636e

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

\u76f8\u6bd4\u4e8e\u4e0a\u4e00\u9898\uff0c\u672c\u9898\u76ee\u6807\u662f\u6c42\u7ec4\u5408\u6570\u91cf\uff0c\u56e0\u6b64\u5b50\u95ee\u9898\u53d8\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u7ec4\u5408\u6570\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7ef4\u77e9\u9635\u3002

\u5f53\u524d\u72b6\u6001\u7684\u7ec4\u5408\u6570\u91cf\u7b49\u4e8e\u4e0d\u9009\u5f53\u524d\u786c\u5e01\u4e0e\u9009\u5f53\u524d\u786c\u5e01\u8fd9\u4e24\u79cd\u51b3\u7b56\u7684\u7ec4\u5408\u6570\u91cf\u4e4b\u548c\u3002\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

\\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

\u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u65e0\u987b\u9009\u62e9\u4efb\u4f55\u786c\u5e01\u5373\u53ef\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u5e94\u5c06\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u4e3a \\(1\\) \u3002\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
coin_change_ii.cpp
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.java
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.cs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
coin_change_ii.go
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.swift
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.js
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.ts
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.dart
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
coin_change_ii.rs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
coin_change_ii.c
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp}\n
coin_change_ii.zig
// \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

\u7a7a\u95f4\u4f18\u5316\u5904\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u5220\u9664\u786c\u5e01\u7ef4\u5ea6\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
coin_change_ii.cpp
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.java
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.cs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.go
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.swift
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.js
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.ts
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u72b6\u6001\u538b\u7f29\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.dart
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
coin_change_ii.rs
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
coin_change_ii.c
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp_comp}\n
coin_change_ii.zig
// \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u56fe","text":"

Abstract

\u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u4eec\u5c31\u50cf\u662f\u4e00\u4e2a\u4e2a\u8282\u70b9\uff0c\u88ab\u65e0\u6570\u770b\u4e0d\u89c1\u7684\u8fb9\u76f8\u8fde\u3002

\u6bcf\u4e00\u6b21\u7684\u76f8\u8bc6\u4e0e\u76f8\u79bb\uff0c\u90fd\u5728\u8fd9\u5f20\u5de8\u5927\u7684\u7f51\u7edc\u56fe\u4e2d\u7559\u4e0b\u72ec\u7279\u7684\u5370\u8bb0\u3002

"},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 9.1 \u00a0 \u56fe
  • 9.2 \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c
  • 9.3 \u00a0 \u56fe\u7684\u904d\u5386
  • 9.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u56fe","text":"

\u56fe\uff08graph\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u9876\u70b9\uff08vertex\uff09\u548c\u8fb9\uff08edge\uff09\u7ec4\u6210\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u56fe \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9 \\(V\\) \u548c\u4e00\u7ec4\u8fb9 \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u4e2a\u5305\u542b 5 \u4e2a\u9876\u70b9\u548c 7 \u6761\u8fb9\u7684\u56fe\u3002

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

\u5982\u679c\u5c06\u9876\u70b9\u770b\u4f5c\u8282\u70b9\uff0c\u5c06\u8fb9\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u56fe\u770b\u4f5c\u4e00\u79cd\u4ece\u94fe\u8868\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\u3002\u5982\u56fe 9-1 \u6240\u793a\uff0c\u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002

\u56fe 9-1 \u00a0 \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

"},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u56fe\u7684\u5e38\u89c1\u7c7b\u578b\u4e0e\u672f\u8bed","text":"

\u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u65e0\u5411\u56fe\uff08undirected graph\uff09\u548c\u6709\u5411\u56fe\uff08directed graph\uff09\uff0c\u5982\u56fe 9-2 \u6240\u793a\u3002

  • \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u8fb9\u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u7684\u201c\u53cc\u5411\u201d\u8fde\u63a5\u5173\u7cfb\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u5173\u7cfb\u201d\u3002
  • \u5728\u6709\u5411\u56fe\u4e2d\uff0c\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u5173\u6ce8\u201d\u4e0e\u201c\u88ab\u5173\u6ce8\u201d\u5173\u7cfb\u3002

\u56fe 9-2 \u00a0 \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

\u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u8fde\u901a\u56fe\uff08connected graph\uff09\u548c\u975e\u8fde\u901a\u56fe\uff08disconnected graph\uff09\uff0c\u5982\u56fe 9-3 \u6240\u793a\u3002

  • \u5bf9\u4e8e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u53ef\u4ee5\u5230\u8fbe\u5176\u4f59\u4efb\u610f\u9876\u70b9\u3002
  • \u5bf9\u4e8e\u975e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002

\u56fe 9-3 \u00a0 \u8fde\u901a\u56fe\u4e0e\u975e\u8fde\u901a\u56fe

\u6211\u4eec\u8fd8\u53ef\u4ee5\u4e3a\u8fb9\u6dfb\u52a0\u201c\u6743\u91cd\u201d\u53d8\u91cf\uff0c\u4ece\u800c\u5f97\u5230\u5982\u56fe 9-4 \u6240\u793a\u7684\u6709\u6743\u56fe\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u8363\u8000\u300b\u7b49\u624b\u6e38\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u5171\u540c\u6e38\u620f\u65f6\u95f4\u6765\u8ba1\u7b97\u73a9\u5bb6\u4e4b\u95f4\u7684\u201c\u4eb2\u5bc6\u5ea6\u201d\uff0c\u8fd9\u79cd\u4eb2\u5bc6\u5ea6\u7f51\u7edc\u5c31\u53ef\u4ee5\u7528\u6709\u6743\u56fe\u6765\u8868\u793a\u3002

\u56fe 9-4 \u00a0 \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

\u56fe\u6570\u636e\u7ed3\u6784\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u672f\u8bed\u3002

  • \u90bb\u63a5\uff08adjacency\uff09\uff1a\u5f53\u4e24\u9876\u70b9\u4e4b\u95f4\u5b58\u5728\u8fb9\u76f8\u8fde\u65f6\uff0c\u79f0\u8fd9\u4e24\u9876\u70b9\u201c\u90bb\u63a5\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
  • \u8def\u5f84\uff08path\uff09\uff1a\u4ece\u9876\u70b9 A \u5230\u9876\u70b9 B \u7ecf\u8fc7\u7684\u8fb9\u6784\u6210\u7684\u5e8f\u5217\u88ab\u79f0\u4e3a\u4ece A \u5230 B \u7684\u201c\u8def\u5f84\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
  • \u5ea6\uff08degree\uff09\uff1a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u56fe\u7684\u8868\u793a","text":"

\u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

"},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u90bb\u63a5\u77e9\u9635","text":"

\u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u90bb\u63a5\u77e9\u9635\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u662f\u5426\u5b58\u5728\u8fb9\u3002

\u5982\u56fe 9-5 \u6240\u793a\uff0c\u8bbe\u90bb\u63a5\u77e9\u9635\u4e3a \\(M\\)\u3001\u9876\u70b9\u5217\u8868\u4e3a \\(V\\) \uff0c\u90a3\u4e48\u77e9\u9635\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9876\u70b9 \\(V[i]\\) \u5230\u9876\u70b9 \\(V[j]\\) \u4e4b\u95f4\u5b58\u5728\u8fb9\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u65e0\u8fb9\u3002

\u56fe 9-5 \u00a0 \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

\u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u9876\u70b9\u4e0d\u80fd\u4e0e\u81ea\u8eab\u76f8\u8fde\uff0c\u56e0\u6b64\u90bb\u63a5\u77e9\u9635\u4e3b\u5bf9\u89d2\u7ebf\u5143\u7d20\u6ca1\u6709\u610f\u4e49\u3002
  • \u5bf9\u4e8e\u65e0\u5411\u56fe\uff0c\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u7b49\u4ef7\uff0c\u6b64\u65f6\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\u3002
  • \u5c06\u90bb\u63a5\u77e9\u9635\u7684\u5143\u7d20\u4ece \\(1\\) \u548c \\(0\\) \u66ff\u6362\u4e3a\u6743\u91cd\uff0c\u5219\u53ef\u8868\u793a\u6709\u6743\u56fe\u3002

\u4f7f\u7528\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u77e9\u9635\u5143\u7d20\u4ee5\u83b7\u53d6\u8fb9\uff0c\u56e0\u6b64\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9635\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u5185\u5b58\u5360\u7528\u8f83\u591a\u3002

"},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u90bb\u63a5\u8868","text":"

\u90bb\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002\u56fe 9-6 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f7f\u7528\u90bb\u63a5\u8868\u5b58\u50a8\u7684\u56fe\u7684\u793a\u4f8b\u3002

\u56fe 9-6 \u00a0 \u56fe\u7684\u90bb\u63a5\u8868\u8868\u793a

\u90bb\u63a5\u8868\u4ec5\u5b58\u50a8\u5b9e\u9645\u5b58\u5728\u7684\u8fb9\uff0c\u800c\u8fb9\u7684\u603b\u6570\u901a\u5e38\u8fdc\u5c0f\u4e8e \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002\u7136\u800c\uff0c\u5728\u90bb\u63a5\u8868\u4e2d\u9700\u8981\u901a\u8fc7\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u5176\u65f6\u95f4\u6548\u7387\u4e0d\u5982\u90bb\u63a5\u77e9\u9635\u3002

\u89c2\u5bdf\u56fe 9-6 \uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u201c\u94fe\u5f0f\u5730\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u7684\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u6bd4\u5982\u5f53\u94fe\u8868\u8f83\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u5316\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u6548\u7387\u4ece \\(O(n)\\) \u4f18\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u8fd8\u53ef\u4ee5\u628a\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u56fe\u7684\u5e38\u89c1\u5e94\u7528","text":"

\u5982\u8868 9-1 \u6240\u793a\uff0c\u8bb8\u591a\u73b0\u5b9e\u7cfb\u7edf\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

\u8868 9-1 \u00a0 \u73b0\u5b9e\u751f\u6d3b\u4e2d\u5e38\u89c1\u7684\u56fe

\u9876\u70b9 \u8fb9 \u56fe\u8ba1\u7b97\u95ee\u9898 \u793e\u4ea4\u7f51\u7edc \u7528\u6237 \u597d\u53cb\u5173\u7cfb \u6f5c\u5728\u597d\u53cb\u63a8\u8350 \u5730\u94c1\u7ebf\u8def \u7ad9\u70b9 \u7ad9\u70b9\u95f4\u7684\u8fde\u901a\u6027 \u6700\u77ed\u8def\u7ebf\u63a8\u8350 \u592a\u9633\u7cfb \u661f\u4f53 \u661f\u4f53\u95f4\u7684\u4e07\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8f68\u9053\u8ba1\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u56fe\u7684\u57fa\u7840\u64cd\u4f5c","text":"

\u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u201c\u8fb9\u201d\u7684\u64cd\u4f5c\u548c\u5bf9\u201c\u9876\u70b9\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u5f0f\u5982\u56fe 9-7 \u6240\u793a\u3002

  • \u6dfb\u52a0\u6216\u5220\u9664\u8fb9\uff1a\u76f4\u63a5\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u800c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u9700\u8981\u540c\u65f6\u66f4\u65b0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u7684\u5c3e\u90e8\u6dfb\u52a0\u4e00\u884c\u4e00\u5217\uff0c\u5e76\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u4e00\u884c\u4e00\u5217\u3002\u5f53\u5220\u9664\u9996\u884c\u9996\u5217\u65f6\u8fbe\u5230\u6700\u5dee\u60c5\u51b5\uff0c\u9700\u8981\u5c06 \\((n-1)^2\\) \u4e2a\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52a8\u201d\uff0c\u4ece\u800c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u521d\u59cb\u5316\uff1a\u4f20\u5165 \\(n\\) \u4e2a\u9876\u70b9\uff0c\u521d\u59cb\u5316\u957f\u5ea6\u4e3a \\(n\\) \u7684\u9876\u70b9\u5217\u8868 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u90bb\u63a5\u77e9\u9635 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
\u521d\u59cb\u5316\u90bb\u63a5\u77e9\u9635\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

\u56fe 9-7 \u00a0 \u90bb\u63a5\u77e9\u9635\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

\u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\)\u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\u53ef\u6839\u636e\u56fe 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5b9e\u73b0\u5404\u79cd\u64cd\u4f5c\u3002

  • \u6dfb\u52a0\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u7684\u672b\u5c3e\u6dfb\u52a0\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u4e3a\u662f\u65e0\u5411\u56fe\uff0c\u6240\u4ee5\u9700\u8981\u540c\u65f6\u6dfb\u52a0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u5220\u9664\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u4e2d\u67e5\u627e\u5e76\u5220\u9664\u6307\u5b9a\u8fb9\uff0c\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\u3002\u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u9700\u8981\u540c\u65f6\u5220\u9664\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
  • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u94fe\u8868\uff0c\u5e76\u5c06\u65b0\u589e\u9876\u70b9\u4f5c\u4e3a\u94fe\u8868\u5934\u8282\u70b9\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u9876\u70b9\uff1a\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5220\u9664\u5305\u542b\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
  • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
\u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

\u56fe 9-8 \u00a0 \u90bb\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

\u4ee5\u4e0b\u662f\u90bb\u63a5\u8868\u7684\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u6bd4\u56fe 9-8 \uff0c\u5b9e\u9645\u4ee3\u7801\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

  • \u4e3a\u4e86\u65b9\u4fbf\u6dfb\u52a0\u4e0e\u5220\u9664\u9876\u70b9\uff0c\u4ee5\u53ca\u7b80\u5316\u4ee3\u7801\uff0c\u6211\u4eec\u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u6765\u4ee3\u66ff\u94fe\u8868\u3002
  • \u4f7f\u7528\u54c8\u5e0c\u8868\u6765\u5b58\u50a8\u90bb\u63a5\u8868\uff0ckey \u4e3a\u9876\u70b9\u5b9e\u4f8b\uff0cvalue \u4e3a\u8be5\u9876\u70b9\u7684\u90bb\u63a5\u9876\u70b9\u5217\u8868\uff08\u94fe\u8868\uff09\u3002

\u53e6\u5916\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u4e0e\u90bb\u63a5\u77e9\u9635\u4e00\u6837\uff0c\u7528\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u5047\u8bbe\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u6240\u6709\u5927\u4e8e \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684 Vertex \u5b9e\u4f8b\uff0c\u5220\u9664\u67d0\u4e00\u9876\u70b9\u4e4b\u540e\u5c31\u65e0\u987b\u6539\u52a8\u5176\u4ed6\u9876\u70b9\u4e86\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

\u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u8868 9-2 \u5bf9\u6bd4\u4e86\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u3002

\u8868 9-2 \u00a0 \u90bb\u63a5\u77e9\u9635\u4e0e\u90bb\u63a5\u8868\u5bf9\u6bd4

\u90bb\u63a5\u77e9\u9635 \u90bb\u63a5\u8868\uff08\u94fe\u8868\uff09 \u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09 \u5224\u65ad\u662f\u5426\u90bb\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u8fb9 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u8fb9 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u9876\u70b9 \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u9876\u70b9 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u5185\u5b58\u7a7a\u95f4\u5360\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

\u89c2\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\u6548\u7387\u4e0e\u7a7a\u95f4\u6548\u7387\u6700\u4f18\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u64cd\u4f5c\u8fb9\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u6570\u7ec4\u8bbf\u95ee\u6216\u8d4b\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7efc\u5408\u6765\u770b\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u7684\u539f\u5219\uff0c\u800c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u7684\u539f\u5219\u3002

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u56fe\u7684\u904d\u5386","text":"

\u6811\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5bf9\u591a\u201d\u7684\u5173\u7cfb\uff0c\u800c\u56fe\u5219\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5bf9\u591a\u201d\u5173\u7cfb\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6811\u770b\u4f5c\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\u3002\u663e\u7136\uff0c\u6811\u7684\u904d\u5386\u64cd\u4f5c\u4e5f\u662f\u56fe\u7684\u904d\u5386\u64cd\u4f5c\u7684\u4e00\u79cd\u7279\u4f8b\u3002

\u56fe\u548c\u6811\u90fd\u9700\u8981\u5e94\u7528\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u548c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

"},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\u67d0\u4e2a\u8282\u70b9\u51fa\u53d1\uff0c\u59cb\u7ec8\u4f18\u5148\u8bbf\u95ee\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5982\u56fe 9-9 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u9996\u5148\u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u7136\u540e\u904d\u5386\u4e0b\u4e00\u4e2a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u8bbf\u95ee\u5b8c\u6bd5\u3002

\u56fe 9-9 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

BFS \u901a\u5e38\u501f\u52a9\u961f\u5217\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002\u961f\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8d28\uff0c\u8fd9\u4e0e BFS \u7684\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u601d\u60f3\u5f02\u66f2\u540c\u5de5\u3002

  1. \u5c06\u904d\u5386\u8d77\u59cb\u9876\u70b9 startVet \u52a0\u5165\u961f\u5217\uff0c\u5e76\u5f00\u542f\u5faa\u73af\u3002
  2. \u5728\u5faa\u73af\u7684\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\uff0c\u5f39\u51fa\u961f\u9996\u9876\u70b9\u5e76\u8bb0\u5f55\u8bbf\u95ee\uff0c\u7136\u540e\u5c06\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u52a0\u5165\u5230\u961f\u5217\u5c3e\u90e8\u3002
  3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6bd5\u540e\u7ed3\u675f\u3002

\u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

Tip

\u54c8\u5e0c\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u53ea\u5b58\u50a8 key \u800c\u4e0d\u5b58\u50a8 value \u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fdb\u884c key \u7684\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u636e key \u7684\u552f\u4e00\u6027\uff0c\u54c8\u5e0c\u96c6\u5408\u901a\u5e38\u7528\u4e8e\u6570\u636e\u53bb\u91cd\u7b49\u573a\u666f\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
graph_bfs.kt
/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u56fe 9-10 \u6765\u52a0\u6df1\u7406\u89e3\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 9-10 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0d\u552f\u4e00\u3002\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u987a\u5e8f\u904d\u5386\uff0c\u800c\u591a\u4e2a\u76f8\u540c\u8ddd\u79bb\u7684\u9876\u70b9\u7684\u904d\u5386\u987a\u5e8f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u3002\u4ee5\u56fe 9-10 \u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\)\u3001\\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\uff0c\u9876\u70b9 \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

"},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u5165\u961f\u5e76\u51fa\u961f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u5728\u904d\u5386\u90bb\u63a5\u9876\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \uff0c\u961f\u5217 que \u4e2d\u7684\u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\u5982\u56fe 9-11 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u5f53\u524d\u9876\u70b9\u7684\u67d0\u4e2a\u90bb\u63a5\u9876\u70b9\uff0c\u76f4\u5230\u8d70\u5230\u5c3d\u5934\u65f6\u8fd4\u56de\uff0c\u518d\u7ee7\u7eed\u8d70\u5230\u5c3d\u5934\u5e76\u8fd4\u56de\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u904d\u5386\u5b8c\u6210\u3002

\u56fe 9-11 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

"},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

\u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934\u518d\u8fd4\u56de\u201d\u7684\u7b97\u6cd5\u8303\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u5728\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u4e2d\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 9-12 \u6240\u793a\u3002

  • \u76f4\u865a\u7ebf\u4ee3\u8868\u5411\u4e0b\u9012\u63a8\uff0c\u8868\u793a\u5f00\u542f\u4e86\u4e00\u4e2a\u65b0\u7684\u9012\u5f52\u65b9\u6cd5\u6765\u8bbf\u95ee\u65b0\u9876\u70b9\u3002
  • \u66f2\u865a\u7ebf\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u9012\u5f52\u65b9\u6cd5\u5df2\u7ecf\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u5f00\u542f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

\u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe 9-12 \u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\u6a21\u62df\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6574\u4e2a DFS \u8fc7\u7a0b\uff0c\u5305\u62ec\u6bcf\u4e2a\u9012\u5f52\u65b9\u6cd5\u4f55\u65f6\u5f00\u542f\u3001\u4f55\u65f6\u8fd4\u56de\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 9-12 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5e8f\u5217\u7684\u987a\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7ed9\u5b9a\u67d0\u9876\u70b9\uff0c\u5148\u5f80\u54ea\u4e2a\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u90bb\u63a5\u9876\u70b9\u7684\u987a\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e71\uff0c\u90fd\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

\u4ee5\u6811\u7684\u904d\u5386\u4e3a\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\uff0c\u5b83\u4eec\u5c55\u793a\u4e86\u4e09\u79cd\u904d\u5386\u4f18\u5148\u7ea7\uff0c\u7136\u800c\u8fd9\u4e09\u8005\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

"},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u6700\u5927\u4e3a \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9\u548c\u4e00\u7ec4\u8fb9\u6784\u6210\u7684\u96c6\u5408\u3002
  • \u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002
  • \u6709\u5411\u56fe\u7684\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u8fde\u901a\u56fe\u4e2d\u7684\u4efb\u610f\u9876\u70b9\u5747\u53ef\u8fbe\uff0c\u6709\u6743\u56fe\u7684\u6bcf\u6761\u8fb9\u90fd\u5305\u542b\u6743\u91cd\u53d8\u91cf\u3002
  • \u90bb\u63a5\u77e9\u9635\u5229\u7528\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u6709\u8fb9\u6216\u65e0\u8fb9\u3002\u90bb\u63a5\u77e9\u9635\u5728\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u95f4\u5360\u7528\u8f83\u591a\u3002
  • \u90bb\u63a5\u8868\u4f7f\u7528\u591a\u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u3002\u90bb\u63a5\u8868\u76f8\u5bf9\u4e8e\u90bb\u63a5\u77e9\u9635\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0c\u4f46\u7531\u4e8e\u9700\u8981\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u65f6\u95f4\u6548\u7387\u8f83\u4f4e\u3002
  • \u5f53\u90bb\u63a5\u8868\u4e2d\u7684\u94fe\u8868\u8fc7\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u5176\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6216\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002
  • \u4ece\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002
  • \u56fe\u53ef\u7528\u4e8e\u5efa\u6a21\u5404\u7c7b\u73b0\u5b9e\u7cfb\u7edf\uff0c\u5982\u793e\u4ea4\u7f51\u7edc\u3001\u5730\u94c1\u7ebf\u8def\u7b49\u3002
  • \u6811\u662f\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\uff0c\u6811\u7684\u904d\u5386\u4e5f\u662f\u56fe\u7684\u904d\u5386\u7684\u4e00\u79cd\u7279\u4f8b\u3002
  • \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u3001\u5c42\u5c42\u6269\u5f20\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u901a\u5e38\u501f\u52a9\u961f\u5217\u5b9e\u73b0\u3002
  • \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u65f6\u518d\u56de\u6eaf\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

\u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

\u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u89c6\u4e3a\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

Q\uff1a\u975e\u8fde\u901a\u56fe\u4e2d\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

\u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

Q\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

\u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\uff0c\u8fd9\u6837\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

"},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8d2a\u5fc3","text":"

Abstract

\u5411\u65e5\u8475\u671d\u7740\u592a\u9633\u8f6c\u52a8\uff0c\u65f6\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u957f\u7684\u6700\u5927\u53ef\u80fd\u3002

\u8d2a\u5fc3\u7b56\u7565\u5728\u4e00\u8f6e\u8f6e\u7684\u7b80\u5355\u9009\u62e9\u4e2d\uff0c\u9010\u6b65\u5bfc\u5411\u6700\u4f73\u7b54\u6848\u3002

"},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5
  • 15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898
  • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898
  • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898
  • 15.5 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898","text":"

Question

\u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u4ef7\u503c\u6839\u636e\u9009\u62e9\u7684\u91cd\u91cf\u6bd4\u4f8b\u8ba1\u7b97\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 15-3 \u6240\u793a\u3002

\u56fe 15-3 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

\u5206\u6570\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u6574\u4f53\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72b6\u6001\u5305\u542b\u5f53\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6807\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u4ef7\u503c\u3002

\u4e0d\u540c\u70b9\u5728\u4e8e\uff0c\u672c\u9898\u5141\u8bb8\u53ea\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u56fe 15-4 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u7269\u54c1\u4efb\u610f\u5730\u8fdb\u884c\u5207\u5206\uff0c\u5e76\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u6765\u8ba1\u7b97\u76f8\u5e94\u4ef7\u503c\u3002

  1. \u5bf9\u4e8e\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c\u4e3a \\(val[i-1] / wgt[i-1]\\) \uff0c\u7b80\u79f0\u5355\u4f4d\u4ef7\u503c\u3002
  2. \u5047\u8bbe\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u4e3a \\(w\\) \uff0c\u5219\u80cc\u5305\u589e\u52a0\u7684\u4ef7\u503c\u4e3a \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

\u56fe 15-4 \u00a0 \u7269\u54c1\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c

"},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u6700\u5927\u5316\u80cc\u5305\u5185\u7269\u54c1\u603b\u4ef7\u503c\uff0c\u672c\u8d28\u4e0a\u662f\u6700\u5927\u5316\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u4ef7\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u56fe 15-5 \u6240\u793a\u7684\u8d2a\u5fc3\u7b56\u7565\u3002

  1. \u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\u3002
  2. \u904d\u5386\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f6e\u8d2a\u5fc3\u5730\u9009\u62e9\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
  3. \u82e5\u5269\u4f59\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u4f7f\u7528\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6ee1\u80cc\u5305\u3002

\u56fe 15-5 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565

"},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u6211\u4eec\u5efa\u7acb\u4e86\u4e00\u4e2a\u7269\u54c1\u7c7b Item \uff0c\u4ee5\u4fbf\u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u8fdb\u884c\u6392\u5e8f\u3002\u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u5f53\u80cc\u5305\u5df2\u6ee1\u65f6\u8df3\u51fa\u5e76\u8fd4\u56de\u89e3\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u4ef7\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n    return res\n
fractional_knapsack.cpp
/* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.java
/* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.cs
/* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.go
/* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.swift
/* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u4ef7\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.js
/* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u4ef7\u503c\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.ts
/* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u4ef7\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.dart
/* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u4ef7\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break;\n    }\n  }\n  return res;\n}\n
fractional_knapsack.rs
/* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u4ef7\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    res\n}\n
fractional_knapsack.c
/* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n} Item;\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
fractional_knapsack.kt
/* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u4ef7\u503c\n)\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.rb
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
fractional_knapsack.zig
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u904d\u5386\u6574\u4e2a\u7269\u54c1\u5217\u8868\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u7269\u54c1\u6570\u91cf\u3002

\u7531\u4e8e\u521d\u59cb\u5316\u4e86\u4e00\u4e2a Item \u5bf9\u8c61\u5217\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

"},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u91c7\u7528\u53cd\u8bc1\u6cd5\u3002\u5047\u8bbe\u7269\u54c1 \\(x\\) \u662f\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u4ef7\u503c\u4e3a res \uff0c\u4f46\u8be5\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u73b0\u5728\u4ece\u80cc\u5305\u4e2d\u62ff\u51fa\u5355\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u5e76\u66ff\u6362\u4e3a\u5355\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u4e8e\u7269\u54c1 \\(x\\) \u7684\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u6362\u540e\u7684\u603b\u4ef7\u503c\u4e00\u5b9a\u5927\u4e8e res \u3002\u8fd9\u4e0e res \u662f\u6700\u4f18\u89e3\u77db\u76fe\uff0c\u8bf4\u660e\u6700\u4f18\u89e3\u4e2d\u5fc5\u987b\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u5bf9\u4e8e\u8be5\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u6784\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u603b\u800c\u8a00\u4e4b\uff0c\u5355\u4f4d\u4ef7\u503c\u66f4\u5927\u7684\u7269\u54c1\u603b\u662f\u66f4\u4f18\u9009\u62e9\uff0c\u8fd9\u8bf4\u660e\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

\u5982\u56fe 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c06\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u5355\u4f4d\u4ef7\u503c\u5206\u522b\u770b\u4f5c\u4e00\u5f20\u4e8c\u7ef4\u56fe\u8868\u7684\u6a2a\u8f74\u548c\u7eb5\u8f74\uff0c\u5219\u5206\u6570\u80cc\u5305\u95ee\u9898\u53ef\u8f6c\u5316\u4e3a\u201c\u6c42\u5728\u6709\u9650\u6a2a\u8f74\u533a\u95f4\u4e0b\u56f4\u6210\u7684\u6700\u5927\u9762\u79ef\u201d\u3002\u8fd9\u4e2a\u7c7b\u6bd4\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u51e0\u4f55\u89d2\u5ea6\u7406\u89e3\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

\u56fe 15-6 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u51e0\u4f55\u8868\u793a

"},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5","text":"

\u8d2a\u5fc3\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u7684\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u95ee\u9898\u7684\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\uff0c\u90fd\u9009\u62e9\u5f53\u524d\u770b\u8d77\u6765\u6700\u4f18\u7684\u9009\u62e9\uff0c\u5373\u8d2a\u5fc3\u5730\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002\u8d2a\u5fc3\u7b97\u6cd5\u7b80\u6d01\u4e14\u9ad8\u6548\uff0c\u5728\u8bb8\u591a\u5b9e\u9645\u95ee\u9898\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002

\u8d2a\u5fc3\u7b97\u6cd5\u548c\u52a8\u6001\u89c4\u5212\u90fd\u5e38\u7528\u4e8e\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u3002\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u5904\uff0c\u6bd4\u5982\u90fd\u4f9d\u8d56\u6700\u4f18\u5b50\u7ed3\u6784\u6027\u8d28\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

  • \u52a8\u6001\u89c4\u5212\u4f1a\u6839\u636e\u4e4b\u524d\u9636\u6bb5\u7684\u6240\u6709\u51b3\u7b56\u6765\u8003\u8651\u5f53\u524d\u51b3\u7b56\uff0c\u5e76\u4f7f\u7528\u8fc7\u53bb\u5b50\u95ee\u9898\u7684\u89e3\u6765\u6784\u5efa\u5f53\u524d\u5b50\u95ee\u9898\u7684\u89e3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4f1a\u8003\u8651\u8fc7\u53bb\u7684\u51b3\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u4e0d\u65ad\u7f29\u5c0f\u95ee\u9898\u8303\u56f4\uff0c\u76f4\u81f3\u95ee\u9898\u88ab\u89e3\u51b3\u3002

\u6211\u4eec\u5148\u901a\u8fc7\u4f8b\u9898\u201c\u96f6\u94b1\u5151\u6362\u201d\u4e86\u89e3\u8d2a\u5fc3\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u8fd9\u9053\u9898\u5df2\u7ecf\u5728\u201c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u76f8\u4fe1\u4f60\u5bf9\u5b83\u5e76\u4e0d\u964c\u751f\u3002

Question

\u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

\u672c\u9898\u91c7\u53d6\u7684\u8d2a\u5fc3\u7b56\u7565\u5982\u56fe 15-1 \u6240\u793a\u3002\u7ed9\u5b9a\u76ee\u6807\u91d1\u989d\uff0c\u6211\u4eec\u8d2a\u5fc3\u5730\u9009\u62e9\u4e0d\u5927\u4e8e\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e01\uff0c\u4e0d\u65ad\u5faa\u73af\u8be5\u6b65\u9aa4\uff0c\u76f4\u81f3\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u4e3a\u6b62\u3002

\u56fe 15-1 \u00a0 \u96f6\u94b1\u5151\u6362\u7684\u8d2a\u5fc3\u7b56\u7565

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
coin_change_greedy.cpp
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.java
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.cs
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.go
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
coin_change_greedy.swift
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
coin_change_greedy.js
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.ts
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.dart
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9009\u62e9 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
coin_change_greedy.rs
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
coin_change_greedy.c
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.kt
/* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
coin_change_greedy.rb
[class]{}-[func]{coin_change_greedy}\n
coin_change_greedy.zig
[class]{}-[func]{coinChangeGreedy}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4f60\u53ef\u80fd\u4f1a\u4e0d\u7531\u5730\u53d1\u51fa\u611f\u53f9\uff1aSo clean \uff01\u8d2a\u5fc3\u7b97\u6cd5\u4ec5\u7528\u7ea6\u5341\u884c\u4ee3\u7801\u5c31\u89e3\u51b3\u4e86\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u64cd\u4f5c\u76f4\u63a5\u3001\u5b9e\u73b0\u7b80\u5355\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0c\u8bb0\u786c\u5e01\u6700\u5c0f\u9762\u503c\u4e3a \\(\\min(coins)\\) \uff0c\u5219\u8d2a\u5fc3\u9009\u62e9\u6700\u591a\u5faa\u73af \\(amt / \\min(coins)\\) \u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(amt / \\min(coins))\\) \u3002\u8fd9\u6bd4\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002

\u7136\u800c\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u9762\u503c\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5e76\u4e0d\u80fd\u627e\u5230\u6700\u4f18\u89e3\u3002\u56fe 15-2 \u7ed9\u51fa\u4e86\u4e24\u4e2a\u793a\u4f8b\u3002

  • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8be5\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u7ed9\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3\u3002
  • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8bbe \\(amt = 60\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(11\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(20 + 20 + 20\\) \uff0c\u4ec5\u9700 \\(3\\) \u679a\u786c\u5e01\u3002
  • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8bbe \\(amt = 98\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(49\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(49 + 49\\) \uff0c\u4ec5\u9700 \\(2\\) \u679a\u786c\u5e01\u3002

\u56fe 15-2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u627e\u51fa\u6700\u4f18\u89e3\u7684\u793a\u4f8b

\u4e5f\u5c31\u662f\u8bf4\uff0c\u5bf9\u4e8e\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u4fdd\u8bc1\u627e\u5230\u5168\u5c40\u6700\u4f18\u89e3\uff0c\u5e76\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\u3002

\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u9002\u7528\u60c5\u51b5\u5206\u4ee5\u4e0b\u4e24\u79cd\u3002

  1. \u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5f80\u5f80\u662f\u6700\u4f18\u9009\u62e9\uff0c\u56e0\u4e3a\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u66f4\u9ad8\u6548\u3002
  2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5bf9\u4e8e\u5f88\u591a\u590d\u6742\u95ee\u9898\u6765\u8bf4\uff0c\u5bfb\u627e\u5168\u5c40\u6700\u4f18\u89e3\u975e\u5e38\u56f0\u96be\uff0c\u80fd\u4ee5\u8f83\u9ad8\u6548\u7387\u627e\u5230\u6b21\u4f18\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u9519\u7684\u3002
"},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7279\u6027","text":"

\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0c\u4ec0\u4e48\u6837\u7684\u95ee\u9898\u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8bf4\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1f

\u76f8\u8f83\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f7f\u7528\u6761\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u5173\u6ce8\u95ee\u9898\u7684\u4e24\u4e2a\u6027\u8d28\u3002

  • \u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\uff1a\u53ea\u6709\u5f53\u5c40\u90e8\u6700\u4f18\u9009\u62e9\u59cb\u7ec8\u53ef\u4ee5\u5bfc\u81f4\u5168\u5c40\u6700\u4f18\u89e3\u65f6\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u624d\u80fd\u4fdd\u8bc1\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u5305\u542b\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u3002

\u6700\u4f18\u5b50\u7ed3\u6784\u5df2\u7ecf\u5728\u201c\u52a8\u6001\u89c4\u5212\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u95ee\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\u5e76\u4e0d\u660e\u663e\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u89e3\u51b3\u3002

\u6211\u4eec\u4e3b\u8981\u63a2\u7a76\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u5224\u65ad\u65b9\u6cd5\u3002\u867d\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f83\u7b80\u5355\uff0c\u4f46\u5b9e\u9645\u4e0a\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\uff0c\u8bc1\u660e\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u5e76\u975e\u6613\u4e8b\u3002

\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u6211\u4eec\u867d\u7136\u80fd\u591f\u5bb9\u6613\u5730\u4e3e\u51fa\u53cd\u4f8b\uff0c\u5bf9\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u8fdb\u884c\u8bc1\u4f2a\uff0c\u4f46\u8bc1\u5b9e\u7684\u96be\u5ea6\u8f83\u5927\u3002\u5982\u679c\u95ee\uff1a\u6ee1\u8db3\u4ec0\u4e48\u6761\u4ef6\u7684\u786c\u5e01\u7ec4\u5408\u53ef\u4ee5\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u4eec\u5f80\u5f80\u53ea\u80fd\u51ed\u501f\u76f4\u89c9\u6216\u4e3e\u4f8b\u5b50\u6765\u7ed9\u51fa\u4e00\u4e2a\u6a21\u68f1\u4e24\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96be\u4ee5\u7ed9\u51fa\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\u3002

Quote

\u6709\u4e00\u7bc7\u8bba\u6587\u7ed9\u51fa\u4e86\u4e00\u4e2a \\(O(n^3)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u7b97\u6cd5\uff0c\u7528\u4e8e\u5224\u65ad\u4e00\u4e2a\u786c\u5e01\u7ec4\u5408\u80fd\u5426\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u989d\u7684\u6700\u4f18\u89e3\u3002

Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

"},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u89e3\u9898\u6b65\u9aa4","text":"

\u8d2a\u5fc3\u95ee\u9898\u7684\u89e3\u51b3\u6d41\u7a0b\u5927\u4f53\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e09\u6b65\u3002

  1. \u95ee\u9898\u5206\u6790\uff1a\u68b3\u7406\u4e0e\u7406\u89e3\u95ee\u9898\u7279\u6027\uff0c\u5305\u62ec\u72b6\u6001\u5b9a\u4e49\u3001\u4f18\u5316\u76ee\u6807\u548c\u7ea6\u675f\u6761\u4ef6\u7b49\u3002\u8fd9\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52a8\u6001\u89c4\u5212\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
  2. \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\uff1a\u786e\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8d2a\u5fc3\u9009\u62e9\u3002\u8fd9\u4e2a\u7b56\u7565\u80fd\u591f\u5728\u6bcf\u4e00\u6b65\u51cf\u5c0f\u95ee\u9898\u7684\u89c4\u6a21\uff0c\u5e76\u6700\u7ec8\u89e3\u51b3\u6574\u4e2a\u95ee\u9898\u3002
  3. \u6b63\u786e\u6027\u8bc1\u660e\uff1a\u901a\u5e38\u9700\u8981\u8bc1\u660e\u95ee\u9898\u5177\u6709\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8fd9\u4e2a\u6b65\u9aa4\u53ef\u80fd\u9700\u8981\u7528\u5230\u6570\u5b66\u8bc1\u660e\uff0c\u4f8b\u5982\u5f52\u7eb3\u6cd5\u6216\u53cd\u8bc1\u6cd5\u7b49\u3002

\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6c42\u89e3\u95ee\u9898\u7684\u6838\u5fc3\u6b65\u9aa4\uff0c\u4f46\u5b9e\u65bd\u8d77\u6765\u53ef\u80fd\u5e76\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e0d\u540c\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\u7684\u5dee\u5f02\u8f83\u5927\u3002\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\u6765\u8bf4\uff0c\u8d2a\u5fc3\u7b56\u7565\u6bd4\u8f83\u6d45\u663e\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u4e0e\u5c1d\u8bd5\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5bf9\u4e8e\u4e00\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u9690\u853d\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u975e\u5e38\u8003\u9a8c\u4e2a\u4eba\u7684\u89e3\u9898\u7ecf\u9a8c\u4e0e\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
  • \u67d0\u4e9b\u8d2a\u5fc3\u7b56\u7565\u5177\u6709\u8f83\u5f3a\u7684\u8ff7\u60d1\u6027\u3002\u5f53\u6211\u4eec\u6ee1\u6000\u4fe1\u5fc3\u8bbe\u8ba1\u597d\u8d2a\u5fc3\u7b56\u7565\uff0c\u5199\u51fa\u89e3\u9898\u4ee3\u7801\u5e76\u63d0\u4ea4\u8fd0\u884c\uff0c\u5f88\u53ef\u80fd\u53d1\u73b0\u90e8\u5206\u6d4b\u8bd5\u6837\u4f8b\u65e0\u6cd5\u901a\u8fc7\u3002\u8fd9\u662f\u56e0\u4e3a\u8bbe\u8ba1\u7684\u8d2a\u5fc3\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u786e\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7ecd\u7684\u96f6\u94b1\u5151\u6362\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u6848\u4f8b\u3002

\u4e3a\u4e86\u4fdd\u8bc1\u6b63\u786e\u6027\uff0c\u6211\u4eec\u5e94\u8be5\u5bf9\u8d2a\u5fc3\u7b56\u7565\u8fdb\u884c\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8bc1\u6cd5\u6216\u6570\u5b66\u5f52\u7eb3\u6cd5\u3002

\u7136\u800c\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6ca1\u6709\u5934\u7eea\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u9762\u5411\u6d4b\u8bd5\u7528\u4f8b\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u4e0e\u9a8c\u8bc1\u8d2a\u5fc3\u7b56\u7565\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u5178\u578b\u4f8b\u9898","text":"

\u8d2a\u5fc3\u7b97\u6cd5\u5e38\u5e38\u5e94\u7528\u5728\u6ee1\u8db3\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u4f18\u5316\u95ee\u9898\u4e2d\uff0c\u4ee5\u4e0b\u5217\u4e3e\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8d2a\u5fc3\u7b97\u6cd5\u95ee\u9898\u3002

  • \u786c\u5e01\u627e\u96f6\u95ee\u9898\uff1a\u5728\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u603b\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u533a\u95f4\u8c03\u5ea6\u95ee\u9898\uff1a\u5047\u8bbe\u4f60\u6709\u4e00\u4e9b\u4efb\u52a1\uff0c\u6bcf\u4e2a\u4efb\u52a1\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u8fdb\u884c\uff0c\u4f60\u7684\u76ee\u6807\u662f\u5b8c\u6210\u5c3d\u53ef\u80fd\u591a\u7684\u4efb\u52a1\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u7ed3\u675f\u65f6\u95f4\u6700\u65e9\u7684\u4efb\u52a1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u5206\u6570\u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u8f7d\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6807\u662f\u9009\u62e9\u4e00\u7ec4\u7269\u54c1\uff0c\u4f7f\u5f97\u603b\u91cd\u91cf\u4e0d\u8d85\u8fc7\u8f7d\u91cd\u91cf\uff0c\u4e14\u603b\u4ef7\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u6027\u4ef7\u6bd4\u6700\u9ad8\uff08\u4ef7\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
  • \u80a1\u7968\u4e70\u5356\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u80a1\u7968\u7684\u5386\u53f2\u4ef7\u683c\uff0c\u4f60\u53ef\u4ee5\u8fdb\u884c\u591a\u6b21\u4e70\u5356\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7ecf\u6301\u6709\u80a1\u7968\uff0c\u90a3\u4e48\u5728\u5356\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u4e70\uff0c\u76ee\u6807\u662f\u83b7\u53d6\u6700\u5927\u5229\u6da6\u3002
  • \u970d\u592b\u66fc\u7f16\u7801\uff1a\u970d\u592b\u66fc\u7f16\u7801\u662f\u4e00\u79cd\u7528\u4e8e\u65e0\u635f\u6570\u636e\u538b\u7f29\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002\u901a\u8fc7\u6784\u5efa\u970d\u592b\u66fc\u6811\uff0c\u6bcf\u6b21\u9009\u62e9\u51fa\u73b0\u9891\u7387\u6700\u4f4e\u7684\u4e24\u4e2a\u8282\u70b9\u5408\u5e76\uff0c\u6700\u540e\u5f97\u5230\u7684\u970d\u592b\u66fc\u6811\u7684\u5e26\u6743\u8def\u5f84\u957f\u5ea6\uff08\u7f16\u7801\u957f\u5ea6\uff09\u6700\u5c0f\u3002
  • Dijkstra \u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u79cd\u89e3\u51b3\u7ed9\u5b9a\u6e90\u9876\u70b9\u5230\u5176\u4f59\u5404\u9876\u70b9\u7684\u6700\u77ed\u8def\u5f84\u95ee\u9898\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002
"},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898","text":"

Question

\u8f93\u5165\u4e00\u4e2a\u6570\u7ec4 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u4ee3\u8868\u4e00\u4e2a\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4e4b\u95f4\u7684\u7a7a\u95f4\u53ef\u4ee5\u7ec4\u6210\u4e00\u4e2a\u5bb9\u5668\u3002

\u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u7684\u4e58\u79ef\uff08\u9762\u79ef\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f83\u77ed\u7684\u9694\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u4e2a\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002

\u8bf7\u5728\u6570\u7ec4\u4e2d\u9009\u62e9\u4e24\u4e2a\u9694\u677f\uff0c\u4f7f\u5f97\u7ec4\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u56fe 15-7 \u6240\u793a\u3002

\u56fe 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

\u5bb9\u5668\u7531\u4efb\u610f\u4e24\u4e2a\u9694\u677f\u56f4\u6210\uff0c\u56e0\u6b64\u672c\u9898\u7684\u72b6\u6001\u4e3a\u4e24\u4e2a\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

\u6839\u636e\u9898\u610f\uff0c\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u4e58\u4ee5\u5bbd\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002\u8bbe\u5bb9\u91cf\u4e3a \\(cap[i, j]\\) \uff0c\u5219\u53ef\u5f97\u8ba1\u7b97\u516c\u5f0f\uff1a

\\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

\u8bbe\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u4e24\u4e2a\u9694\u677f\u7684\u7ec4\u5408\u6570\u91cf\uff08\u72b6\u6001\u603b\u6570\uff09\u4e3a \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u4e2a\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u7a77\u4e3e\u6240\u6709\u72b6\u6001\uff0c\u4ece\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u8fd9\u9053\u9898\u8fd8\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u56fe 15-8 \u6240\u793a\uff0c\u73b0\u9009\u53d6\u4e00\u4e2a\u72b6\u6001 \\([i, j]\\) \uff0c\u5176\u6ee1\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002

\u56fe 15-8 \u00a0 \u521d\u59cb\u72b6\u6001

\u5982\u56fe 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u65f6\u5c06\u957f\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5219\u5bb9\u91cf\u4e00\u5b9a\u53d8\u5c0f\u3002

\u8fd9\u662f\u56e0\u4e3a\u5728\u79fb\u52a8\u957f\u677f \\(j\\) \u540e\uff0c\u5bbd\u5ea6 \\(j-i\\) \u80af\u5b9a\u53d8\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u53d8\uff08 \\(i\\) \u4ecd\u4e3a\u77ed\u677f\uff09\u6216\u53d8\u5c0f\uff08\u79fb\u52a8\u540e\u7684 \\(j\\) \u6210\u4e3a\u77ed\u677f\uff09\u3002

\u56fe 15-9 \u00a0 \u5411\u5185\u79fb\u52a8\u957f\u677f\u540e\u7684\u72b6\u6001

\u53cd\u5411\u601d\u8003\uff0c\u6211\u4eec\u53ea\u6709\u5411\u5185\u6536\u7f29\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u53d8\u5927\u3002\u56e0\u4e3a\u867d\u7136\u5bbd\u5ea6\u4e00\u5b9a\u53d8\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u4f1a\u53d8\u5927\uff08\u79fb\u52a8\u540e\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u4f1a\u53d8\u957f\uff09\u3002\u4f8b\u5982\u5728\u56fe 15-10 \u4e2d\uff0c\u79fb\u52a8\u77ed\u677f\u540e\u9762\u79ef\u53d8\u5927\u3002

\u56fe 15-10 \u00a0 \u5411\u5185\u79fb\u52a8\u77ed\u677f\u540e\u7684\u72b6\u6001

\u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\uff1a\u521d\u59cb\u5316\u4e24\u6307\u9488\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u4e24\u7aef\uff0c\u6bcf\u8f6e\u5411\u5185\u6536\u7f29\u77ed\u677f\u5bf9\u5e94\u7684\u6307\u9488\uff0c\u76f4\u81f3\u4e24\u6307\u9488\u76f8\u9047\u3002

\u56fe 15-11 \u5c55\u793a\u4e86\u8d2a\u5fc3\u7b56\u7565\u7684\u6267\u884c\u8fc7\u7a0b\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u5217\u6570\u7ec4\u4e24\u7aef\u3002
  2. \u8ba1\u7b97\u5f53\u524d\u72b6\u6001\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u5e76\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
  3. \u6bd4\u8f83\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u5e76\u5c06\u77ed\u677f\u5411\u5185\u79fb\u52a8\u4e00\u683c\u3002
  4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u65f6\u7ed3\u675f\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u8d2a\u5fc3\u8fc7\u7a0b

"},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u4ee3\u7801\u5faa\u73af\u6700\u591a \\(n\\) \u8f6e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

\u53d8\u91cf \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res = 0\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
max_capacity.cpp
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.java
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.cs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.go
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res := 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.swift
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
max_capacity.js
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.ts
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.dart
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  int res = 0;\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
max_capacity.rs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let mut res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
max_capacity.c
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.kt
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.rb
[class]{}-[func]{max_capacity}\n
max_capacity.zig
[class]{}-[func]{maxCapacity}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u4e4b\u6240\u4ee5\u8d2a\u5fc3\u6bd4\u7a77\u4e3e\u66f4\u5feb\uff0c\u662f\u56e0\u4e3a\u6bcf\u8f6e\u7684\u8d2a\u5fc3\u9009\u62e9\u90fd\u4f1a\u201c\u8df3\u8fc7\u201d\u4e00\u4e9b\u72b6\u6001\u3002

\u6bd4\u5982\u5728\u72b6\u6001 \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002\u82e5\u8d2a\u5fc3\u5730\u5c06\u77ed\u677f \\(i\\) \u5411\u5185\u79fb\u52a8\u4e00\u683c\uff0c\u4f1a\u5bfc\u81f4\u56fe 15-12 \u6240\u793a\u7684\u72b6\u6001\u88ab\u201c\u8df3\u8fc7\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e4b\u540e\u65e0\u6cd5\u9a8c\u8bc1\u8fd9\u4e9b\u72b6\u6001\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

\\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

\u56fe 15-12 \u00a0 \u79fb\u52a8\u77ed\u677f\u5bfc\u81f4\u88ab\u8df3\u8fc7\u7684\u72b6\u6001

\u89c2\u5bdf\u53d1\u73b0\uff0c\u8fd9\u4e9b\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u957f\u677f \\(j\\) \u5411\u5185\u79fb\u52a8\u7684\u6240\u6709\u72b6\u6001\u3002\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u8bc1\u660e\u5185\u79fb\u957f\u677f\u4e00\u5b9a\u4f1a\u5bfc\u81f4\u5bb9\u91cf\u53d8\u5c0f\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u4f18\u89e3\uff0c\u8df3\u8fc7\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4\u9519\u8fc7\u6700\u4f18\u89e3\u3002

\u4ee5\u4e0a\u5206\u6790\u8bf4\u660e\uff0c\u79fb\u52a8\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5c06\u5176\u5207\u5206\u4e3a\u81f3\u5c11\u4e24\u4e2a\u6b63\u6574\u6570\u7684\u548c\uff0c\u6c42\u5207\u5206\u540e\u6240\u6709\u6574\u6570\u7684\u4e58\u79ef\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u56fe 15-13 \u6240\u793a\u3002

\u56fe 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u95ee\u9898\u5b9a\u4e49

\u5047\u8bbe\u6211\u4eec\u5c06 \\(n\\) \u5207\u5206\u4e3a \\(m\\) \u4e2a\u6574\u6570\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u4e2a\u56e0\u5b50\u8bb0\u4e3a \\(n_i\\) \uff0c\u5373

\\[ n = \\sum_{i=1}^{m}n_i \\]

\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u5f97\u6240\u6709\u6574\u6570\u56e0\u5b50\u7684\u6700\u5927\u4e58\u79ef\uff0c\u5373

\\[ \\max(\\prod_{i=1}^{m}n_i) \\]

\u6211\u4eec\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6570\u91cf \\(m\\) \u5e94\u8be5\u591a\u5927\uff0c\u6bcf\u4e2a \\(n_i\\) \u5e94\u8be5\u662f\u591a\u5c11\uff1f

"},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

\u6839\u636e\u7ecf\u9a8c\uff0c\u4e24\u4e2a\u6574\u6570\u7684\u4e58\u79ef\u5f80\u5f80\u6bd4\u5b83\u4eec\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8bbe\u4ece \\(n\\) \u4e2d\u5206\u51fa\u4e00\u4e2a\u56e0\u5b50 \\(2\\) \uff0c\u5219\u5b83\u4eec\u7684\u4e58\u79ef\u4e3a \\(2(n-2)\\) \u3002\u6211\u4eec\u5c06\u8be5\u4e58\u79ef\u4e0e \\(n\\) \u4f5c\u6bd4\u8f83\uff1a

\\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

\u5982\u56fe 15-14 \u6240\u793a\uff0c\u5f53 \\(n \\geq 4\\) \u65f6\uff0c\u5207\u5206\u51fa\u4e00\u4e2a \\(2\\) \u540e\u4e58\u79ef\u4f1a\u53d8\u5927\uff0c\u8fd9\u8bf4\u660e\u5927\u4e8e\u7b49\u4e8e \\(4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u88ab\u5207\u5206\u3002

\u8d2a\u5fc3\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u4e48\u5b83\u5c31\u5e94\u8be5\u88ab\u7ee7\u7eed\u5207\u5206\u3002\u6700\u7ec8\u7684\u5207\u5206\u65b9\u6848\u53ea\u5e94\u51fa\u73b0 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u79cd\u56e0\u5b50\u3002

\u56fe 15-14 \u00a0 \u5207\u5206\u5bfc\u81f4\u4e58\u79ef\u53d8\u5927

\u63a5\u4e0b\u6765\u601d\u8003\u54ea\u4e2a\u56e0\u5b50\u662f\u6700\u4f18\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u4e2a\u56e0\u5b50\u4e2d\uff0c\u663e\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u4e3a \\(1 \\times (n-1) < n\\) \u6052\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u4f1a\u5bfc\u81f4\u4e58\u79ef\u51cf\u5c0f\u3002

\u5982\u56fe 15-15 \u6240\u793a\uff0c\u5f53 \\(n = 6\\) \u65f6\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u8fd9\u610f\u5473\u7740\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u4f18\u3002

\u8d2a\u5fc3\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u53ea\u5e94\u5b58\u5728\u4e24\u4e2a \\(2\\) \u3002\u56e0\u4e3a\u4e09\u4e2a \\(2\\) \u603b\u662f\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002

\u56fe 15-15 \u00a0 \u6700\u4f18\u5207\u5206\u56e0\u5b50

\u7efc\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8d2a\u5fc3\u7b56\u7565\u3002

  1. \u8f93\u5165\u6574\u6570 \\(n\\) \uff0c\u4ece\u5176\u4e0d\u65ad\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u4f59\u6570\u4e3a \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
  2. \u5f53\u4f59\u6570\u4e3a \\(0\\) \u65f6\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6570\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u5904\u7406\u3002
  3. \u5f53\u4f59\u6570\u4e3a \\(2\\) \u65f6\uff0c\u4e0d\u7ee7\u7eed\u5212\u5206\uff0c\u4fdd\u7559\u3002
  4. \u5f53\u4f59\u6570\u4e3a \\(1\\) \u65f6\uff0c\u7531\u4e8e \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u5e94\u5c06\u6700\u540e\u4e00\u4e2a \\(3\\) \u66ff\u6362\u4e3a \\(2\\) \u3002
"},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5982\u56fe 15-16 \u6240\u793a\uff0c\u6211\u4eec\u65e0\u987b\u901a\u8fc7\u5faa\u73af\u6765\u5207\u5206\u6574\u6570\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u8fd0\u7b97\u5f97\u5230 \\(3\\) \u7684\u4e2a\u6570 \\(a\\) \uff0c\u7528\u53d6\u6a21\u8fd0\u7b97\u5f97\u5230\u4f59\u6570 \\(b\\) \uff0c\u6b64\u65f6\u6709\uff1a

\\[ n = 3 a + b \\]

\u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e \\(n \\leq 3\\) \u7684\u8fb9\u754c\u60c5\u51b5\uff0c\u5fc5\u987b\u62c6\u5206\u51fa\u4e00\u4e2a \\(1\\) \uff0c\u4e58\u79ef\u4e3a \\(1 \\times (n - 1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.pow(3, a)) * 2\n    # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.pow(3, a))\n
max_product_cutting.cpp
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)pow(3, a);\n}\n
max_product_cutting.java
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int) Math.pow(3, a);\n}\n
max_product_cutting.cs
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint MaxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)Math.Pow(3, a);\n}\n
max_product_cutting.go
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n int) int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
max_product_cutting.swift
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a)\n}\n
max_product_cutting.js
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.ts
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n: number): number {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.dart
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n  // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return pow(3, a).toInt();\n}\n
max_product_cutting.rs
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
max_product_cutting.c
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a);\n}\n
max_product_cutting.kt
/* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfun maxProductCutting(n: Int): Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return 3.0.pow(a).toInt()\n}\n
max_product_cutting.rb
[class]{}-[func]{max_product_cutting}\n
max_product_cutting.zig
[class]{}-[func]{maxProductCutting}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u56fe 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u8ba1\u7b97\u65b9\u6cd5

\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u5e42\u8fd0\u7b97\u7684\u5b9e\u73b0\u65b9\u6cd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5e38\u7528\u7684\u5e42\u8ba1\u7b97\u51fd\u6570\u6709\u4e09\u79cd\u3002

  • \u8fd0\u7b97\u7b26 ** \u548c\u51fd\u6570 pow() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log\u2061 a)\\) \u3002
  • \u51fd\u6570 math.pow() \u5185\u90e8\u8c03\u7528 C \u8bed\u8a00\u5e93\u7684 pow() \u51fd\u6570\uff0c\u5176\u6267\u884c\u6d6e\u70b9\u53d6\u5e42\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

\u53d8\u91cf \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

\u4f7f\u7528\u53cd\u8bc1\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u51b5\u3002

  1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u5c06\u5176\u7ee7\u7eed\u5212\u5206\u4e3a \\(2(x-2)\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
  2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u4e2a\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u4e48\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u5e76\u5165\u53e6\u5916\u4e00\u4e2a\u56e0\u5b50\u4e2d\uff0c\u4ee5\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
  3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u4e24\u4e2a \\(2\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u4e2a \\(2\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4e58\u79ef\u66f4\u5927\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
"},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7ed3","text":"
  • \u8d2a\u5fc3\u7b97\u6cd5\u901a\u5e38\u7528\u4e8e\u89e3\u51b3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\u90fd\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4f1a\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u4e2a\u53c8\u4e00\u4e2a\u7684\u8d2a\u5fc3\u9009\u62e9\uff0c\u6bcf\u8f6e\u90fd\u5c06\u95ee\u9898\u8f6c\u5316\u6210\u4e00\u4e2a\u89c4\u6a21\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u95ee\u9898\u88ab\u89e3\u51b3\u3002
  • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u5b9e\u73b0\u7b80\u5355\uff0c\u8fd8\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u9898\u6548\u7387\u3002\u76f8\u6bd4\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
  • \u5728\u96f6\u94b1\u5151\u6362\u95ee\u9898\u4e2d\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1b\u5bf9\u4e8e\u53e6\u5916\u4e00\u4e9b\u786c\u5e01\u7ec4\u5408\u5219\u4e0d\u7136\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
  • \u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u7684\u95ee\u9898\u5177\u6709\u4e24\u5927\u6027\u8d28\uff1a\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u4ee3\u8868\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
  • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u8bc1\u660e\u5e76\u4e0d\u7b80\u5355\u3002\u76f8\u5bf9\u6765\u8bf4\uff0c\u8bc1\u4f2a\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002
  • \u6c42\u89e3\u8d2a\u5fc3\u95ee\u9898\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\uff1a\u95ee\u9898\u5206\u6790\u3001\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u3001\u6b63\u786e\u6027\u8bc1\u660e\u3002\u5176\u4e2d\uff0c\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9aa4\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u5f80\u5f80\u662f\u96be\u70b9\u3002
  • \u5206\u6570\u80cc\u5305\u95ee\u9898\u5728 0-1 \u80cc\u5305\u7684\u57fa\u7840\u4e0a\uff0c\u5141\u8bb8\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u3002\u8d2a\u5fc3\u7b56\u7565\u7684\u6b63\u786e\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\u3002
  • \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u53ef\u4f7f\u7528\u7a77\u4e3e\u6cd5\u6c42\u89e3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u901a\u8fc7\u8bbe\u8ba1\u8d2a\u5fc3\u7b56\u7565\uff0c\u6bcf\u8f6e\u5411\u5185\u79fb\u52a8\u77ed\u677f\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \u3002
  • \u5728\u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u63a8\u7406\u51fa\u4e24\u4e2a\u8d2a\u5fc3\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u7ee7\u7eed\u5207\u5206\uff0c\u6700\u4f18\u5207\u5206\u56e0\u5b50\u4e3a \\(3\\) \u3002\u4ee3\u7801\u4e2d\u5305\u542b\u5e42\u8fd0\u7b97\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5e42\u8fd0\u7b97\u5b9e\u73b0\u65b9\u6cd5\uff0c\u901a\u5e38\u4e3a \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
"},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u54c8\u5e0c\u8868","text":"

Abstract

\u5728\u8ba1\u7b97\u673a\u4e16\u754c\u4e2d\uff0c\u54c8\u5e0c\u8868\u5982\u540c\u4e00\u4f4d\u806a\u6167\u7684\u56fe\u4e66\u7ba1\u7406\u5458\u3002

\u4ed6\u77e5\u9053\u5982\u4f55\u8ba1\u7b97\u7d22\u4e66\u53f7\uff0c\u4ece\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6807\u56fe\u4e66\u3002

"},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 6.1 \u00a0 \u54c8\u5e0c\u8868
  • 6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81
  • 6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5
  • 6.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5","text":"

\u524d\u4e24\u8282\u4ecb\u7ecd\u4e86\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u54c8\u5e0c\u51b2\u7a81\u7684\u5904\u7406\u65b9\u6cd5\u3002\u7136\u800c\u65e0\u8bba\u662f\u5f00\u653e\u5bfb\u5740\u8fd8\u662f\u94fe\u5f0f\u5730\u5740\uff0c\u5b83\u4eec\u53ea\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u53d1\u751f\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u65e0\u6cd5\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u3002

\u5982\u679c\u54c8\u5e0c\u51b2\u7a81\u8fc7\u4e8e\u9891\u7e41\uff0c\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u5219\u4f1a\u6025\u5267\u52a3\u5316\u3002\u5982\u56fe 6-8 \u6240\u793a\uff0c\u5bf9\u4e8e\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\uff0c\u7406\u60f3\u60c5\u51b5\u4e0b\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u5404\u4e2a\u6876\u4e2d\uff0c\u8fbe\u5230\u6700\u4f73\u67e5\u8be2\u6548\u7387\uff1b\u6700\u5dee\u60c5\u51b5\u4e0b\u6240\u6709\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u56fe 6-8 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u7684\u6700\u4f73\u60c5\u51b5\u4e0e\u6700\u5dee\u60c5\u51b5

\u952e\u503c\u5bf9\u7684\u5206\u5e03\u60c5\u51b5\u7531\u54c8\u5e0c\u51fd\u6570\u51b3\u5b9a\u3002\u56de\u5fc6\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u6b65\u9aa4\uff0c\u5148\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u518d\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\uff1a

index = hash(key) % capacity\n

\u89c2\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u65f6\uff0c\u54c8\u5e0c\u7b97\u6cd5 hash() \u51b3\u5b9a\u4e86\u8f93\u51fa\u503c\uff0c\u8fdb\u800c\u51b3\u5b9a\u4e86\u952e\u503c\u5bf9\u5728\u54c8\u5e0c\u8868\u4e2d\u7684\u5206\u5e03\u60c5\u51b5\u3002

\u8fd9\u610f\u5473\u7740\uff0c\u4e3a\u4e86\u964d\u4f4e\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u6982\u7387\uff0c\u6211\u4eec\u5e94\u5f53\u5c06\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u54c8\u5e0c\u7b97\u6cd5 hash() \u7684\u8bbe\u8ba1\u4e0a\u3002

"},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u76ee\u6807","text":"

\u4e3a\u4e86\u5b9e\u73b0\u201c\u65e2\u5feb\u53c8\u7a33\u201d\u7684\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u70b9\u3002

  • \u786e\u5b9a\u6027\uff1a\u5bf9\u4e8e\u76f8\u540c\u7684\u8f93\u5165\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u7684\u8f93\u51fa\u3002\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u54c8\u5e0c\u8868\u662f\u53ef\u9760\u7684\u3002
  • \u6548\u7387\u9ad8\uff1a\u8ba1\u7b97\u54c8\u5e0c\u503c\u7684\u8fc7\u7a0b\u5e94\u8be5\u8db3\u591f\u5feb\u3002\u8ba1\u7b97\u5f00\u9500\u8d8a\u5c0f\uff0c\u54c8\u5e0c\u8868\u7684\u5b9e\u7528\u6027\u8d8a\u9ad8\u3002
  • \u5747\u5300\u5206\u5e03\uff1a\u54c8\u5e0c\u7b97\u6cd5\u5e94\u4f7f\u5f97\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u54c8\u5e0c\u8868\u4e2d\u3002\u5206\u5e03\u8d8a\u5747\u5300\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002

\u5b9e\u9645\u4e0a\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u54c8\u5e0c\u8868\uff0c\u8fd8\u5e7f\u6cdb\u5e94\u7528\u4e8e\u5176\u4ed6\u9886\u57df\u4e2d\u3002

  • \u5bc6\u7801\u5b58\u50a8\uff1a\u4e3a\u4e86\u4fdd\u62a4\u7528\u6237\u5bc6\u7801\u7684\u5b89\u5168\uff0c\u7cfb\u7edf\u901a\u5e38\u4e0d\u4f1a\u76f4\u63a5\u5b58\u50a8\u7528\u6237\u7684\u660e\u6587\u5bc6\u7801\uff0c\u800c\u662f\u5b58\u50a8\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\u3002\u5f53\u7528\u6237\u8f93\u5165\u5bc6\u7801\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5bf9\u8f93\u5165\u7684\u5bc6\u7801\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u7136\u540e\u4e0e\u5b58\u50a8\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u5bc6\u7801\u5c31\u88ab\u89c6\u4e3a\u6b63\u786e\u3002
  • \u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5\uff1a\u6570\u636e\u53d1\u9001\u65b9\u53ef\u4ee5\u8ba1\u7b97\u6570\u636e\u7684\u54c8\u5e0c\u503c\u5e76\u5c06\u5176\u4e00\u540c\u53d1\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8ba1\u7b97\u63a5\u6536\u5230\u7684\u6570\u636e\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u4e0e\u63a5\u6536\u5230\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u6570\u636e\u5c31\u88ab\u89c6\u4e3a\u5b8c\u6574\u3002

\u5bf9\u4e8e\u5bc6\u7801\u5b66\u7684\u76f8\u5173\u5e94\u7528\uff0c\u4e3a\u4e86\u9632\u6b62\u4ece\u54c8\u5e0c\u503c\u63a8\u5bfc\u51fa\u539f\u59cb\u5bc6\u7801\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9700\u8981\u5177\u5907\u66f4\u9ad8\u7b49\u7ea7\u7684\u5b89\u5168\u7279\u6027\u3002

  • \u5355\u5411\u6027\uff1a\u65e0\u6cd5\u901a\u8fc7\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u5173\u4e8e\u8f93\u5165\u6570\u636e\u7684\u4efb\u4f55\u4fe1\u606f\u3002
  • \u6297\u78b0\u649e\u6027\uff1a\u5e94\u5f53\u6781\u96be\u627e\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\uff0c\u4f7f\u5f97\u5b83\u4eec\u7684\u54c8\u5e0c\u503c\u76f8\u540c\u3002
  • \u96ea\u5d29\u6548\u5e94\uff1a\u8f93\u5165\u7684\u5fae\u5c0f\u53d8\u5316\u5e94\u5f53\u5bfc\u81f4\u8f93\u51fa\u7684\u663e\u8457\u4e14\u4e0d\u53ef\u9884\u6d4b\u7684\u53d8\u5316\u3002

\u8bf7\u6ce8\u610f\uff0c\u201c\u5747\u5300\u5206\u5e03\u201d\u4e0e\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u6982\u5ff5\uff0c\u6ee1\u8db3\u5747\u5300\u5206\u5e03\u4e0d\u4e00\u5b9a\u6ee1\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u968f\u673a\u8f93\u5165 key \u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 key % 100 \u53ef\u4ee5\u4ea7\u751f\u5747\u5300\u5206\u5e03\u7684\u8f93\u51fa\u3002\u7136\u800c\u8be5\u54c8\u5e0c\u7b97\u6cd5\u8fc7\u4e8e\u7b80\u5355\uff0c\u6240\u6709\u540e\u4e24\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f93\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u4ece\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u4ece\u800c\u7834\u89e3\u5bc6\u7801\u3002

"},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1","text":"

\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u662f\u4e00\u4e2a\u9700\u8981\u8003\u8651\u8bb8\u591a\u56e0\u7d20\u7684\u590d\u6742\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f\uff0c\u6211\u4eec\u4e5f\u80fd\u8bbe\u8ba1\u4e00\u4e9b\u7b80\u5355\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

  • \u52a0\u6cd5\u54c8\u5e0c\uff1a\u5bf9\u8f93\u5165\u7684\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u8fdb\u884c\u76f8\u52a0\uff0c\u5c06\u5f97\u5230\u7684\u603b\u548c\u4f5c\u4e3a\u54c8\u5e0c\u503c\u3002
  • \u4e58\u6cd5\u54c8\u5e0c\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u5173\u6027\uff0c\u6bcf\u8f6e\u4e58\u4ee5\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5404\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u54c8\u5e0c\u503c\u4e2d\u3002
  • \u5f02\u6216\u54c8\u5e0c\uff1a\u5c06\u8f93\u5165\u6570\u636e\u7684\u6bcf\u4e2a\u5143\u7d20\u901a\u8fc7\u5f02\u6216\u64cd\u4f5c\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\u3002
  • \u65cb\u8f6c\u54c8\u5e0c\uff1a\u5c06\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u79ef\u4e4b\u524d\u90fd\u4f1a\u5bf9\u54c8\u5e0c\u503c\u8fdb\u884c\u65cb\u8f6c\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u89c2\u5bdf\u53d1\u73b0\uff0c\u6bcf\u79cd\u54c8\u5e0c\u7b97\u6cd5\u7684\u6700\u540e\u4e00\u6b65\u90fd\u662f\u5bf9\u5927\u8d28\u6570 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u786e\u4fdd\u54c8\u5e0c\u503c\u5728\u5408\u9002\u7684\u8303\u56f4\u5185\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u4e3a\u4ec0\u4e48\u8981\u5f3a\u8c03\u5bf9\u8d28\u6570\u53d6\u6a21\uff0c\u6216\u8005\u8bf4\u5bf9\u5408\u6570\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u4e48\uff1f\u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u95ee\u9898\u3002

\u5148\u629b\u51fa\u7ed3\u8bba\uff1a\u4f7f\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u7684\u5747\u5300\u5206\u5e03\u3002\u56e0\u4e3a\u8d28\u6570\u4e0d\u4e0e\u5176\u4ed6\u6570\u5b57\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u53ef\u4ee5\u51cf\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u4ea7\u751f\u7684\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u4ece\u800c\u907f\u514d\u54c8\u5e0c\u51b2\u7a81\u3002

\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u5408\u6570 \\(9\\) \u4f5c\u4e3a\u6a21\u6570\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u4e48\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u8fd9\u4e09\u4e2a\u54c8\u5e0c\u503c\u3002

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

\u5982\u679c\u8f93\u5165 key \u6070\u597d\u6ee1\u8db3\u8fd9\u79cd\u7b49\u5dee\u6570\u5217\u7684\u6570\u636e\u5206\u5e03\uff0c\u90a3\u4e48\u54c8\u5e0c\u503c\u5c31\u4f1a\u51fa\u73b0\u805a\u5806\uff0c\u4ece\u800c\u52a0\u91cd\u54c8\u5e0c\u51b2\u7a81\u3002\u73b0\u5728\uff0c\u5047\u8bbe\u5c06 modulus \u66ff\u6362\u4e3a\u8d28\u6570 \\(13\\) \uff0c\u7531\u4e8e key \u548c modulus \u4e4b\u95f4\u4e0d\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u56e0\u6b64\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u7684\u5747\u5300\u6027\u4f1a\u660e\u663e\u63d0\u5347\u3002

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u591f\u4fdd\u8bc1 key \u662f\u968f\u673a\u5747\u5300\u5206\u5e03\u7684\uff0c\u90a3\u4e48\u9009\u62e9\u8d28\u6570\u6216\u8005\u5408\u6570\u4f5c\u4e3a\u6a21\u6570\u90fd\u53ef\u4ee5\uff0c\u5b83\u4eec\u90fd\u80fd\u8f93\u51fa\u5747\u5300\u5206\u5e03\u7684\u54c8\u5e0c\u503c\u3002\u800c\u5f53 key \u7684\u5206\u5e03\u5b58\u5728\u67d0\u79cd\u5468\u671f\u6027\u65f6\uff0c\u5bf9\u5408\u6570\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73b0\u805a\u96c6\u73b0\u8c61\u3002

\u603b\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u901a\u5e38\u9009\u53d6\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u5e76\u4e14\u8fd9\u4e2a\u8d28\u6570\u6700\u597d\u8db3\u591f\u5927\uff0c\u4ee5\u5c3d\u53ef\u80fd\u6d88\u9664\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002

"},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u89c1\u54c8\u5e0c\u7b97\u6cd5","text":"

\u4e0d\u96be\u53d1\u73b0\uff0c\u4ee5\u4e0a\u4ecb\u7ecd\u7684\u7b80\u5355\u54c8\u5e0c\u7b97\u6cd5\u90fd\u6bd4\u8f83\u201c\u8106\u5f31\u201d\uff0c\u8fdc\u8fdc\u6ca1\u6709\u8fbe\u5230\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u76ee\u6807\u3002\u4f8b\u5982\uff0c\u7531\u4e8e\u52a0\u6cd5\u548c\u5f02\u6216\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u54c8\u5e0c\u548c\u5f02\u6216\u54c8\u5e0c\u65e0\u6cd5\u533a\u5206\u5185\u5bb9\u76f8\u540c\u4f46\u987a\u5e8f\u4e0d\u540c\u7684\u5b57\u7b26\u4e32\uff0c\u8fd9\u53ef\u80fd\u4f1a\u52a0\u5267\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e76\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u95ee\u9898\u3002

\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u7528\u4e00\u4e9b\u6807\u51c6\u54c8\u5e0c\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u4eec\u53ef\u4ee5\u5c06\u4efb\u610f\u957f\u5ea6\u7684\u8f93\u5165\u6570\u636e\u6620\u5c04\u5230\u6052\u5b9a\u957f\u5ea6\u7684\u54c8\u5e0c\u503c\u3002

\u8fd1\u4e00\u4e2a\u4e16\u7eaa\u4ee5\u6765\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5904\u5728\u4e0d\u65ad\u5347\u7ea7\u4e0e\u4f18\u5316\u7684\u8fc7\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u52aa\u529b\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u6027\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u548c\u9ed1\u5ba2\u5219\u81f4\u529b\u4e8e\u5bfb\u627e\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u95ee\u9898\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

  • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u51fb\uff0c\u56e0\u6b64\u5b83\u4eec\u88ab\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u5f03\u7528\u3002
  • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u54c8\u5e0c\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73b0\u6210\u529f\u7684\u653b\u51fb\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u4e2d\u3002
  • SHA-3 \u76f8\u8f83 SHA-2 \u7684\u5b9e\u73b0\u5f00\u9500\u66f4\u4f4e\u3001\u8ba1\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u76d6\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

\u8868 6-2 \u00a0 \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5

MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u65f6\u95f4 1992 1995 2002 2008 \u8f93\u51fa\u957f\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u54c8\u5e0c\u51b2\u7a81 \u8f83\u591a \u8f83\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7ea7 \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u9ad8 \u9ad8 \u5e94\u7528 \u5df2\u88ab\u5f03\u7528\uff0c\u4ecd\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5 \u5df2\u88ab\u5f03\u7528 \u52a0\u5bc6\u8d27\u5e01\u4ea4\u6613\u9a8c\u8bc1\u3001\u6570\u5b57\u7b7e\u540d\u7b49 \u53ef\u7528\u4e8e\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u54c8\u5e0c\u503c","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u54c8\u5e0c\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6570\u3001\u5c0f\u6570\u6216\u5b57\u7b26\u4e32\u7b49\u6570\u636e\u7c7b\u578b\u3002\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u8fd9\u4e9b\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u7528 hash() \u51fd\u6570\u6765\u8ba1\u7b97\u5404\u79cd\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u3002

  • \u6574\u6570\u548c\u5e03\u5c14\u91cf\u7684\u54c8\u5e0c\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
  • \u6d6e\u70b9\u6570\u548c\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u8f83\u4e3a\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8bf7\u81ea\u884c\u5b66\u4e60\u3002
  • \u5143\u7ec4\u7684\u54c8\u5e0c\u503c\u662f\u5bf9\u5176\u4e2d\u6bcf\u4e00\u4e2a\u5143\u7d20\u8fdb\u884c\u54c8\u5e0c\uff0c\u7136\u540e\u5c06\u8fd9\u4e9b\u54c8\u5e0c\u503c\u7ec4\u5408\u8d77\u6765\uff0c\u5f97\u5230\u5355\u4e00\u7684\u54c8\u5e0c\u503c\u3002
  • \u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u57fa\u4e8e\u5176\u5185\u5b58\u5730\u5740\u751f\u6210\u3002\u901a\u8fc7\u91cd\u5199\u5bf9\u8c61\u7684\u54c8\u5e0c\u65b9\u6cd5\uff0c\u53ef\u5b9e\u73b0\u57fa\u4e8e\u5185\u5bb9\u751f\u6210\u54c8\u5e0c\u503c\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u54c8\u5e0c\u503c\u8ba1\u7b97\u51fd\u6570\u7684\u5b9a\u4e49\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u5c14\u91cf True \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u8282\u70b9\u5bf9\u8c61 <ListNode object at 0x1058fd810> \u7684\u54c8\u5e0c\u503c\u4e3a 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u5c14\u91cf 1 \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5185\u7f6e std:hash() \u4ec5\u63d0\u4f9b\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\n// \u6570\u7ec4\u3001\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u9700\u8981\u81ea\u884c\u5b9e\u73b0\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@7dc5e7b4 \u7684\u54c8\u5e0c\u503c\u4e3a 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u8282\u70b9\u5bf9\u8c61 0 \u7684\u54c8\u5e0c\u503c\u4e3a 39053774;\n
built_in_hash.go
// Go \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u6570\u7ec4 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u54c8\u5e0c\u503c\u4e3a -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode \u7684\u54c8\u5e0c\u503c\u4e3a -2434780518035996159\n
built_in_hash.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u5c14\u503c true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u8282\u70b9\u5bf9\u8c61 Instance of 'ListNode' \u7684\u54c8\u5e0c\u503c\u4e3a 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7ec4 (12836, \"\u5c0f\u54c8\") \u7684\u54c8\u5e0c\u503c\u4e3a 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u8282\u70b9\u5bf9\u8c61 RefCell { value: ListNode { val: 42, next: None } } \u7684\u54c8\u5e0c\u503c\u4e3a15387811073369036852\n
built_in_hash.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
built_in_hash.kt
val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nval str = \"Hello \u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@1d81eb93 \u7684\u54c8\u5e0c\u503c\u4e3a 495053715\n
built_in_hash.rb
num = 3\nhash_num = num.hash\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1479186995943067893\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u8282\u70b9\u5bf9\u8c61 #<ListNode:0x000078133140ab70> \u7684\u54c8\u5e0c\u503c\u4e3a 4302940560806366381\n
built_in_hash.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5728\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u624d\u53ef\u4f5c\u4e3a\u54c8\u5e0c\u8868\u7684 key \u3002\u5047\u5982\u6211\u4eec\u5c06\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4f5c\u4e3a key \uff0c\u5f53\u5217\u8868\u7684\u5185\u5bb9\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u7684\u54c8\u5e0c\u503c\u4e5f\u968f\u4e4b\u6539\u53d8\uff0c\u6211\u4eec\u5c31\u65e0\u6cd5\u5728\u54c8\u5e0c\u8868\u4e2d\u67e5\u8be2\u5230\u539f\u5148\u7684 value \u4e86\u3002

\u867d\u7136\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08\u6bd4\u5982\u94fe\u8868\u8282\u70b9\uff09\u7684\u6210\u5458\u53d8\u91cf\u662f\u53ef\u53d8\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u54c8\u5e0c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u901a\u5e38\u662f\u57fa\u4e8e\u5185\u5b58\u5730\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u5bf9\u8c61\u7684\u5185\u5bb9\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u4f46\u5b83\u7684\u5185\u5b58\u5730\u5740\u4e0d\u53d8\uff0c\u54c8\u5e0c\u503c\u4ecd\u7136\u662f\u4e0d\u53d8\u7684\u3002

\u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u53d1\u73b0\u5728\u4e0d\u540c\u63a7\u5236\u53f0\u4e2d\u8fd0\u884c\u7a0b\u5e8f\u65f6\uff0c\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u662f\u4e0d\u540c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a Python \u89e3\u91ca\u5668\u5728\u6bcf\u6b21\u542f\u52a8\u65f6\uff0c\u90fd\u4f1a\u4e3a\u5b57\u7b26\u4e32\u54c8\u5e0c\u51fd\u6570\u52a0\u5165\u4e00\u4e2a\u968f\u673a\u7684\u76d0\uff08salt\uff09\u503c\u3002\u8fd9\u79cd\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u51fb\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

\u4e0a\u4e00\u8282\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a\u54c8\u5e0c\u51b2\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u6570\u7ec4\u5bb9\u91cf\u5927\u5c0f\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

\u54c8\u5e0c\u51b2\u7a81\u4f1a\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6bcf\u5f53\u9047\u5230\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u6211\u4eec\u5c31\u8fdb\u884c\u54c8\u5e0c\u8868\u6269\u5bb9\uff0c\u76f4\u81f3\u51b2\u7a81\u6d88\u5931\u4e3a\u6b62\u3002\u6b64\u65b9\u6cd5\u7b80\u5355\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u8981\u8fdb\u884c\u5927\u91cf\u7684\u6570\u636e\u642c\u8fd0\u4e0e\u54c8\u5e0c\u503c\u8ba1\u7b97\u3002\u4e3a\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

  1. \u6539\u826f\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u4f7f\u5f97\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\u3002
  2. \u4ec5\u5728\u5fc5\u8981\u65f6\uff0c\u5373\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u624d\u6267\u884c\u6269\u5bb9\u64cd\u4f5c\u3002

\u54c8\u5e0c\u8868\u7684\u7ed3\u6784\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u94fe\u5f0f\u5730\u5740\u201d\u548c\u201c\u5f00\u653e\u5bfb\u5740\u201d\u3002

"},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u94fe\u5f0f\u5730\u5740","text":"

\u5728\u539f\u59cb\u54c8\u5e0c\u8868\u4e2d\uff0c\u6bcf\u4e2a\u6876\u4ec5\u80fd\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u94fe\u5f0f\u5730\u5740\uff08separate chaining\uff09\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u6362\u4e3a\u94fe\u8868\uff0c\u5c06\u952e\u503c\u5bf9\u4f5c\u4e3a\u94fe\u8868\u8282\u70b9\uff0c\u5c06\u6240\u6709\u53d1\u751f\u51b2\u7a81\u7684\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5728\u540c\u4e00\u94fe\u8868\u4e2d\u3002\u56fe 6-5 \u5c55\u793a\u4e86\u4e00\u4e2a\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u4f8b\u5b50\u3002

\u56fe 6-5 \u00a0 \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868

\u57fa\u4e8e\u94fe\u5f0f\u5730\u5740\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u53d1\u751f\u4e86\u4ee5\u4e0b\u53d8\u5316\u3002

  • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u904d\u5386\u94fe\u8868\u5e76\u5bf9\u6bd4 key \u4ee5\u67e5\u627e\u76ee\u6807\u952e\u503c\u5bf9\u3002
  • \u6dfb\u52a0\u5143\u7d20\uff1a\u9996\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u952e\u503c\u5bf9\uff09\u6dfb\u52a0\u5230\u94fe\u8868\u4e2d\u3002
  • \u5220\u9664\u5143\u7d20\uff1a\u6839\u636e\u54c8\u5e0c\u51fd\u6570\u7684\u7ed3\u679c\u8bbf\u95ee\u94fe\u8868\u5934\u90e8\uff0c\u63a5\u7740\u904d\u5386\u94fe\u8868\u4ee5\u67e5\u627e\u76ee\u6807\u8282\u70b9\u5e76\u5c06\u5176\u5220\u9664\u3002

\u94fe\u5f0f\u5730\u5740\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

  • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff1a\u94fe\u8868\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u5b83\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
  • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\u3002

\u4ee5\u4e0b\u4ee3\u7801\u7ed9\u51fa\u4e86\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u7b80\u5355\u5b9e\u73b0\uff0c\u9700\u8981\u6ce8\u610f\u4e24\u70b9\u3002

  • \u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4ee3\u66ff\u94fe\u8868\uff0c\u4ece\u800c\u7b80\u5316\u4ee3\u7801\u3002\u5728\u8fd9\u79cd\u8bbe\u5b9a\u4e0b\uff0c\u54c8\u5e0c\u8868\uff08\u6570\u7ec4\uff09\u5305\u542b\u591a\u4e2a\u6876\uff0c\u6bcf\u4e2a\u6876\u90fd\u662f\u4e00\u4e2a\u5217\u8868\u3002
  • \u4ee5\u4e0b\u5b9e\u73b0\u5305\u542b\u54c8\u5e0c\u8868\u6269\u5bb9\u65b9\u6cd5\u3002\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(\\frac{2}{3}\\) \u65f6\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u94fe\u8868\u5f88\u957f\u65f6\uff0c\u67e5\u8be2\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u65f6\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u201cAVL \u6811\u201d\u6216\u201c\u7ea2\u9ed1\u6811\u201d\uff0c\u4ece\u800c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

\u5f00\u653e\u5bfb\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\u7b49\u3002

\u4e0b\u9762\u4ee5\u7ebf\u6027\u63a2\u6d4b\u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002

"},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7ebf\u6027\u63a2\u6d4b","text":"

\u7ebf\u6027\u63a2\u6d4b\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u641c\u7d22\u6765\u8fdb\u884c\u63a2\u6d4b\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u4e0e\u666e\u901a\u54c8\u5e0c\u8868\u6709\u6240\u4e0d\u540c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u53d1\u73b0\u6876\u5185\u5df2\u6709\u5143\u7d20\uff0c\u5219\u4ece\u51b2\u7a81\u4f4d\u7f6e\u5411\u540e\u7ebf\u6027\u904d\u5386\uff08\u6b65\u957f\u901a\u5e38\u4e3a \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
  • \u67e5\u627e\u5143\u7d20\uff1a\u82e5\u53d1\u73b0\u54c8\u5e0c\u51b2\u7a81\uff0c\u5219\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u5411\u540e\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u76f4\u5230\u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8bf4\u660e\u76ee\u6807\u5143\u7d20\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

\u56fe 6-6 \u5c55\u793a\u4e86\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03\u3002\u6839\u636e\u6b64\u54c8\u5e0c\u51fd\u6570\uff0c\u6700\u540e\u4e24\u4f4d\u76f8\u540c\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u901a\u8fc7\u7ebf\u6027\u63a2\u6d4b\uff0c\u5b83\u4eec\u88ab\u4f9d\u6b21\u5b58\u50a8\u5728\u8be5\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

\u56fe 6-6 \u00a0 \u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03

\u7136\u800c\uff0c\u7ebf\u6027\u63a2\u6d4b\u5bb9\u6613\u4ea7\u751f\u201c\u805a\u96c6\u73b0\u8c61\u201d\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6570\u7ec4\u4e2d\u8fde\u7eed\u88ab\u5360\u7528\u7684\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u4ece\u800c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8be5\u4f4d\u7f6e\u7684\u805a\u5806\u751f\u957f\uff0c\u5f62\u6210\u6076\u6027\u5faa\u73af\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e0d\u80fd\u5728\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u4e2d\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u8fd9\u662f\u56e0\u4e3a\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u6876 None \uff0c\u800c\u5f53\u67e5\u8be2\u5143\u7d20\u65f6\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230\u8be5\u7a7a\u6876\u5c31\u4f1a\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8be5\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u65e0\u6cd5\u518d\u88ab\u8bbf\u95ee\u5230\uff0c\u7a0b\u5e8f\u53ef\u80fd\u8bef\u5224\u8fd9\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u56fe 6-7 \u6240\u793a\u3002

\u56fe 6-7 \u00a0 \u5728\u5f00\u653e\u5bfb\u5740\u4e2d\u5220\u9664\u5143\u7d20\u5bfc\u81f4\u7684\u67e5\u8be2\u95ee\u9898

\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u61d2\u5220\u9664\uff08lazy deletion\uff09\u673a\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u4ece\u54c8\u5e0c\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u4e2a\u5e38\u91cf TOMBSTONE \u6765\u6807\u8bb0\u8fd9\u4e2a\u6876\u3002\u5728\u8be5\u673a\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u952e\u503c\u5bf9\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230 TOMBSTONE \u65f6\u5e94\u8be5\u7ee7\u7eed\u904d\u5386\uff0c\u56e0\u4e3a\u5176\u4e4b\u4e0b\u53ef\u80fd\u8fd8\u5b58\u5728\u952e\u503c\u5bf9\u3002

\u7136\u800c\uff0c\u61d2\u5220\u9664\u53ef\u80fd\u4f1a\u52a0\u901f\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u9000\u5316\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6b21\u5220\u9664\u64cd\u4f5c\u90fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5220\u9664\u6807\u8bb0\uff0c\u968f\u7740 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u7d22\u65f6\u95f4\u4e5f\u4f1a\u589e\u52a0\uff0c\u56e0\u4e3a\u7ebf\u6027\u63a2\u6d4b\u53ef\u80fd\u9700\u8981\u8df3\u8fc7\u591a\u4e2a TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6807\u5143\u7d20\u3002

\u4e3a\u6b64\uff0c\u8003\u8651\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a TOMBSTONE \u7684\u7d22\u5f15\uff0c\u5e76\u5c06\u641c\u7d22\u5230\u7684\u76ee\u6807\u5143\u7d20\u4e0e\u8be5 TOMBSTONE \u4ea4\u6362\u4f4d\u7f6e\u3002\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\u5f53\u6bcf\u6b21\u67e5\u8be2\u6216\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u81f3\u8ddd\u79bb\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6d4b\u8d77\u59cb\u70b9\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u4ece\u800c\u4f18\u5316\u67e5\u8be2\u6548\u7387\u3002

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5305\u542b\u61d2\u5220\u9664\u7684\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u3002\u4e3a\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u770b\u4f5c\u4e00\u4e2a\u201c\u73af\u5f62\u6570\u7ec4\u201d\uff0c\u5f53\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6d4b","text":"

\u5e73\u65b9\u63a2\u6d4b\u4e0e\u7ebf\u6027\u63a2\u6d4b\u7c7b\u4f3c\uff0c\u90fd\u662f\u5f00\u653e\u5bfb\u5740\u7684\u5e38\u89c1\u7b56\u7565\u4e4b\u4e00\u3002\u5f53\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e0d\u662f\u7b80\u5355\u5730\u8df3\u8fc7\u4e00\u4e2a\u56fa\u5b9a\u7684\u6b65\u6570\uff0c\u800c\u662f\u8df3\u8fc7\u201c\u63a2\u6d4b\u6b21\u6570\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6570\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

\u5e73\u65b9\u63a2\u6d4b\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\u3002

  • \u5e73\u65b9\u63a2\u6d4b\u901a\u8fc7\u8df3\u8fc7\u63a2\u6d4b\u6b21\u6570\u5e73\u65b9\u7684\u8ddd\u79bb\uff0c\u8bd5\u56fe\u7f13\u89e3\u7ebf\u6027\u63a2\u6d4b\u7684\u805a\u96c6\u6548\u5e94\u3002
  • \u5e73\u65b9\u63a2\u6d4b\u4f1a\u8df3\u8fc7\u66f4\u5927\u7684\u8ddd\u79bb\u6765\u5bfb\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u4e8e\u6570\u636e\u5206\u5e03\u5f97\u66f4\u52a0\u5747\u5300\u3002

\u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6d4b\u5e76\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

  • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73b0\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u5360\u7528\u3002
  • \u7531\u4e8e\u5e73\u65b9\u7684\u589e\u957f\uff0c\u5e73\u65b9\u63a2\u6d4b\u53ef\u80fd\u4e0d\u4f1a\u63a2\u6d4b\u6574\u4e2a\u54c8\u5e0c\u8868\uff0c\u8fd9\u610f\u5473\u7740\u5373\u4f7f\u54c8\u5e0c\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e5f\u53ef\u80fd\u65e0\u6cd5\u8bbf\u95ee\u5230\u5b83\u3002
"},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u54c8\u5e0c","text":"

\u987e\u540d\u601d\u4e49\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u8fdb\u884c\u63a2\u6d4b\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) \u51fa\u73b0\u51b2\u7a81\uff0c\u5219\u5c1d\u8bd5 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u540e\u63d2\u5165\u5143\u7d20\u3002
  • \u67e5\u627e\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u54c8\u5e0c\u51fd\u6570\u987a\u5e8f\u4e0b\u8fdb\u884c\u67e5\u627e\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u65f6\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de None \u3002

\u4e0e\u7ebf\u6027\u63a2\u6d4b\u76f8\u6bd4\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u4f1a\u5e26\u6765\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\uff09\u54c8\u5e0c\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u201d\u7684\u95ee\u9898\u3002

"},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u9009\u62e9","text":"

\u5404\u79cd\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u7b56\u7565\uff0c\u4e0b\u9762\u4e3e\u51e0\u4e2a\u4f8b\u5b50\u3002

  • Python \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002
  • Java \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002
  • Go \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002Go \u89c4\u5b9a\u6bcf\u4e2a\u6876\u6700\u591a\u5b58\u50a8 8 \u4e2a\u952e\u503c\u5bf9\uff0c\u8d85\u51fa\u5bb9\u91cf\u5219\u8fde\u63a5\u4e00\u4e2a\u6ea2\u51fa\u6876\uff1b\u5f53\u6ea2\u51fa\u6876\u8fc7\u591a\u65f6\uff0c\u4f1a\u6267\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u6269\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u786e\u4fdd\u6027\u80fd\u3002
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u54c8\u5e0c\u8868","text":"

\u54c8\u5e0c\u8868\uff08hash table\uff09\uff0c\u53c8\u79f0\u6563\u5217\u8868\uff0c\u5b83\u901a\u8fc7\u5efa\u7acb\u952e key \u4e0e\u503c value \u4e4b\u95f4\u7684\u6620\u5c04\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8be2\u3002\u5177\u4f53\u800c\u8a00\uff0c\u6211\u4eec\u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u4e00\u4e2a\u952e key \uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684\u503c value \u3002

\u5982\u56fe 6-1 \u6240\u793a\uff0c\u7ed9\u5b9a \\(n\\) \u4e2a\u5b66\u751f\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b66\u53f7\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\u7684\u67e5\u8be2\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u56fe 6-1 \u6240\u793a\u7684\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

\u56fe 6-1 \u00a0 \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5b83\u4eec\u7684\u6548\u7387\u5bf9\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

  • \u6dfb\u52a0\u5143\u7d20\uff1a\u4ec5\u9700\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u6570\u7ec4\uff08\u94fe\u8868\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
  • \u67e5\u8be2\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\uff08\u94fe\u8868\uff09\u662f\u4e71\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u904d\u5386\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u5220\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8be2\u5230\u5143\u7d20\uff0c\u518d\u4ece\u6570\u7ec4\uff08\u94fe\u8868\uff09\u4e2d\u5220\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002

\u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8be2\u6548\u7387\u5bf9\u6bd4

\u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u54c8\u5e0c\u8868\u4e2d\u8fdb\u884c\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u54c8\u5e0c\u8868\u7684\u5e38\u89c1\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u548c\u5220\u9664\u952e\u503c\u5bf9\u7b49\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap: dict = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.pop(10583)\n
hash_map.cpp
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
hash_map.java
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u5570\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.cs
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nDictionary<int, string> map = new() {\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    // \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u5570\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9e2d\" }\n};\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
hash_map_test.go
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nhmap := make(map[int]string)\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(hmap, 10583)\n
hash_map.swift
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\n
hash_map.ts
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map<number, string>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\nconsole.info('\\n\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f93\u5165\u5b66\u53f7 15937 \uff0c\u67e5\u8be2\u5230\u59d3\u540d ' + name);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\nconsole.info('\\n\u5220\u9664 10583 \u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<int, String> map = {};\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u5570\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9e2d\".to_string());\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.kt
/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583)\n
hash_map.rb
# \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.delete(10583)\n
hash_map.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u5f0f\uff1a\u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u548c\u904d\u5386\u503c\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in hmap.keys():\n    print(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u904d\u5386 key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\n    print(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
hash_map.rs
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
hash_map.kt
/* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (key in map.keys) {\n    println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
hash_map.rb
# \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u5355\u72ec\u904d\u5386\u952e key\nhmap.keys.each { |key| puts key }\n\n# \u5355\u72ec\u904d\u5386\u503c value\nhmap.values.each { |val| puts val }\n
hash_map.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u54c8\u5e0c\u8868\u7b80\u5355\u5b9e\u73b0","text":"

\u6211\u4eec\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u6876\uff08bucket\uff09\uff0c\u6bcf\u4e2a\u6876\u53ef\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u56e0\u6b64\uff0c\u67e5\u8be2\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5bf9\u5e94\u7684\u6876\uff0c\u5e76\u5728\u6876\u4e2d\u83b7\u53d6 value \u3002

\u90a3\u4e48\uff0c\u5982\u4f55\u57fa\u4e8e key \u5b9a\u4f4d\u5bf9\u5e94\u7684\u6876\u5462\uff1f\u8fd9\u662f\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\uff08hash function\uff09\u5b9e\u73b0\u7684\u3002\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u8f93\u51fa\u7a7a\u95f4\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8f93\u5165\u7a7a\u95f4\u662f\u6240\u6709 key \uff0c\u8f93\u51fa\u7a7a\u95f4\u662f\u6240\u6709\u6876\uff08\u6570\u7ec4\u7d22\u5f15\uff09\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u8f93\u5165\u4e00\u4e2a key \uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u8be5 key \u5bf9\u5e94\u7684\u952e\u503c\u5bf9\u5728\u6570\u7ec4\u4e2d\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002

\u8f93\u5165\u4e00\u4e2a key \uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u8fc7\u7a0b\u5206\u4e3a\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u901a\u8fc7\u67d0\u79cd\u54c8\u5e0c\u7b97\u6cd5 hash() \u8ba1\u7b97\u5f97\u5230\u54c8\u5e0c\u503c\u3002
  2. \u5c06\u54c8\u5e0c\u503c\u5bf9\u6876\u6570\u91cf\uff08\u6570\u7ec4\u957f\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u4ece\u800c\u83b7\u53d6\u8be5 key \u5bf9\u5e94\u7684\u6570\u7ec4\u7d22\u5f15 index \u3002
index = hash(key) % capacity\n

\u968f\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u54c8\u5e0c\u8868\u4e2d\u8bbf\u95ee\u5bf9\u5e94\u7684\u6876\uff0c\u4ece\u800c\u83b7\u53d6 value \u3002

\u8bbe\u6570\u7ec4\u957f\u5ea6 capacity = 100\u3001\u54c8\u5e0c\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u54c8\u5e0c\u51fd\u6570\u4e3a key % 100 \u3002\u56fe 6-2 \u4ee5 key \u5b66\u53f7\u548c value \u59d3\u540d\u4e3a\u4f8b\uff0c\u5c55\u793a\u4e86\u54c8\u5e0c\u51fd\u6570\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u56fe 6-2 \u00a0 \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u7b80\u5355\u54c8\u5e0c\u8868\u3002\u5176\u4e2d\uff0c\u6211\u4eec\u5c06 key \u548c value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Pair \uff0c\u4ee5\u8868\u793a\u952e\u503c\u5bf9\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u4e0e\u6269\u5bb9","text":"

\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u6240\u6709 key \u6784\u6210\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u6570\u7ec4\u6240\u6709\u7d22\u5f15\u6784\u6210\u7684\u8f93\u51fa\u7a7a\u95f4\uff0c\u800c\u8f93\u5165\u7a7a\u95f4\u5f80\u5f80\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7406\u8bba\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u76f8\u540c\u8f93\u51fa\u201d\u7684\u60c5\u51b5\u3002

\u5bf9\u4e8e\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u51fa\u7ed3\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a 12836 \u548c 20336 \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

12836 % 100 = 36\n20336 % 100 = 36\n

\u5982\u56fe 6-3 \u6240\u793a\uff0c\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002\u6211\u4eec\u5c06\u8fd9\u79cd\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u540c\u4e00\u8f93\u51fa\u7684\u60c5\u51b5\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\uff08hash collision\uff09\u3002

\u56fe 6-3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

\u5bb9\u6613\u60f3\u5230\uff0c\u54c8\u5e0c\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u4e2a key \u88ab\u5206\u914d\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\uff0c\u51b2\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002

\u5982\u56fe 6-4 \u6240\u793a\uff0c\u6269\u5bb9\u524d\u952e\u503c\u5bf9 (136, A) \u548c (236, D) \u53d1\u751f\u51b2\u7a81\uff0c\u6269\u5bb9\u540e\u51b2\u7a81\u6d88\u5931\u3002

\u56fe 6-4 \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9

\u7c7b\u4f3c\u4e8e\u6570\u7ec4\u6269\u5bb9\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u5c06\u6240\u6709\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u8fc1\u79fb\u81f3\u65b0\u54c8\u5e0c\u8868\uff0c\u975e\u5e38\u8017\u65f6\uff1b\u5e76\u4e14\u7531\u4e8e\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u6539\u53d8\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u6765\u91cd\u65b0\u8ba1\u7b97\u6240\u6709\u952e\u503c\u5bf9\u7684\u5b58\u50a8\u4f4d\u7f6e\uff0c\u8fd9\u8fdb\u4e00\u6b65\u589e\u52a0\u4e86\u6269\u5bb9\u8fc7\u7a0b\u7684\u8ba1\u7b97\u5f00\u9500\u3002\u4e3a\u6b64\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u9884\u7559\u8db3\u591f\u5927\u7684\u54c8\u5e0c\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u9891\u7e41\u6269\u5bb9\u3002

\u8d1f\u8f7d\u56e0\u5b50\uff08load factor\uff09\u662f\u54c8\u5e0c\u8868\u7684\u4e00\u4e2a\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u7684\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u7528\u4e8e\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u8f93\u5165 key \uff0c\u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u67e5\u8be2\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u3001\u5220\u9664\u952e\u503c\u5bf9\u548c\u904d\u5386\u54c8\u5e0c\u8868\u7b49\u3002
  • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff0c\u4ece\u800c\u8bbf\u95ee\u5bf9\u5e94\u6876\u5e76\u83b7\u53d6 value \u3002
  • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u3002\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u7684\u5f00\u9500\u5f88\u5927\u3002
  • \u8d1f\u8f7d\u56e0\u5b50\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u53cd\u6620\u4e86\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89e6\u53d1\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u6761\u4ef6\u3002
  • \u94fe\u5f0f\u5730\u5740\u901a\u8fc7\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u5316\u4e3a\u94fe\u8868\uff0c\u5c06\u6240\u6709\u51b2\u7a81\u5143\u7d20\u5b58\u50a8\u5728\u540c\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002\u7136\u800c\uff0c\u94fe\u8868\u8fc7\u957f\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u8fdb\u4e00\u6b65\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6765\u63d0\u9ad8\u6548\u7387\u3002
  • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\u3002\u7ebf\u6027\u63a2\u6d4b\u4f7f\u7528\u56fa\u5b9a\u6b65\u957f\uff0c\u7f3a\u70b9\u662f\u4e0d\u80fd\u5220\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u591a\u6b21\u54c8\u5e0c\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u8fdb\u884c\u63a2\u6d4b\uff0c\u76f8\u8f83\u7ebf\u6027\u63a2\u6d4b\u66f4\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u589e\u52a0\u4e86\u8ba1\u7b97\u91cf\u3002
  • \u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
  • \u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5e0c\u671b\u54c8\u5e0c\u7b97\u6cd5\u5177\u6709\u786e\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u5300\u5206\u5e03\u7684\u7279\u70b9\u3002\u5728\u5bc6\u7801\u5b66\u4e2d\uff0c\u54c8\u5e0c\u7b97\u6cd5\u8fd8\u5e94\u8be5\u5177\u5907\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u5e94\u3002
  • \u54c8\u5e0c\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u5747\u5300\u5206\u5e03\uff0c\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002
  • \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u4e8e\u6821\u9a8c\u6587\u4ef6\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u4e8e\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u3002
  • \u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u662f\u53ef\u54c8\u5e0c\u7684\u3002
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f \\(O(n)\\) \uff1f

\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u5f53\u54c8\u5e0c\u51fd\u6570\u8bbe\u8ba1\u5f97\u6bd4\u8f83\u597d\u3001\u5bb9\u91cf\u8bbe\u7f6e\u6bd4\u8f83\u5408\u7406\u3001\u51b2\u7a81\u6bd4\u8f83\u5e73\u5747\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u4eec\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u54c8\u5e0c\u8868\u65f6\uff0c\u901a\u5e38\u8ba4\u4e3a\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u4e0d\u4f7f\u7528\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x\\) \u5462\uff1f\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u51b2\u7a81\u4e86\u3002

\u5728 \\(f(x) = x\\) \u54c8\u5e0c\u51fd\u6570\u4e0b\uff0c\u6bcf\u4e2a\u5143\u7d20\u5bf9\u5e94\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u8fd9\u4e0e\u6570\u7ec4\u7b49\u4ef7\u3002\u7136\u800c\uff0c\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff08\u6570\u7ec4\u957f\u5ea6\uff09\uff0c\u56e0\u6b64\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u54c8\u5e0c\u8868\u7684\u76ee\u6807\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u72b6\u6001\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u7a7a\u95f4\uff0c\u5e76\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8be2\u6548\u7387\u3002

Q\uff1a\u54c8\u5e0c\u8868\u5e95\u5c42\u5b9e\u73b0\u662f\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u4eec\u66f4\u9ad8\u5462\uff1f

\u9996\u5148\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\uff0c\u4f46\u7a7a\u95f4\u6548\u7387\u53d8\u4f4e\u4e86\u3002\u54c8\u5e0c\u8868\u6709\u76f8\u5f53\u4e00\u90e8\u5206\u5185\u5b58\u672a\u4f7f\u7528\u3002

\u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u573a\u666f\u4e0b\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u4e2a\u529f\u80fd\u80fd\u591f\u5728\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\uff0c\u90a3\u4e48\u901a\u5e38\u6bd4\u54c8\u5e0c\u8868\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u9700\u8981\u5f00\u9500\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u6570\u9879\u66f4\u5927\u3002

\u6700\u540e\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u53d1\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u94fe\u5f0f\u5730\u5740\u4e2d\uff0c\u6211\u4eec\u91c7\u53d6\u5728\u94fe\u8868\u6216\u7ea2\u9ed1\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u65f6\u95f4\u7684\u98ce\u9669\u3002

Q\uff1a\u591a\u6b21\u54c8\u5e0c\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\u5417\uff1f\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u8fd8\u80fd\u518d\u6b21\u4f7f\u7528\u5417\uff1f

\u591a\u6b21\u54c8\u5e0c\u662f\u5f00\u653e\u5bfb\u5740\u7684\u4e00\u79cd\uff0c\u5f00\u653e\u5bfb\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u901a\u8fc7\u6807\u8bb0\u5220\u9664\u3002\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u5f53\u5c06\u65b0\u5143\u7d20\u63d2\u5165\u54c8\u5e0c\u8868\uff0c\u5e76\u4e14\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u4f4d\u7f6e\u65f6\uff0c\u8be5\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u8fd9\u6837\u505a\u65e2\u80fd\u4fdd\u6301\u54c8\u5e0c\u8868\u7684\u63a2\u6d4b\u5e8f\u5217\u4e0d\u53d8\uff0c\u53c8\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\u4f7f\u7528\u7387\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\uff0c\u67e5\u627e\u5143\u7d20\u7684\u65f6\u5019\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f

\u67e5\u627e\u7684\u65f6\u5019\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u5bf9\u5e94\u7684\u6876\u548c\u952e\u503c\u5bf9\uff0c\u53d1\u73b0 key \u4e0d\u5339\u914d\uff0c\u8fd9\u5c31\u4ee3\u8868\u6709\u54c8\u5e0c\u51b2\u7a81\u3002\u56e0\u6b64\uff0c\u7ebf\u6027\u63a2\u6d4b\u6cd5\u4f1a\u6839\u636e\u9884\u5148\u8bbe\u5b9a\u7684\u6b65\u957f\u4f9d\u6b21\u5411\u4e0b\u67e5\u627e\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u786e\u7684\u952e\u503c\u5bf9\u6216\u65e0\u6cd5\u627e\u5230\u8df3\u51fa\u4e3a\u6b62\u3002

Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u6269\u5bb9\u80fd\u591f\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff1f

\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\uff0c\u8ba9\u8f93\u51fa\u503c\u843d\u5728\u6570\u7ec4\u7d22\u5f15\u8303\u56f4\u5185\uff1b\u5728\u6269\u5bb9\u540e\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d1\u751f\u53d8\u5316\uff0c\u800c key \u5bf9\u5e94\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u4e2a\u6876\u7684\u591a\u4e2a key \uff0c\u5728\u6269\u5bb9\u540e\u53ef\u80fd\u4f1a\u88ab\u5206\u914d\u5230\u591a\u4e2a\u6876\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u54c8\u5e0c\u51b2\u7a81\u7684\u7f13\u89e3\u3002

"},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806","text":"

Abstract

\u5806\u5c31\u50cf\u662f\u5c71\u5cb3\u5cf0\u5ce6\uff0c\u5c42\u53e0\u8d77\u4f0f\u3001\u5f62\u6001\u5404\u5f02\u3002

\u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u9519\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u603b\u662f\u6700\u5148\u6620\u5165\u773c\u5e18\u3002

"},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 8.1 \u00a0 \u5806
  • 8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c
  • 8.3 \u00a0 Top-k \u95ee\u9898
  • 8.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c","text":"

\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u6765\u6784\u5efa\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u3002

"},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u501f\u52a9\u5165\u5806\u64cd\u4f5c\u5b9e\u73b0","text":"

\u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u904d\u5386\u5217\u8868\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u5143\u7d20\u6267\u884c\u201c\u5165\u5806\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u5806\u7684\u5c3e\u90e8\uff0c\u518d\u5bf9\u8be5\u5143\u7d20\u6267\u884c\u201c\u4ece\u5e95\u81f3\u9876\u201d\u5806\u5316\u3002

\u6bcf\u5f53\u4e00\u4e2a\u5143\u7d20\u5165\u5806\uff0c\u5806\u7684\u957f\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u4e8e\u8282\u70b9\u662f\u4ece\u9876\u5230\u5e95\u4f9d\u6b21\u88ab\u6dfb\u52a0\u8fdb\u4e8c\u53c9\u6811\u7684\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u6784\u5efa\u7684\u3002

\u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6bcf\u4e2a\u5143\u7d20\u7684\u5165\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u65f6\u95f4\uff0c\u56e0\u6b64\u8be5\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u901a\u8fc7\u904d\u5386\u5806\u5316\u5b9e\u73b0","text":"

\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u66f4\u4e3a\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5171\u5206\u4e3a\u4e24\u6b65\u3002

  1. \u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u5730\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u6b64\u65f6\u5806\u7684\u6027\u8d28\u5c1a\u672a\u5f97\u5230\u6ee1\u8db3\u3002
  2. \u5012\u5e8f\u904d\u5386\u5806\uff08\u5c42\u5e8f\u904d\u5386\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u975e\u53f6\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002

\u6bcf\u5f53\u5806\u5316\u4e00\u4e2a\u8282\u70b9\u540e\uff0c\u4ee5\u8be5\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\u5c31\u5f62\u6210\u4e00\u4e2a\u5408\u6cd5\u7684\u5b50\u5806\u3002\u800c\u7531\u4e8e\u662f\u5012\u5e8f\u904d\u5386\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u6784\u5efa\u7684\u3002

\u4e4b\u6240\u4ee5\u9009\u62e9\u5012\u5e8f\u904d\u5386\uff0c\u662f\u56e0\u4e3a\u8fd9\u6837\u80fd\u591f\u4fdd\u8bc1\u5f53\u524d\u8282\u70b9\u4e4b\u4e0b\u7684\u5b50\u6811\u5df2\u7ecf\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u8fd9\u6837\u5806\u5316\u5f53\u524d\u8282\u70b9\u624d\u662f\u6709\u6548\u7684\u3002

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u7531\u4e8e\u53f6\u8282\u70b9\u6ca1\u6709\u5b50\u8282\u70b9\uff0c\u56e0\u6b64\u5b83\u4eec\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u65e0\u987b\u5806\u5316\u3002\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6700\u540e\u4e00\u4e2a\u975e\u53f6\u8282\u70b9\u662f\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u6211\u4eec\u4ece\u5b83\u5f00\u59cb\u5012\u5e8f\u904d\u5386\u5e76\u6267\u884c\u5806\u5316\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

\u4e0b\u9762\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u63a8\u7b97\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

  • \u5047\u8bbe\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1) / 2\\) \u3002
  • \u5728\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e2a\u8282\u70b9\u6700\u591a\u5806\u5316\u5230\u53f6\u8282\u70b9\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u4e3a\u4e8c\u53c9\u6811\u9ad8\u5ea6 \\(\\log n\\) \u3002

\u5c06\u4e0a\u8ff0\u4e24\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u8fc7\u7a0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u4f46\u8fd9\u4e2a\u4f30\u7b97\u7ed3\u679c\u5e76\u4e0d\u51c6\u786e\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u8003\u8651\u5230\u4e8c\u53c9\u6811\u5e95\u5c42\u8282\u70b9\u6570\u91cf\u8fdc\u591a\u4e8e\u9876\u5c42\u8282\u70b9\u7684\u6027\u8d28\u3002

\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u51c6\u786e\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u964d\u4f4e\u8ba1\u7b97\u96be\u5ea6\uff0c\u5047\u8bbe\u7ed9\u5b9a\u4e00\u4e2a\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \u3001\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002

\u56fe 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

\u5982\u56fe 8-5 \u6240\u793a\uff0c\u8282\u70b9\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u7b49\u4e8e\u8be5\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u800c\u8be5\u8ddd\u79bb\u6b63\u662f\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u8282\u70b9\u7684\u5806\u5316\u8fed\u4ee3\u6b21\u6570\u7684\u603b\u548c\u3002

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

\u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5c06 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

\u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

\u89c2\u5bdf\u4e0a\u5f0f\uff0c\u53d1\u73b0 \\(T(h)\\) \u662f\u4e00\u4e2a\u7b49\u6bd4\u6570\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

\u8fdb\u4e00\u6b65\uff0c\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u590d\u6742\u5ea6\u4e3a \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806","text":"

\u5806\uff08heap\uff09\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u4e3b\u8981\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff0c\u5982\u56fe 8-1 \u6240\u793a\u3002

  • \u5c0f\u9876\u5806\uff08min heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002
  • \u5927\u9876\u5806\uff08max heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002

\u56fe 8-1 \u00a0 \u5c0f\u9876\u5806\u4e0e\u5927\u9876\u5806

\u5806\u4f5c\u4e3a\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u6700\u5e95\u5c42\u8282\u70b9\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u3002
  • \u6211\u4eec\u5c06\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u9876\u201d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u5e95\u201d\u3002
  • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u6839\u8282\u70b9\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u4f18\u5148\u961f\u5217\uff08priority queue\uff09\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b9a\u4e49\u4e3a\u5177\u6709\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u961f\u5217\u3002

\u5b9e\u9645\u4e0a\uff0c\u5806\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u7684\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u201c\u4f18\u5148\u961f\u5217\u201d\u548c\u201c\u5806\u201d\u770b\u4f5c\u7b49\u4ef7\u7684\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u672c\u4e66\u5bf9\u4e24\u8005\u4e0d\u505a\u7279\u522b\u533a\u5206\uff0c\u7edf\u4e00\u79f0\u4f5c\u201c\u5806\u201d\u3002

\u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\u8868 8-1 \u00a0 \u5806\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u5806 \\(O(\\log n)\\) pop() \u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) peek() \u8bbf\u95ee\u5806\u9876\u5143\u7d20\uff08\u5bf9\u4e8e\u5927 / \u5c0f\u9876\u5806\u5206\u522b\u4e3a\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u83b7\u53d6\u5806\u7684\u5143\u7d20\u6570\u91cf \\(O(1)\\) isEmpty() \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a \\(O(1)\\)

\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u5806\u7c7b\uff08\u6216\u4f18\u5148\u961f\u5217\u7c7b\uff09\u3002

\u7c7b\u4f3c\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u201c\u4ece\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u4ece\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e2a flag \u6216\u4fee\u6539 Comparator \u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
heap.kt
/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

\u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\u8fdb\u884c\u9006\u8f6c\uff08\u4f8b\u5982\uff0c\u5c06 \\(\\geq\\) \u66ff\u6362\u4e3a \\(\\leq\\) \uff09\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

"},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u8bb2\u8fc7\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u7531\u4e8e\u5806\u6b63\u662f\u4e00\u79cd\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u91c7\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002

\u5f53\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u4e8c\u53c9\u6811\u65f6\uff0c\u5143\u7d20\u4ee3\u8868\u8282\u70b9\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u8282\u70b9\u5728\u4e8c\u53c9\u6811\u4e2d\u7684\u4f4d\u7f6e\u3002\u8282\u70b9\u6307\u9488\u901a\u8fc7\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u6765\u5b9e\u73b0\u3002

\u5982\u56fe 8-2 \u6240\u793a\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

\u56fe 8-2 \u00a0 \u5806\u7684\u8868\u793a\u4e0e\u5b58\u50a8

\u6211\u4eec\u53ef\u4ee5\u5c06\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8bbf\u95ee\u5806\u9876\u5143\u7d20","text":"

\u5806\u9876\u5143\u7d20\u5373\u4e3a\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u4e5f\u5c31\u662f\u5217\u8868\u7684\u9996\u4e2a\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806","text":"

\u7ed9\u5b9a\u5143\u7d20 val \uff0c\u6211\u4eec\u9996\u5148\u5c06\u5176\u6dfb\u52a0\u5230\u5806\u5e95\u3002\u6dfb\u52a0\u4e4b\u540e\uff0c\u7531\u4e8e val \u53ef\u80fd\u5927\u4e8e\u5806\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7684\u6210\u7acb\u6761\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u574f\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u590d\u4ece\u63d2\u5165\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u88ab\u79f0\u4e3a\u5806\u5316\uff08heapify\uff09\u3002

\u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5982\u56fe 8-3 \u6240\u793a\uff0c\u6211\u4eec\u6bd4\u8f83\u63d2\u5165\u8282\u70b9\u4e0e\u5176\u7236\u8282\u70b9\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u8282\u70b9\u66f4\u5927\uff0c\u5219\u5c06\u5b83\u4eec\u4ea4\u6362\u3002\u7136\u540e\u7ee7\u7eed\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4ece\u5e95\u81f3\u9876\u4fee\u590d\u5806\u4e2d\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u76f4\u81f3\u8d8a\u8fc7\u6839\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6><7><8><9>

\u56fe 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u6b65\u9aa4

\u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u6811\u7684\u9ad8\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u5316\u64cd\u4f5c\u7684\u5faa\u73af\u8f6e\u6570\u6700\u591a\u4e3a \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806","text":"

\u5806\u9876\u5143\u7d20\u662f\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u5373\u5217\u8868\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u4ece\u5217\u8868\u4e2d\u5220\u9664\u9996\u5143\u7d20\uff0c\u90a3\u4e48\u4e8c\u53c9\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u7d22\u5f15\u90fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u8fd9\u5c06\u4f7f\u5f97\u540e\u7eed\u4f7f\u7528\u5806\u5316\u8fdb\u884c\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\u3002

  1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\u3002
  2. \u4ea4\u6362\u5b8c\u6210\u540e\uff0c\u5c06\u5806\u5e95\u4ece\u5217\u8868\u4e2d\u5220\u9664\uff08\u6ce8\u610f\uff0c\u7531\u4e8e\u5df2\u7ecf\u4ea4\u6362\uff0c\u56e0\u6b64\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\u3002
  3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\u3002

\u5982\u56fe 8-4 \u6240\u793a\uff0c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u201c\u4ece\u5e95\u81f3\u9876\u5806\u5316\u201d\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u8282\u70b9\u7684\u503c\u4e0e\u5176\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u503c\u8fdb\u884c\u6bd4\u8f83\uff0c\u5c06\u6700\u5927\u7684\u5b50\u8282\u70b9\u4e0e\u6839\u8282\u70b9\u4ea4\u6362\u3002\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

<1><2><3><4><5><6><7><8><9><10>

\u56fe 8-4 \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806\u6b65\u9aa4

\u4e0e\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u9876\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7684\u5e38\u89c1\u5e94\u7528","text":"
  • \u4f18\u5148\u961f\u5217\uff1a\u5806\u901a\u5e38\u4f5c\u4e3a\u5b9e\u73b0\u4f18\u5148\u961f\u5217\u7684\u9996\u9009\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \uff0c\u800c\u5efa\u961f\u64cd\u4f5c\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
  • \u5806\u6392\u5e8f\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u4eec\u5efa\u7acb\u4e00\u4e2a\u5806\uff0c\u7136\u540e\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u201c\u5806\u6392\u5e8f\u201d\u7ae0\u8282\u3002
  • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u5806\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u6839\u636e\u6210\u7acb\u6761\u4ef6\u53ef\u5206\u4e3a\u5927\u9876\u5806\u548c\u5c0f\u9876\u5806\u3002\u5927\uff08\u5c0f\uff09\u9876\u5806\u7684\u5806\u9876\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
  • \u4f18\u5148\u961f\u5217\u7684\u5b9a\u4e49\u662f\u5177\u6709\u51fa\u961f\u4f18\u5148\u7ea7\u7684\u961f\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u6765\u5b9e\u73b0\u3002
  • \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806 \\(O(\\log n)\\)\u3001\u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) \u548c\u8bbf\u95ee\u5806\u9876\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
  • \u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u8868\u793a\uff0c\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002
  • \u5806\u5316\u64cd\u4f5c\u7528\u4e8e\u7ef4\u62a4\u5806\u7684\u6027\u8d28\uff0c\u5728\u5165\u5806\u548c\u51fa\u5806\u64cd\u4f5c\u4e2d\u90fd\u4f1a\u7528\u5230\u3002
  • \u8f93\u5165 \\(n\\) \u4e2a\u5143\u7d20\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
  • Top-k \u662f\u4e00\u4e2a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u6570\u636e\u7ed3\u6784\u9ad8\u6548\u89e3\u51b3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6570\u636e\u7ed3\u6784\u7684\u201c\u5806\u201d\u4e0e\u5185\u5b58\u7ba1\u7406\u7684\u201c\u5806\u201d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\u5417\uff1f

\u4e24\u8005\u4e0d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u201d\u3002\u8ba1\u7b97\u673a\u7cfb\u7edf\u5185\u5b58\u4e2d\u7684\u5806\u662f\u52a8\u6001\u5185\u5b58\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5b58\u50a8\u6570\u636e\u3002\u7a0b\u5e8f\u53ef\u4ee5\u8bf7\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u5185\u5b58\uff0c\u7528\u4e8e\u5b58\u50a8\u5982\u5bf9\u8c61\u548c\u6570\u7ec4\u7b49\u590d\u6742\u7ed3\u6784\u3002\u5f53\u8fd9\u4e9b\u6570\u636e\u4e0d\u518d\u9700\u8981\u65f6\uff0c\u7a0b\u5e8f\u9700\u8981\u91ca\u653e\u8fd9\u4e9b\u5185\u5b58\uff0c\u4ee5\u9632\u6b62\u5185\u5b58\u6cc4\u6f0f\u3002\u76f8\u8f83\u4e8e\u6808\u5185\u5b58\uff0c\u5806\u5185\u5b58\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8c28\u614e\uff0c\u4f7f\u7528\u4e0d\u5f53\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u548c\u91ce\u6307\u9488\u7b49\u95ee\u9898\u3002

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u95ee\u9898","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u65e0\u5e8f\u6570\u7ec4 nums \uff0c\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002

\u5bf9\u4e8e\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u5148\u4ecb\u7ecd\u4e24\u79cd\u601d\u8def\u6bd4\u8f83\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7ecd\u6548\u7387\u66f4\u9ad8\u7684\u5806\u89e3\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u904d\u5386\u9009\u62e9","text":"

\u6211\u4eec\u53ef\u4ee5\u8fdb\u884c\u56fe 8-6 \u6240\u793a\u7684 \\(k\\) \u8f6e\u904d\u5386\uff0c\u5206\u522b\u5728\u6bcf\u8f6e\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\) \u3002

\u6b64\u65b9\u6cd5\u53ea\u9002\u7528\u4e8e \\(k \\ll n\\) \u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u5f53 \\(k\\) \u4e0e \\(n\\) \u6bd4\u8f83\u63a5\u8fd1\u65f6\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411\u4e8e \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u65f6\u3002

\u56fe 8-6 \u00a0 \u904d\u5386\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

Tip

\u5f53 \\(k = n\\) \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u65f6\u7b49\u4ef7\u4e8e\u201c\u9009\u62e9\u6392\u5e8f\u201d\u7b97\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

\u5982\u56fe 8-7 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u5bf9\u6570\u7ec4 nums \u8fdb\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u8fb9\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

\u663e\u7136\uff0c\u8be5\u65b9\u6cd5\u201c\u8d85\u989d\u201d\u5b8c\u6210\u4efb\u52a1\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

\u56fe 8-7 \u00a0 \u6392\u5e8f\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

"},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806","text":"

\u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u5806\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u51b3 Top-k \u95ee\u9898\uff0c\u6d41\u7a0b\u5982\u56fe 8-8 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5176\u5806\u9876\u5143\u7d20\u6700\u5c0f\u3002
  2. \u5148\u5c06\u6570\u7ec4\u7684\u524d \\(k\\) \u4e2a\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u3002
  3. \u4ece\u7b2c \\(k + 1\\) \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\uff0c\u5e76\u5c06\u5f53\u524d\u5143\u7d20\u5165\u5806\u3002
  4. \u904d\u5386\u5b8c\u6210\u540e\uff0c\u5806\u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 8-8 \u00a0 \u57fa\u4e8e\u5806\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u603b\u5171\u6267\u884c\u4e86 \\(n\\) \u8f6e\u5165\u5806\u548c\u51fa\u5806\uff0c\u5806\u7684\u6700\u5927\u957f\u5ea6\u4e3a \\(k\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002\u8be5\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u5f53 \\(k\\) \u8f83\u5c0f\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \uff1b\u5f53 \\(k\\) \u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(O(n \\log n)\\) \u3002

\u53e6\u5916\uff0c\u8be5\u65b9\u6cd5\u9002\u7528\u4e8e\u52a8\u6001\u6570\u636e\u6d41\u7684\u4f7f\u7528\u573a\u666f\u3002\u5728\u4e0d\u65ad\u52a0\u5165\u6570\u636e\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u6301\u7eed\u7ef4\u62a4\u5806\u5185\u7684\u5143\u7d20\uff0c\u4ece\u800c\u5b9e\u73b0\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u7684\u52a8\u6001\u66f4\u65b0\u3002

"},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

\u51e0\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u5251\u6307 Offer\u201d\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u8bfb\u8005\u7684\u9f13\u52b1\u548c\u652f\u6301\u3002\u5728\u4e0e\u8bfb\u8005\u4ea4\u6d41\u671f\u95f4\uff0c\u6211\u6700\u5e38\u88ab\u95ee\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u7b97\u6cd5\u201d\u3002\u9010\u6e10\u5730\uff0c\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u4ea7\u751f\u4e86\u6d53\u539a\u7684\u5174\u8da3\u3002

\u4e24\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u9898\u4f3c\u4e4e\u662f\u6700\u53d7\u6b22\u8fce\u7684\u65b9\u6cd5\uff0c\u7b80\u5355\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u4eba\u80fd\u591f\u987a\u5229\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u4eba\u6765\u8bf4\uff0c\u6bd5\u4e1a\u8bba\u6587\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u548c\u9762\u8bd5\u5df2\u7ecf\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u4e66\u5f80\u5f80\u53d8\u6210\u4e86\u4e00\u9879\u8270\u5de8\u7684\u6311\u6218\u3002

\u5982\u679c\u4f60\u4e5f\u9762\u4e34\u7c7b\u4f3c\u7684\u56f0\u6270\uff0c\u90a3\u4e48\u5f88\u5e78\u8fd0\u8fd9\u672c\u4e66\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u4f18\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u672c\u4e66\u867d\u7136\u4e0d\u8db3\u4ee5\u8ba9\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u4f1a\u5f15\u5bfc\u4f60\u63a2\u7d22\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u201c\u77e5\u8bc6\u5730\u56fe\u201d\uff0c\u5e26\u4f60\u4e86\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72b6\u3001\u5927\u5c0f\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8ba9\u4f60\u638c\u63e1\u5404\u79cd\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u8fd9\u4e9b\u672c\u9886\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

\u6211\u6df1\u6df1\u8d5e\u540c\u8d39\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u4ece\u8fd9\u4e2a\u610f\u4e49\u4e0a\u770b\uff0c\u8fd9\u672c\u4e66\u5e76\u975e\u5b8c\u5168\u201c\u514d\u8d39\u201d\u3002\u4e3a\u4e86\u4e0d\u8f9c\u8d1f\u4f60\u4e3a\u672c\u4e66\u6240\u4ed8\u51fa\u7684\u5b9d\u8d35\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u4f1a\u7aed\u5c3d\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u6765\u5b8c\u6210\u672c\u4e66\u7684\u521b\u4f5c\u3002

\u672c\u4eba\u81ea\u77e5\u5b66\u758f\u624d\u6d45\uff0c\u4e66\u4e2d\u5185\u5bb9\u867d\u7136\u5df2\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8bb8\u591a\u9519\u8bef\uff0c\u6073\u8bf7\u5404\u4f4d\u8001\u5e08\u548c\u540c\u5b66\u6279\u8bc4\u6307\u6b63\u3002

Hello\uff0c\u7b97\u6cd5\uff01

\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u7ed9\u4e16\u754c\u5e26\u6765\u4e86\u5de8\u5927\u53d8\u9769\uff0c\u5b83\u51ed\u501f\u9ad8\u901f\u7684\u8ba1\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7f16\u7a0b\u6027\uff0c\u6210\u4e3a\u4e86\u6267\u884c\u7b97\u6cd5\u4e0e\u5904\u7406\u6570\u636e\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u65e0\u8bba\u662f\u7535\u5b50\u6e38\u620f\u7684\u903c\u771f\u753b\u9762\u3001\u81ea\u52a8\u9a7e\u9a76\u7684\u667a\u80fd\u51b3\u7b56\uff0c\u8fd8\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4ea4\u4e92\uff0c\u8fd9\u4e9b\u5e94\u7528\u90fd\u662f\u7b97\u6cd5\u5728\u8ba1\u7b97\u673a\u4e0a\u7684\u7cbe\u5999\u6f14\u7ece\u3002

\u4e8b\u5b9e\u4e0a\uff0c\u5728\u8ba1\u7b97\u673a\u95ee\u4e16\u4e4b\u524d\uff0c\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u5c31\u5df2\u7ecf\u5b58\u5728\u4e8e\u4e16\u754c\u7684\u5404\u4e2a\u89d2\u843d\u3002\u65e9\u671f\u7684\u7b97\u6cd5\u76f8\u5bf9\u7b80\u5355\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8ba1\u6570\u65b9\u6cd5\u548c\u5de5\u5177\u5236\u4f5c\u6b65\u9aa4\u7b49\u3002\u968f\u7740\u6587\u660e\u7684\u8fdb\u6b65\uff0c\u7b97\u6cd5\u9010\u6e10\u53d8\u5f97\u66f4\u52a0\u7cbe\u7ec6\u548c\u590d\u6742\u3002\u4ece\u5de7\u593a\u5929\u5de5\u7684\u5320\u4eba\u6280\u827a\u3001\u5230\u89e3\u653e\u751f\u4ea7\u529b\u7684\u5de5\u4e1a\u4ea7\u54c1\u3001\u518d\u5230\u5b87\u5b99\u8fd0\u884c\u7684\u79d1\u5b66\u89c4\u5f8b\uff0c\u51e0\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u60ca\u53f9\u7684\u4e8b\u7269\u80cc\u540e\uff0c\u90fd\u9690\u85cf\u7740\u7cbe\u5999\u7684\u7b97\u6cd5\u601d\u60f3\u3002

\u540c\u6837\uff0c\u6570\u636e\u7ed3\u6784\u65e0\u5904\u4e0d\u5728\uff1a\u5927\u5230\u793e\u4f1a\u7f51\u7edc\uff0c\u5c0f\u5230\u5730\u94c1\u7ebf\u8def\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u5efa\u6a21\u4e3a\u201c\u56fe\u201d\uff1b\u5927\u5230\u4e00\u4e2a\u56fd\u5bb6\uff0c\u5c0f\u5230\u4e00\u4e2a\u5bb6\u5ead\uff0c\u793e\u4f1a\u7684\u4e3b\u8981\u7ec4\u7ec7\u5f62\u5f0f\u5448\u73b0\u51fa\u201c\u6811\u201d\u7684\u7279\u5f81\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u6808\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u540e\u624d\u80fd\u8131\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5219\u5982\u540c\u201c\u961f\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u4e2a\u201c\u54c8\u5e0c\u8868\u201d\uff0c\u80fd\u591f\u5feb\u901f\u67e5\u627e\u76ee\u6807\u8bcd\u6761\u3002

\u672c\u4e66\u65e8\u5728\u901a\u8fc7\u6e05\u6670\u6613\u61c2\u7684\u52a8\u753b\u56fe\u89e3\u548c\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u4f7f\u8bfb\u8005\u7406\u89e3\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u6765\u5b9e\u73b0\u5b83\u4eec\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u672c\u4e66\u81f4\u529b\u4e8e\u63ed\u793a\u7b97\u6cd5\u5728\u590d\u6742\u4e16\u754c\u4e2d\u7684\u751f\u52a8\u4f53\u73b0\uff0c\u5c55\u73b0\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8bc6\u7b97\u6cd5","text":"

Abstract

\u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u4e0e\u6570\u636e\u4ea4\u7ec7\u5728\u4e00\u8d77\uff0c\u88d9\u6446\u4e0a\u98d8\u626c\u7740\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

\u5979\u9080\u8bf7\u4f60\u5171\u821e\uff0c\u8bf7\u7d27\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6ee1\u903b\u8f91\u4e0e\u7f8e\u611f\u7684\u7b97\u6cd5\u4e16\u754c\u3002

"},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728
  • 1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48
  • 1.3 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728","text":"

\u5f53\u6211\u4eec\u542c\u5230\u201c\u7b97\u6cd5\u201d\u8fd9\u4e2a\u8bcd\u65f6\uff0c\u5f88\u81ea\u7136\u5730\u4f1a\u60f3\u5230\u6570\u5b66\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7b97\u6cd5\u5e76\u4e0d\u6d89\u53ca\u590d\u6742\u6570\u5b66\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8d56\u57fa\u672c\u903b\u8f91\uff0c\u8fd9\u4e9b\u903b\u8f91\u5728\u6211\u4eec\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u5904\u5904\u53ef\u89c1\u3002

\u5728\u6b63\u5f0f\u63a2\u8ba8\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u4e2a\u6709\u8da3\u7684\u4e8b\u5b9e\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u5b83\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c06\u4e3e\u51e0\u4e2a\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

\u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u91cc\uff0c\u6bcf\u4e2a\u6c49\u5b57\u90fd\u5bf9\u5e94\u4e00\u4e2a\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\u7684\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2a\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u4f1a\u6309\u7167\u56fe 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002

  1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff0c\u5047\u8bbe\u9996\u5b57\u6bcd\u4e3a \\(m\\) \u3002
  2. \u7531\u4e8e\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u4e8e \\(m\\) \u4e4b\u540e\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u627e\u8303\u56f4\u7f29\u5c0f\u5230\u540e\u534a\u90e8\u5206\u3002
  3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1. \u548c \u6b65\u9aa4 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
<1><2><3><4><5>

\u56fe 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9aa4

\u67e5\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u7b97\u6cd5\u3002\u4ece\u6570\u636e\u7ed3\u6784\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b57\u5178\u89c6\u4e3a\u4e00\u4e2a\u5df2\u6392\u5e8f\u7684\u201c\u6570\u7ec4\u201d\uff1b\u4ece\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u67e5\u627e\u201d\u3002

\u4f8b\u4e8c\uff1a\u6574\u7406\u6251\u514b\u3002\u6211\u4eec\u5728\u6253\u724c\u65f6\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u6251\u514b\u724c\uff0c\u4f7f\u5176\u4ece\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5b9e\u73b0\u6d41\u7a0b\u5982\u56fe 1-2 \u6240\u793a\u3002

  1. \u5c06\u6251\u514b\u724c\u5212\u5206\u4e3a\u201c\u6709\u5e8f\u201d\u548c\u201c\u65e0\u5e8f\u201d\u4e24\u90e8\u5206\uff0c\u5e76\u5047\u8bbe\u521d\u59cb\u72b6\u6001\u4e0b\u6700\u5de6 1 \u5f20\u6251\u514b\u724c\u5df2\u7ecf\u6709\u5e8f\u3002
  2. \u5728\u65e0\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f20\u6251\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\uff1b\u5b8c\u6210\u540e\u6700\u5de6 2 \u5f20\u6251\u514b\u5df2\u7ecf\u6709\u5e8f\u3002
  3. \u4e0d\u65ad\u5faa\u73af\u6b65\u9aa4 2. \uff0c\u6bcf\u4e00\u8f6e\u5c06\u4e00\u5f20\u6251\u514b\u724c\u4ece\u65e0\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u6251\u514b\u724c\u90fd\u6709\u5e8f\u3002

\u56fe 1-2 \u00a0 \u6251\u514b\u6392\u5e8f\u6b65\u9aa4

\u4e0a\u8ff0\u6574\u7406\u6251\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u5b83\u5728\u5904\u7406\u5c0f\u578b\u6570\u636e\u96c6\u65f6\u975e\u5e38\u9ad8\u6548\u3002\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u7684\u6392\u5e8f\u5e93\u51fd\u6570\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

\u4f8b\u4e09\uff1a\u8d27\u5e01\u627e\u96f6\u3002\u5047\u8bbe\u6211\u4eec\u5728\u8d85\u5e02\u8d2d\u4e70\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7ed9\u4e86\u6536\u94f6\u5458 \\(100\\) \u5143\uff0c\u5219\u6536\u94f6\u5458\u9700\u8981\u627e\u6211\u4eec \\(31\\) \u5143\u3002\u4ed6\u4f1a\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u56fe 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

  1. \u53ef\u9009\u9879\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8d27\u5e01\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
  2. \u4ece\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u4f59 \\(31 - 20 = 11\\) \u5143\u3002
  3. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u4f59 \\(11 - 10 = 1\\) \u5143\u3002
  4. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u4f59 \\(1 - 1 = 0\\) \u5143\u3002
  5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u4e3a \\(20 + 10 + 1 = 31\\) \u5143\u3002

\u56fe 1-3 \u00a0 \u8d27\u5e01\u627e\u96f6\u8fc7\u7a0b

\u5728\u4ee5\u4e0a\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\uff08\u5c3d\u53ef\u80fd\u7528\u5927\u9762\u989d\u7684\u8d27\u5e01\uff09\uff0c\u6700\u7ec8\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u8d2a\u5fc3\u201d\u7b97\u6cd5\u3002

\u5c0f\u5230\u70f9\u996a\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u9645\u822a\u884c\uff0c\u51e0\u4e4e\u6240\u6709\u95ee\u9898\u7684\u89e3\u51b3\u90fd\u79bb\u4e0d\u5f00\u7b97\u6cd5\u3002\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u4f7f\u5f97\u6211\u4eec\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u5c06\u6570\u636e\u7ed3\u6784\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\uff0c\u540c\u65f6\u7f16\u5199\u4ee3\u7801\u8c03\u7528 CPU \u548c GPU \u6267\u884c\u7b97\u6cd5\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u95ee\u9898\u8f6c\u79fb\u5230\u8ba1\u7b97\u673a\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u51b3\u5404\u79cd\u590d\u6742\u95ee\u9898\u3002

Tip

\u5982\u679c\u4f60\u5bf9\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u3001\u6570\u7ec4\u548c\u4e8c\u5206\u67e5\u627e\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8bf7\u7ee7\u7eed\u5f80\u4e0b\u9605\u8bfb\uff0c\u672c\u4e66\u5c06\u5f15\u5bfc\u4f60\u8fc8\u5165\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u77e5\u8bc6\u6bbf\u5802\u3002

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7ed3","text":"
  • \u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u65e0\u5904\u4e0d\u5728\uff0c\u5e76\u4e0d\u662f\u9065\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8bc6\u3002\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
  • \u67e5\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\u3002
  • \u6574\u7406\u6251\u514b\u7684\u8fc7\u7a0b\u4e0e\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u975e\u5e38\u7c7b\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u9002\u5408\u6392\u5e8f\u5c0f\u578b\u6570\u636e\u96c6\u3002
  • \u8d27\u5e01\u627e\u96f6\u7684\u6b65\u9aa4\u672c\u8d28\u4e0a\u662f\u8d2a\u5fc3\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\u3002
  • \u7b97\u6cd5\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u800c\u6570\u636e\u7ed3\u6784\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002
  • \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7d27\u5bc6\u76f8\u8fde\u3002\u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002
  • \u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728\uff0c\u79ef\u6728\u4ee3\u8868\u6570\u636e\uff0c\u79ef\u6728\u7684\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u7b49\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\u3002
"},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

Q\uff1a\u4f5c\u4e3a\u4e00\u540d\u7a0b\u5e8f\u5458\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u4ece\u672a\u7528\u7b97\u6cd5\u89e3\u51b3\u8fc7\u95ee\u9898\uff0c\u5e38\u7528\u7b97\u6cd5\u90fd\u88ab\u7f16\u7a0b\u8bed\u8a00\u5c01\u88c5\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u8fd9\u662f\u5426\u610f\u5473\u7740\u6211\u4eec\u5de5\u4f5c\u4e2d\u7684\u95ee\u9898\u8fd8\u6ca1\u6709\u5230\u8fbe\u9700\u8981\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

\u5982\u679c\u628a\u5177\u4f53\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8bdd\uff0c\u90a3\u4e48\u57fa\u7840\u79d1\u76ee\u5e94\u8be5\u66f4\u50cf\u662f\u201c\u5185\u529f\u201d\u3002

\u6211\u8ba4\u4e3a\u5b66\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u7840\u79d1\u76ee\uff09\u7684\u610f\u4e49\u4e0d\u662f\u5728\u4e8e\u5728\u5de5\u4f5c\u4e2d\u4ece\u96f6\u5b9e\u73b0\u5b83\uff0c\u800c\u662f\u57fa\u4e8e\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5728\u89e3\u51b3\u95ee\u9898\u65f6\u80fd\u591f\u4f5c\u51fa\u4e13\u4e1a\u7684\u53cd\u5e94\u548c\u5224\u65ad\uff0c\u4ece\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u4f53\u8d28\u91cf\u3002\u4e3e\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff0c\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u5185\u7f6e\u4e86\u6392\u5e8f\u51fd\u6570\uff1a

  • \u5982\u679c\u6211\u4eec\u6ca1\u6709\u5b66\u8fc7\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff0c\u90a3\u4e48\u7ed9\u5b9a\u4efb\u4f55\u6570\u636e\uff0c\u6211\u4eec\u53ef\u80fd\u90fd\u585e\u7ed9\u8fd9\u4e2a\u6392\u5e8f\u51fd\u6570\u53bb\u505a\u4e86\u3002\u8fd0\u884c\u987a\u7545\u3001\u6027\u80fd\u4e0d\u9519\uff0c\u770b\u4e0a\u53bb\u5e76\u6ca1\u6709\u4ec0\u4e48\u95ee\u9898\u3002
  • \u4f46\u5982\u679c\u5b66\u8fc7\u7b97\u6cd5\uff0c\u6211\u4eec\u5c31\u4f1a\u77e5\u9053\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7ed9\u5b9a\u7684\u6570\u636e\u662f\u56fa\u5b9a\u4f4d\u6570\u7684\u6574\u6570\uff08\u4f8b\u5982\u5b66\u53f7\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6570\u6392\u5e8f\u201d\u6765\u505a\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4e3a \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u4e3a\u4f4d\u6570\u3002\u5f53\u6570\u636e\u4f53\u91cf\u5f88\u5927\u65f6\uff0c\u8282\u7701\u51fa\u6765\u7684\u8fd0\u884c\u65f6\u95f4\u5c31\u80fd\u521b\u9020\u8f83\u5927\u4ef7\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u4f53\u9a8c\u53d8\u597d\u7b49\uff09\u3002

\u5728\u5de5\u7a0b\u9886\u57df\u4e2d\uff0c\u5927\u91cf\u95ee\u9898\u662f\u96be\u4ee5\u8fbe\u5230\u6700\u4f18\u89e3\u7684\uff0c\u8bb8\u591a\u95ee\u9898\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u51b3\u4e86\u3002\u95ee\u9898\u7684\u96be\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u51b3\u4e8e\u95ee\u9898\u672c\u8eab\u7684\u6027\u8d28\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u51b3\u4e8e\u89c2\u6d4b\u95ee\u9898\u7684\u4eba\u7684\u77e5\u8bc6\u50a8\u5907\u3002\u4eba\u7684\u77e5\u8bc6\u8d8a\u5b8c\u5907\u3001\u7ecf\u9a8c\u8d8a\u591a\uff0c\u5206\u6790\u95ee\u9898\u5c31\u4f1a\u8d8a\u6df1\u5165\uff0c\u95ee\u9898\u5c31\u80fd\u88ab\u89e3\u51b3\u5f97\u66f4\u4f18\u96c5\u3002

"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u7b97\u6cd5\u5b9a\u4e49","text":"

\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u591f\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u5b8c\u6210\u3002
  • \u5404\u6b65\u9aa4\u90fd\u6709\u786e\u5b9a\u7684\u542b\u4e49\uff0c\u5728\u76f8\u540c\u7684\u8f93\u5165\u548c\u8fd0\u884c\u6761\u4ef6\u4e0b\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

\u6570\u636e\u7ed3\u6784\uff08data structure\uff09\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8bbe\u8ba1\u76ee\u6807\u3002

  • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u5c11\uff0c\u4ee5\u8282\u7701\u8ba1\u7b97\u673a\u5185\u5b58\u3002
  • \u6570\u636e\u64cd\u4f5c\u5c3d\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u76d6\u6570\u636e\u8bbf\u95ee\u3001\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66f4\u65b0\u7b49\u3002
  • \u63d0\u4f9b\u7b80\u6d01\u7684\u6570\u636e\u8868\u793a\u548c\u903b\u8f91\u4fe1\u606f\uff0c\u4ee5\u4fbf\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

\u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4e0b\u9762\u4e3e\u4e24\u4e2a\u4f8b\u5b50\u3002

  • \u94fe\u8868\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5728\u6570\u636e\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u727a\u7272\u4e86\u6570\u636e\u8bbf\u95ee\u901f\u5ea6\u3002
  • \u56fe\u76f8\u8f83\u4e8e\u94fe\u8868\uff0c\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u903b\u8f91\u4fe1\u606f\uff0c\u4f46\u9700\u8981\u5360\u7528\u66f4\u5927\u7684\u5185\u5b58\u7a7a\u95f4\u3002
"},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb","text":"

\u5982\u56fe 1-4 \u6240\u793a\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u5173\u3001\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\u4ee5\u4e0b\u4e09\u4e2a\u65b9\u9762\u3002

  • \u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u6570\u636e\u7ed3\u6784\u4e3a\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7ed3\u6784\u5316\u5b58\u50a8\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
  • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
  • \u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u4f46\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9009\u62e9\u5408\u9002\u7684\u6570\u636e\u7ed3\u6784\u662f\u5173\u952e\u3002

\u56fe 1-4 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72b9\u5982\u56fe 1-5 \u6240\u793a\u7684\u62fc\u88c5\u79ef\u6728\u3002\u4e00\u5957\u79ef\u6728\uff0c\u9664\u4e86\u5305\u542b\u8bb8\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u8fd8\u9644\u6709\u8be6\u7ec6\u7684\u7ec4\u88c5\u8bf4\u660e\u4e66\u3002\u6211\u4eec\u6309\u7167\u8bf4\u660e\u4e66\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7ec4\u88c5\u51fa\u7cbe\u7f8e\u7684\u79ef\u6728\u6a21\u578b\u3002

\u56fe 1-5 \u00a0 \u62fc\u88c5\u79ef\u6728

\u4e24\u8005\u7684\u8be6\u7ec6\u5bf9\u5e94\u5173\u7cfb\u5982\u8868 1-1 \u6240\u793a\u3002

\u8868 1-1 \u00a0 \u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728

\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u62fc\u88c5\u79ef\u6728 \u8f93\u5165\u6570\u636e \u672a\u62fc\u88c5\u7684\u79ef\u6728 \u6570\u636e\u7ed3\u6784 \u79ef\u6728\u7ec4\u7ec7\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72b6\u3001\u5927\u5c0f\u3001\u8fde\u63a5\u65b9\u5f0f\u7b49 \u7b97\u6cd5 \u628a\u79ef\u6728\u62fc\u6210\u76ee\u6807\u5f62\u6001\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9aa4 \u8f93\u51fa\u6570\u636e \u79ef\u6728\u6a21\u578b

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u662f\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\u57fa\u4e8e\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u5b9e\u73b0\u3002

\u7ea6\u5b9a\u4fd7\u6210\u7684\u7b80\u79f0

\u5728\u5b9e\u9645\u8ba8\u8bba\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u201c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u201d\u7b80\u79f0\u4e3a\u201c\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u67e5\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

"},{"location":"chapter_paperbook/","title":"\u7eb8\u8d28\u4e66","text":"

\u7ecf\u8fc7\u957f\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u300aHello \u7b97\u6cd5\u300b\u7eb8\u8d28\u4e66\u7ec8\u4e8e\u53d1\u5e03\u4e86\uff01\u6b64\u65f6\u7684\u5fc3\u60c5\u53ef\u4ee5\u7528\u4e00\u53e5\u8bd7\u6765\u5f62\u5bb9\uff1a

\u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u3002

\u4ee5\u4e0b\u89c6\u9891\u5c55\u793a\u4e86\u7eb8\u8d28\u4e66\uff0c\u5e76\u4e14\u5305\u542b\u6211\u7684\u4e00\u4e9b\u601d\u8003\uff1a

  • \u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u6027\u3002
  • \u4e3a\u4ec0\u4e48\u5728\u7eb8\u8d28\u4e66\u4e2d\u9009\u62e9 Python\u3002
  • \u5bf9\u77e5\u8bc6\u5206\u4eab\u7684\u7406\u89e3\u3002

\u65b0\u4eba UP \u4e3b\uff0c\u8bf7\u591a\u591a\u5173\u7167\u3001\u4e00\u952e\u4e09\u8fde\uff5e\u8c22\u8c22\uff01

\u9644\u7eb8\u8d28\u4e66\u5feb\u7167\uff1a

"},{"location":"chapter_paperbook/#_2","title":"\u4f18\u52bf\u4e0e\u4e0d\u8db3","text":"

\u603b\u7ed3\u4e00\u4e0b\u7eb8\u8d28\u4e66\u53ef\u80fd\u4f1a\u7ed9\u5927\u5bb6\u5e26\u6765\u60ca\u559c\u7684\u5730\u65b9\uff1a

  • \u91c7\u7528\u5168\u5f69\u5370\u5237\uff0c\u80fd\u591f\u539f\u6c41\u539f\u5473\u5730\u53d1\u6325\u51fa\u672c\u4e66\u201c\u52a8\u753b\u56fe\u89e3\u201d\u7684\u4f18\u52bf\u3002
  • \u8003\u7a76\u7eb8\u5f20\u6750\u8d28\uff0c\u65e2\u4fdd\u8bc1\u8272\u5f69\u9ad8\u5ea6\u8fd8\u539f\uff0c\u4e5f\u4fdd\u7559\u7eb8\u8d28\u4e66\u7279\u6709\u7684\u8d28\u611f\u3002
  • \u7eb8\u8d28\u7248\u6bd4\u7f51\u9875\u7248\u7684\u683c\u5f0f\u66f4\u52a0\u89c4\u8303\uff0c\u4f8b\u5982\u56fe\u4e2d\u7684\u516c\u5f0f\u4f7f\u7528\u659c\u4f53\u3002
  • \u5728\u4e0d\u63d0\u5347\u5b9a\u4ef7\u7684\u524d\u63d0\u4e0b\uff0c\u9644\u8d60\u601d\u7ef4\u5bfc\u56fe\u6298\u9875\u3001\u4e66\u7b7e\u3002
  • \u7eb8\u8d28\u4e66\u3001\u7f51\u9875\u7248\u3001PDF \u7248\u5185\u5bb9\u540c\u6b65\uff0c\u968f\u610f\u5207\u6362\u9605\u8bfb\u3002

Tip

\u7531\u4e8e\u7eb8\u8d28\u4e66\u548c\u7f51\u9875\u7248\u7684\u540c\u6b65\u96be\u5ea6\u8f83\u5927\uff0c\u56e0\u6b64\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u7ec6\u8282\u4e0a\u7684\u4e0d\u540c\uff0c\u8bf7\u60a8\u89c1\u8c05\uff01

\u5f53\u7136\uff0c\u7eb8\u8d28\u4e66\u4e5f\u6709\u4e00\u4e9b\u503c\u5f97\u5927\u5bb6\u5165\u624b\u524d\u8003\u8651\u7684\u5730\u65b9\uff1a

  • \u4f7f\u7528 Python \u8bed\u8a00\uff0c\u53ef\u80fd\u4e0d\u5339\u914d\u4f60\u7684\u4e3b\u8bed\u8a00\uff08\u53ef\u4ee5\u628a Python \u770b\u4f5c\u4f2a\u4ee3\u7801\uff0c\u91cd\u5728\u7406\u89e3\u601d\u8def\uff09\u3002
  • \u5168\u5f69\u5370\u5237\u867d\u7136\u5927\u5e45\u63d0\u5347\u4e86\u56fe\u89e3\u548c\u4ee3\u7801\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u4f46\u4ef7\u683c\u4f1a\u6bd4\u9ed1\u767d\u5370\u5237\u9ad8\u4e00\u4e9b\u3002

Tip

\u201c\u5370\u5237\u8d28\u91cf\u201d\u548c\u201c\u4ef7\u683c\u201d\u5c31\u50cf\u7b97\u6cd5\u4e2d\u7684\u201c\u65f6\u95f4\u6548\u7387\u201d\u548c\u201c\u7a7a\u95f4\u6548\u7387\u201d\uff0c\u96be\u4ee5\u4e24\u5168\u3002\u800c\u6211\u8ba4\u4e3a\uff0c\u201c\u5370\u5237\u8d28\u91cf\u201d\u5bf9\u5e94\u7684\u662f\u201c\u65f6\u95f4\u6548\u7387\u201d\uff0c\u66f4\u5e94\u8be5\u88ab\u6ce8\u91cd\u3002

"},{"location":"chapter_paperbook/#_3","title":"\u8d2d\u4e70\u94fe\u63a5","text":"

\u5982\u679c\u4f60\u5bf9\u7eb8\u8d28\u4e66\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8003\u8651\u5165\u624b\u4e00\u672c\u3002\u6211\u4eec\u4e3a\u5927\u5bb6\u4e89\u53d6\u5230\u4e86\u65b0\u4e66 5 \u6298\u4f18\u60e0\uff0c\u8bf7\u89c1\u6b64\u94fe\u63a5\u6216\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff1a

"},{"location":"chapter_paperbook/#_4","title":"\u5c3e\u8bb0","text":"

\u8d77\u521d\uff0c\u6211\u4f4e\u4f30\u4e86\u7eb8\u8d28\u4e66\u51fa\u7248\u7684\u5de5\u4f5c\u91cf\uff0c\u4ee5\u4e3a\u53ea\u8981\u7ef4\u62a4\u597d\u4e86\u5f00\u6e90\u9879\u76ee\uff0c\u7eb8\u8d28\u7248\u5c31\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e9b\u81ea\u52a8\u5316\u624b\u6bb5\u751f\u6210\u51fa\u6765\u3002\u5b9e\u8df5\u8bc1\u660e\uff0c\u7eb8\u8d28\u4e66\u7684\u751f\u4ea7\u6d41\u7a0b\u4e0e\u5f00\u6e90\u9879\u76ee\u7684\u66f4\u65b0\u673a\u5236\u5b58\u5728\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u4e24\u8005\u4e4b\u95f4\u7684\u8f6c\u5316\u9700\u8981\u505a\u8bb8\u591a\u989d\u5916\u5de5\u4f5c\u3002

\u4e00\u672c\u4e66\u7684\u521d\u7a3f\u4e0e\u8fbe\u5230\u51fa\u7248\u6807\u51c6\u7684\u5b9a\u7a3f\u4e4b\u95f4\u4ecd\u6709\u8f83\u957f\u8ddd\u79bb\uff0c\u9700\u8981\u51fa\u7248\u793e\uff08\u7b56\u5212\u3001\u7f16\u8f91\u3001\u8bbe\u8ba1\u3001\u5e02\u573a\u7b49\uff09\u4e0e\u4f5c\u8005\u7684\u901a\u529b\u5408\u4f5c\u3001\u957f\u671f\u96d5\u7422\u3002\u5728\u6b64\u611f\u8c22\u56fe\u7075\u7b56\u5212\u7f16\u8f91\u738b\u519b\u82b1\u3001\u4ee5\u53ca\u4eba\u6c11\u90ae\u7535\u51fa\u7248\u793e\u548c\u56fe\u7075\u793e\u533a\u6bcf\u4f4d\u53c2\u4e0e\u672c\u4e66\u51fa\u7248\u6d41\u7a0b\u7684\u5de5\u4f5c\u4eba\u5458\uff01

\u5e0c\u671b\u8fd9\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

Abstract

\u7b97\u6cd5\u72b9\u5982\u7f8e\u5999\u7684\u4ea4\u54cd\u4e50\uff0c\u6bcf\u4e00\u884c\u4ee3\u7801\u90fd\u50cf\u97f5\u5f8b\u822c\u6d41\u6dcc\u3002

\u613f\u8fd9\u672c\u4e66\u5728\u4f60\u7684\u8111\u6d77\u4e2d\u8f7b\u8f7b\u54cd\u8d77\uff0c\u7559\u4e0b\u72ec\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

"},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 0.1 \u00a0 \u5173\u4e8e\u672c\u4e66
  • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66
  • 0.3 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u5173\u4e8e\u672c\u4e66","text":"

\u672c\u9879\u76ee\u65e8\u5728\u521b\u5efa\u4e00\u672c\u5f00\u6e90\u3001\u514d\u8d39\u3001\u5bf9\u65b0\u624b\u53cb\u597d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u6559\u7a0b\u3002

  • \u5168\u4e66\u91c7\u7528\u52a8\u753b\u56fe\u89e3\uff0c\u7ed3\u6784\u5316\u5730\u8bb2\u89e3\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u5185\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u3002
  • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8bed\u8a00\u3002
  • \u9f13\u52b1\u8bfb\u8005\u5728\u7ebf\u4e0a\u7ae0\u8282\u8bc4\u8bba\u533a\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u8fdb\u6b65\uff0c\u63d0\u95ee\u4e0e\u8bc4\u8bba\u901a\u5e38\u53ef\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d\u3002
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

\u82e5\u4f60\u662f\u7b97\u6cd5\u521d\u5b66\u8005\uff0c\u4ece\u672a\u63a5\u89e6\u8fc7\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7ecf\u6709\u4e00\u4e9b\u5237\u9898\u7ecf\u9a8c\uff0c\u5bf9\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8ba4\u8bc6\uff0c\u5728\u4f1a\u4e0e\u4e0d\u4f1a\u4e4b\u95f4\u53cd\u590d\u6a2a\u8df3\uff0c\u90a3\u4e48\u672c\u4e66\u6b63\u662f\u4e3a\u4f60\u91cf\u8eab\u5b9a\u5236\u7684\uff01

\u5982\u679c\u4f60\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u7684\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u4f60\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

\u82e5\u4f60\u662f\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u4f60\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

\u524d\u7f6e\u6761\u4ef6

\u4f60\u9700\u8981\u81f3\u5c11\u5177\u5907\u4efb\u4e00\u8bed\u8a00\u7684\u7f16\u7a0b\u57fa\u7840\uff0c\u80fd\u591f\u9605\u8bfb\u548c\u7f16\u5199\u7b80\u5355\u4ee3\u7801\u3002

"},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5185\u5bb9\u7ed3\u6784","text":"

\u672c\u4e66\u7684\u4e3b\u8981\u5185\u5bb9\u5982\u56fe 0-1 \u6240\u793a\u3002

  • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u4e0e\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
  • \u6570\u636e\u7ed3\u6784\uff1a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u5178\u578b\u5e94\u7528\u3001\u5b9e\u73b0\u65b9\u6cd5\u7b49\u3002
  • \u7b97\u6cd5\uff1a\u641c\u7d22\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u6548\u7387\u3001\u5e94\u7528\u573a\u666f\u3001\u89e3\u9898\u6b65\u9aa4\u548c\u793a\u4f8b\u95ee\u9898\u7b49\u3002

\u56fe 0-1 \u00a0 \u672c\u4e66\u4e3b\u8981\u5185\u5bb9

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8c22","text":"

\u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u5b8c\u5584\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

\u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

\u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\u3002

  • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u7545\u8c08\u4e2d\u4f60\u9f13\u52b1\u6211\u201c\u5feb\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\uff1b
  • \u611f\u8c22\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u4e3a\u672c\u4e66\u7684\u9996\u4f4d\u8bfb\u8005\uff0c\u4ece\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8bb8\u591a\u5b9d\u8d35\u5efa\u8bae\uff0c\u4f7f\u5f97\u672c\u4e66\u66f4\u9002\u5408\u65b0\u624b\u9605\u8bfb\uff1b
  • \u611f\u8c22\u817e\u5b9d\u3001\u7426\u5b9d\u3001\u98de\u5b9d\u4e3a\u672c\u4e66\u8d77\u4e86\u4e00\u4e2a\u5bcc\u6709\u521b\u610f\u7684\u540d\u5b57\uff0c\u5524\u8d77\u5927\u5bb6\u5199\u4e0b\u7b2c\u4e00\u884c\u4ee3\u7801\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u5fc6\uff1b
  • \u611f\u8c22\u6821\u94e8\u5728\u77e5\u8bc6\u4ea7\u6743\u65b9\u9762\u63d0\u4f9b\u7684\u4e13\u4e1a\u5e2e\u52a9\uff0c\u8fd9\u5bf9\u672c\u5f00\u6e90\u4e66\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
  • \u611f\u8c22\u82cf\u6f7c\u4e3a\u672c\u4e66\u8bbe\u8ba1\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u5e76\u5728\u6211\u7684\u5f3a\u8feb\u75c7\u7684\u9a71\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
  • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u4ed6\u5f00\u53d1\u7684\u5f00\u6e90\u6587\u6863\u4e3b\u9898 Material-for-MkDocs \u3002

\u5728\u5199\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u9605\u8bfb\u4e86\u8bb8\u591a\u5173\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u8fd9\u4e9b\u4f5c\u54c1\u4e3a\u672c\u4e66\u63d0\u4f9b\u4e86\u4f18\u79c0\u7684\u8303\u672c\uff0c\u786e\u4fdd\u4e86\u672c\u4e66\u5185\u5bb9\u7684\u51c6\u786e\u6027\u4e0e\u54c1\u8d28\u3002\u5728\u6b64\u611f\u8c22\u6240\u6709\u8001\u5e08\u548c\u524d\u8f88\u7684\u6770\u51fa\u8d21\u732e\uff01

\u672c\u4e66\u5021\u5bfc\u624b\u8111\u5e76\u7528\u7684\u5b66\u4e60\u65b9\u5f0f\uff0c\u5728\u8fd9\u4e00\u70b9\u4e0a\u6211\u6df1\u53d7\u300a\u52a8\u624b\u5b66\u6df1\u5ea6\u5b66\u4e60\u300b\u7684\u542f\u53d1\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8bfb\u8005\u5f3a\u70c8\u63a8\u8350\u8fd9\u672c\u4f18\u79c0\u7684\u8457\u4f5c\u3002

\u8877\u5fc3\u611f\u8c22\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u4eec\u4e00\u76f4\u4ee5\u6765\u7684\u652f\u6301\u4e0e\u9f13\u52b1\uff0c\u8ba9\u6211\u6709\u673a\u4f1a\u505a\u8fd9\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66","text":"

Tip

\u4e3a\u4e86\u83b7\u5f97\u6700\u4f73\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u5efa\u8bae\u4f60\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98ce\u683c\u7ea6\u5b9a","text":"
  • \u6807\u9898\u540e\u6807\u6ce8 * \u7684\u662f\u9009\u8bfb\u7ae0\u8282\uff0c\u5185\u5bb9\u76f8\u5bf9\u56f0\u96be\u3002\u5982\u679c\u4f60\u7684\u65f6\u95f4\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002
  • \u4e13\u4e1a\u672f\u8bed\u4f1a\u4f7f\u7528\u9ed1\u4f53\uff08\u7eb8\u8d28\u7248\u548c PDF \u7248\uff09\u6216\u6dfb\u52a0\u4e0b\u5212\u7ebf\uff08\u7f51\u9875\u7248\uff09\uff0c\u4f8b\u5982\u6570\u7ec4\uff08array\uff09\u3002\u5efa\u8bae\u8bb0\u4f4f\u5b83\u4eec\uff0c\u4ee5\u4fbf\u9605\u8bfb\u6587\u732e\u3002
  • \u91cd\u70b9\u5185\u5bb9\u548c\u603b\u7ed3\u6027\u8bed\u53e5\u4f1a \u52a0\u7c97\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002
  • \u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528\u201c\u5f15\u53f7\u201d\u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\u3002
  • \u5f53\u6d89\u53ca\u7f16\u7a0b\u8bed\u8a00\u4e4b\u95f4\u4e0d\u4e00\u81f4\u7684\u540d\u8bcd\u65f6\uff0c\u672c\u4e66\u5747\u4ee5 Python \u4e3a\u51c6\uff0c\u4f8b\u5982\u4f7f\u7528 None \u6765\u8868\u793a\u201c\u7a7a\u201d\u3002
  • \u672c\u4e66\u90e8\u5206\u653e\u5f03\u4e86\u7f16\u7a0b\u8bed\u8a00\u7684\u6ce8\u91ca\u89c4\u8303\uff0c\u4ee5\u6362\u53d6\u66f4\u52a0\u7d27\u51d1\u7684\u5185\u5bb9\u6392\u7248\u3002\u6ce8\u91ca\u4e3b\u8981\u5206\u4e3a\u4e09\u79cd\u7c7b\u578b\uff1a\u6807\u9898\u6ce8\u91ca\u3001\u5185\u5bb9\u6ce8\u91ca\u3001\u591a\u884c\u6ce8\u91ca\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
\"\"\"\u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\"\"\"\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n\"\"\"\n\u591a\u884c\n\u6ce8\u91ca\n\"\"\"\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
/* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
### \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 ###\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n# \u591a\u884c\n# \u6ce8\u91ca\n
// \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n// \u591a\u884c\n// \u6ce8\u91ca\n
"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52a8\u753b\u56fe\u89e3\u4e2d\u9ad8\u6548\u5b66\u4e60","text":"

\u76f8\u8f83\u4e8e\u6587\u5b57\uff0c\u89c6\u9891\u548c\u56fe\u7247\u5177\u6709\u66f4\u9ad8\u7684\u4fe1\u606f\u5bc6\u5ea6\u548c\u7ed3\u6784\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u4e8e\u7406\u89e3\u3002\u5728\u672c\u4e66\u4e2d\uff0c\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u5c06\u4e3b\u8981\u901a\u8fc7\u52a8\u753b\u4ee5\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u89e3\u91ca\u4e0e\u8865\u5145\u3002

\u5982\u679c\u4f60\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u5982\u56fe 0-2 \u6240\u793a\u7684\u52a8\u753b\u56fe\u89e3\uff0c\u8bf7\u4ee5\u56fe\u4e3a\u4e3b\u3001\u4ee5\u6587\u5b57\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

\u56fe 0-2 \u00a0 \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728 GitHub \u4ed3\u5e93\u3002\u5982\u56fe 0-3 \u6240\u793a\uff0c\u6e90\u4ee3\u7801\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u4e00\u952e\u8fd0\u884c\u3002

\u5982\u679c\u65f6\u95f4\u5141\u8bb8\uff0c\u5efa\u8bae\u4f60\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u8bf7\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002

\u4e0e\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002\u52a8\u624b\u5b66\uff0c\u624d\u662f\u771f\u7684\u5b66\u3002

\u56fe 0-3 \u00a0 \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

\u8fd0\u884c\u4ee3\u7801\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\u3002

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6240\u793a\u7684\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\uff0c\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

\u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u5e93\u3002\u524d\u5f80 GitHub \u4ed3\u5e93\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\uff1a

git clone https://github.com/krahets/hello-algo.git\n

\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u56fe 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u70b9\u51fb\u201cDownload ZIP\u201d\u6309\u94ae\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

\u56fe 0-4 \u00a0 \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

\u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u56fe 0-5 \u6240\u793a\uff0c\u5bf9\u4e8e\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\u7684\u4ee3\u7801\u5757\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u5185\u627e\u5230\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u5c06\u5e2e\u52a9\u4f60\u8282\u7701\u4e0d\u5fc5\u8981\u7684\u8c03\u8bd5\u65f6\u95f4\uff0c\u8ba9\u4f60\u80fd\u591f\u4e13\u6ce8\u4e8e\u5b66\u4e60\u5185\u5bb9\u3002

\u56fe 0-5 \u00a0 \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

\u9664\u4e86\u672c\u5730\u8fd0\u884c\u4ee3\u7801\uff0c\u7f51\u9875\u7248\u8fd8\u652f\u6301 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c\uff08\u57fa\u4e8e pythontutor \u5b9e\u73b0\uff09\u3002\u5982\u56fe 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u70b9\u51fb\u4ee3\u7801\u5757\u4e0b\u65b9\u7684\u201c\u53ef\u89c6\u5316\u8fd0\u884c\u201d\u6765\u5c55\u5f00\u89c6\u56fe\uff0c\u89c2\u5bdf\u7b97\u6cd5\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201c\u5168\u5c4f\u89c2\u770b\u201d\uff0c\u4ee5\u83b7\u5f97\u66f4\u597d\u7684\u9605\u89c8\u4f53\u9a8c\u3002

\u56fe 0-6 \u00a0 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u8f7b\u6613\u8df3\u8fc7\u90a3\u4e9b\u6ca1\u5b66\u660e\u767d\u7684\u77e5\u8bc6\u70b9\u3002\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u63d0\u51fa\u4f60\u7684\u95ee\u9898\uff0c\u6211\u548c\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u56de\u590d\u3002

\u5982\u56fe 0-7 \u6240\u793a\uff0c\u7f51\u9875\u7248\u6bcf\u4e2a\u7ae0\u8282\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8bc4\u8bba\u533a\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u5173\u6ce8\u8bc4\u8bba\u533a\u7684\u5185\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\uff0c\u5206\u4eab\u4f60\u7684\u89c1\u89e3\uff0c\u5e2e\u52a9\u4ed6\u4eba\u8fdb\u6b65\u3002

\u56fe 0-7 \u00a0 \u8bc4\u8bba\u533a\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf","text":"

\u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8fc7\u7a0b\u5212\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002

  1. \u9636\u6bb5\u4e00\uff1a\u7b97\u6cd5\u5165\u95e8\u3002\u6211\u4eec\u9700\u8981\u719f\u6089\u5404\u79cd\u6570\u636e\u7ed3\u6784\u7684\u7279\u70b9\u548c\u7528\u6cd5\uff0c\u5b66\u4e60\u4e0d\u540c\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5185\u5bb9\u3002
  2. \u9636\u6bb5\u4e8c\uff1a\u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5148\u79ef\u7d2f\u81f3\u5c11 100 \u9053\u9898\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u7b97\u6cd5\u95ee\u9898\u3002\u521d\u6b21\u5237\u9898\u65f6\uff0c\u201c\u77e5\u8bc6\u9057\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u4e2a\u6311\u6218\uff0c\u4f46\u8bf7\u653e\u5fc3\uff0c\u8fd9\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u4eec\u53ef\u4ee5\u6309\u7167\u201c\u827e\u5bbe\u6d69\u65af\u9057\u5fd8\u66f2\u7ebf\u201d\u6765\u590d\u4e60\u9898\u76ee\uff0c\u901a\u5e38\u5728\u8fdb\u884c 3\uff5e5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002\u63a8\u8350\u7684\u9898\u5355\u548c\u5237\u9898\u8ba1\u5212\u8bf7\u89c1\u6b64 GitHub \u4ed3\u5e93\u3002
  3. \u9636\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5b66\u4e60\u65b9\u9762\uff0c\u6211\u4eec\u53ef\u4ee5\u9605\u8bfb\u7b97\u6cd5\u4e13\u680f\u6587\u7ae0\u3001\u89e3\u9898\u6846\u67b6\u548c\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65ad\u4e30\u5bcc\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5237\u9898\u65b9\u9762\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u91c7\u7528\u8fdb\u9636\u5237\u9898\u7b56\u7565\uff0c\u5982\u6309\u4e13\u9898\u5206\u7c7b\u3001\u4e00\u9898\u591a\u89e3\u3001\u4e00\u89e3\u591a\u9898\u7b49\uff0c\u76f8\u5173\u7684\u5237\u9898\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u4e2a\u793e\u533a\u627e\u5230\u3002

\u5982\u56fe 0-8 \u6240\u793a\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u9636\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u9636\u6bb5\u4e8c\u548c\u9636\u6bb5\u4e09\u7684\u5b66\u4e60\u3002

\u56fe 0-8 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7ed3","text":"
  • \u672c\u4e66\u7684\u4e3b\u8981\u53d7\u4f17\u662f\u7b97\u6cd5\u521d\u5b66\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u4f60\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u4e2d\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
  • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
  • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
  • \u4e66\u4e2d\u7684\u52a8\u753b\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
  • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u4ee3\u7801\u3002
  • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8bc4\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
"},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

[1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

[2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

[3] Robert Sedgewick, et al. Algorithms (4th Edition).

[4] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

[5] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[6] \u9a6c\u514b \u827e\u4f26 \u7ef4\u65af\u8457\uff0c\u9648\u8d8a\u8bd1. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5206\u6790\uff1aJava\u8bed\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

[7] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

[8] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

[9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[10] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u7d22","text":"

Abstract

\u641c\u7d22\u662f\u4e00\u573a\u672a\u77e5\u7684\u5192\u9669\uff0c\u6211\u4eec\u6216\u8bb8\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u95f4\u7684\u6bcf\u4e2a\u89d2\u843d\uff0c\u53c8\u6216\u8bb8\u53ef\u4ee5\u5feb\u901f\u9501\u5b9a\u76ee\u6807\u3002

\u5728\u8fd9\u573a\u5bfb\u89c5\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u4e2a\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

"},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 10.1 \u00a0 \u4e8c\u5206\u67e5\u627e
  • 10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9
  • 10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c
  • 10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565
  • 10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5
  • 10.6 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

\u4e8c\u5206\u67e5\u627e\uff08binary search\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u590d\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 10-1 \u6240\u793a\u3002

\u56fe 10-1 \u00a0 \u4e8c\u5206\u67e5\u627e\u793a\u4f8b\u6570\u636e

\u5982\u56fe 10-2 \u6240\u793a\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u95ed\u533a\u95f4\uff0c\u5176\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

\u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
  2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e09\u79cd\u60c5\u51b5\u3002
    1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \u3002
    2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \u3002
    3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

<1><2><3><4><5><6><7>

\u56fe 10-2 \u00a0 \u4e8c\u5206\u67e5\u627e\u6d41\u7a0b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while i <= j\n    # \u7406\u8bba\u4e0a Ruby \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n    m = (i + j) / 2   # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u5faa\u73af\u4e2d\uff0c\u533a\u95f4\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

"},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

\u9664\u4e86\u4e0a\u8ff0\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j)\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

\u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while i < j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u5982\u56fe 10-3 \u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

\u7531\u4e8e\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u901a\u8fc7\u6307\u9488 \\(i\\) \u548c\u6307\u9488 \\(j\\) \u7f29\u5c0f\u533a\u95f4\u7684\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

\u56fe 10-3 \u00a0 \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

"},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\u3002

  • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
  • \u4e8c\u5206\u67e5\u627e\u65e0\u987b\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

\u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6709\u5e8f\u6570\u636e\u3002\u82e5\u8f93\u5165\u6570\u636e\u65e0\u5e8f\uff0c\u4e3a\u4e86\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u800c\u4e13\u95e8\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u507f\u5931\u3002\u56e0\u4e3a\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u6bd4\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u90fd\u66f4\u9ad8\u3002\u5bf9\u4e8e\u9891\u7e41\u63d2\u5165\u5143\u7d20\u7684\u573a\u666f\uff0c\u4e3a\u4fdd\u6301\u6570\u7ec4\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c06\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8d35\u7684\u3002
  • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002\u4e8c\u5206\u67e5\u627e\u9700\u8981\u8df3\u8dc3\u5f0f\uff08\u975e\u8fde\u7eed\u5730\uff09\u8bbf\u95ee\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u6267\u884c\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u7684\u6548\u7387\u8f83\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5e94\u7528\u5728\u94fe\u8868\u6216\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u5c0f\u6570\u636e\u91cf\u4e0b\uff0c\u7ebf\u6027\u67e5\u627e\u6027\u80fd\u66f4\u4f73\u3002\u5728\u7ebf\u6027\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u9700 1 \u6b21\u5224\u65ad\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65ad\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u51cf\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u5f53\u6570\u636e\u91cf \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u53cd\u800c\u6bd4\u4e8c\u5206\u67e5\u627e\u66f4\u5feb\u3002
"},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u627e\u5de6\u8fb9\u754c","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

\u56de\u5fc6\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u7684\u65b9\u6cd5\uff0c\u641c\u7d22\u5b8c\u6210\u540e \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target \uff0c\u56e0\u6b64\u67e5\u627e\u63d2\u5165\u70b9\u672c\u8d28\u4e0a\u662f\u5728\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002

\u8003\u8651\u901a\u8fc7\u67e5\u627e\u63d2\u5165\u70b9\u7684\u51fd\u6570\u5b9e\u73b0\u67e5\u627e\u5de6\u8fb9\u754c\u3002\u8bf7\u6ce8\u610f\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u5bfc\u81f4\u4ee5\u4e0b\u4e24\u79cd\u7ed3\u679c\u3002

  • \u63d2\u5165\u70b9\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
  • \u5143\u7d20 nums[i] \u4e0e target \u4e0d\u76f8\u7b49\u3002

\u5f53\u9047\u5230\u4ee5\u4e0a\u4e24\u79cd\u60c5\u51b5\u65f6\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target\"\"\"\n    # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
binary_search_edge.cpp
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchLeftEdge}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

\u90a3\u4e48\u5982\u4f55\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u4ee3\u7801\uff0c\u66ff\u6362\u5728 nums[m] == target \u60c5\u51b5\u4e0b\u7684\u6307\u9488\u6536\u7f29\u64cd\u4f5c\u3002\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

\u4e0b\u9762\u6211\u4eec\u4ecb\u7ecd\u4e24\u79cd\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

"},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u590d\u7528\u67e5\u627e\u5de6\u8fb9\u754c","text":"

\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u67e5\u627e\u6700\u5de6\u5143\u7d20\u7684\u51fd\u6570\u6765\u67e5\u627e\u6700\u53f3\u5143\u7d20\uff0c\u5177\u4f53\u65b9\u6cd5\u4e3a\uff1a\u5c06\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\u3002

\u5982\u56fe 10-7 \u6240\u793a\uff0c\u67e5\u627e\u5b8c\u6210\u540e\uff0c\u6307\u9488 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

\u56fe 10-7 \u00a0 \u5c06\u67e5\u627e\u53f3\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5de6\u8fb9\u754c

\u8bf7\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u70b9\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c06\u5176\u51cf \\(1\\) \uff0c\u4ece\u800c\u83b7\u5f97 \\(j\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target\"\"\"\n    # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
binary_search_edge.cpp
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchRightEdge}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20","text":"

\u6211\u4eec\u77e5\u9053\uff0c\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u6700\u7ec8 \\(i\\) \u548c \\(j\\) \u4f1a\u5206\u522b\u6307\u5411\u9996\u4e2a\u5927\u4e8e\u3001\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002

\u56e0\u6b64\uff0c\u5982\u56fe 10-8 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u4e8e\u67e5\u627e\u5de6\u53f3\u8fb9\u754c\u3002

  • \u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target - 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(i\\) \u3002
  • \u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target + 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(j\\) \u3002

\u56fe 10-8 \u00a0 \u5c06\u67e5\u627e\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20

\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u4e24\u70b9\u503c\u5f97\u6ce8\u610f\u3002

  • \u7ed9\u5b9a\u6570\u7ec4\u4e0d\u5305\u542b\u5c0f\u6570\uff0c\u8fd9\u610f\u5473\u7740\u6211\u4eec\u65e0\u987b\u5173\u5fc3\u5982\u4f55\u5904\u7406\u76f8\u7b49\u7684\u60c5\u51b5\u3002
  • \u56e0\u4e3a\u8be5\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6570\uff0c\u6240\u4ee5\u9700\u8981\u5c06\u51fd\u6570\u4e2d\u7684\u53d8\u91cf target \u6539\u4e3a\u6d6e\u70b9\u6570\u7c7b\u578b\uff08Python \u65e0\u987b\u6539\u52a8\uff09\u3002
"},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9","text":"

\u4e8c\u5206\u67e5\u627e\u4e0d\u4ec5\u53ef\u7528\u4e8e\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff0c\u8fd8\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u53d8\u79cd\u95ee\u9898\uff0c\u6bd4\u5982\u641c\u7d22\u76ee\u6807\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

"},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u5143\u7d20 target \uff0c\u6570\u7ec4\u4e0d\u5b58\u5728\u91cd\u590d\u5143\u7d20\u3002\u73b0\u5c06 target \u63d2\u5165\u6570\u7ec4 nums \u4e2d\uff0c\u5e76\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u6570\u7ec4\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5219\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8bf7\u8fd4\u56de\u63d2\u5165\u540e target \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u56fe 10-4 \u6240\u793a\u3002

\u56fe 10-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u793a\u4f8b\u6570\u636e

\u5982\u679c\u60f3\u590d\u7528\u4e0a\u4e00\u8282\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\uff0c\u5219\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\u3002

\u95ee\u9898\u4e00\uff1a\u5f53\u6570\u7ec4\u4e2d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u662f\u5426\u662f\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u9898\u76ee\u8981\u6c42\u5c06 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u8fb9\uff0c\u8fd9\u610f\u5473\u7740\u65b0\u63d2\u5165\u7684 target \u66ff\u6362\u4e86\u539f\u6765 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u6570\u7ec4\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u5c31\u662f\u8be5 target \u7684\u7d22\u5f15\u3002

\u95ee\u9898\u4e8c\uff1a\u5f53\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728 target \u65f6\uff0c\u63d2\u5165\u70b9\u662f\u54ea\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u8fdb\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u67e5\u627e\u8fc7\u7a0b\uff1a\u5f53 nums[m] < target \u65f6 \\(i\\) \u79fb\u52a8\uff0c\u8fd9\u610f\u5473\u7740\u6307\u9488 \\(i\\) \u5728\u5411\u5927\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u9488 \\(j\\) \u59cb\u7ec8\u5728\u5411\u5c0f\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u56e0\u6b64\u4e8c\u5206\u7ed3\u675f\u65f6\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002\u6613\u5f97\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u7d22\u5f15\u4e3a \\(i\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertionSimple}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

Question

\u5728\u4e0a\u4e00\u9898\u7684\u57fa\u7840\u4e0a\uff0c\u89c4\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u5176\u4f59\u4e0d\u53d8\u3002

\u5047\u8bbe\u6570\u7ec4\u4e2d\u5b58\u5728\u591a\u4e2a target \uff0c\u5219\u666e\u901a\u4e8c\u5206\u67e5\u627e\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u5143\u7d20\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11 target\u3002

\u9898\u76ee\u8981\u6c42\u5c06\u76ee\u6807\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u8fb9\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u8651\u901a\u8fc7\u56fe 10-5 \u6240\u793a\u7684\u6b65\u9aa4\u5b9e\u73b0\u3002

  1. \u6267\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \u3002
  2. \u4ece\u7d22\u5f15 \\(k\\) \u5f00\u59cb\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u5f53\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u65f6\u8fd4\u56de\u3002

\u56fe 10-5 \u00a0 \u7ebf\u6027\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9

\u6b64\u65b9\u6cd5\u867d\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5f53\u6570\u7ec4\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u590d\u7684 target \u65f6\uff0c\u8be5\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

\u73b0\u8003\u8651\u62d3\u5c55\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002\u5982\u56fe 10-6 \u6240\u793a\uff0c\u6574\u4f53\u6d41\u7a0b\u4fdd\u6301\u4e0d\u53d8\uff0c\u6bcf\u8f6e\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u51e0\u79cd\u60c5\u51b5\u3002

  • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u7528\u666e\u901a\u4e8c\u5206\u67e5\u627e\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
  • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u5faa\u73af\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u70b9\u3002

<1><2><3><4><5><6><7><8>

\u56fe 10-6 \u00a0 \u4e8c\u5206\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9\u7684\u6b65\u9aa4

\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5224\u65ad\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u4e24\u8005\u53ef\u4ee5\u5408\u5e76\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5c06\u5224\u65ad\u6761\u4ef6\u4fdd\u6301\u5c55\u5f00\uff0c\u56e0\u4e3a\u5176\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8bfb\u6027\u66f4\u597d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertion}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u672c\u8282\u7684\u4ee3\u7801\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

\u603b\u7684\u6765\u770b\uff0c\u4e8c\u5206\u67e5\u627e\u65e0\u975e\u5c31\u662f\u7ed9\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u522b\u8bbe\u5b9a\u641c\u7d22\u76ee\u6807\uff0c\u76ee\u6807\u53ef\u80fd\u662f\u4e00\u4e2a\u5177\u4f53\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u4e2a\u5143\u7d20\u8303\u56f4\uff08\u4f8b\u5982\u5c0f\u4e8e target \u7684\u5143\u7d20\uff09\u3002

\u5728\u4e0d\u65ad\u7684\u5faa\u73af\u4e8c\u5206\u4e2d\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6e10\u903c\u8fd1\u9884\u5148\u8bbe\u5b9a\u7684\u76ee\u6807\u3002\u6700\u7ec8\uff0c\u5b83\u4eec\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u8fc7\u8fb9\u754c\u540e\u505c\u6b62\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

\u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

Question

\u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7ebf\u6027\u67e5\u627e\uff1a\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4","text":"

\u8003\u8651\u76f4\u63a5\u904d\u5386\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\u3002\u5982\u56fe 10-9 \u6240\u793a\uff0c\u6211\u4eec\u5f00\u542f\u4e00\u4e2a\u4e24\u5c42\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u5224\u65ad\u4e24\u4e2a\u6574\u6570\u7684\u548c\u662f\u5426\u4e3a target \uff0c\u82e5\u662f\uff0c\u5219\u8fd4\u56de\u5b83\u4eec\u7684\u7d22\u5f15\u3002

\u56fe 10-9 \u00a0 \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\"\"\"\n    # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u679a\u4e3e */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e ###\ndef two_sum_brute_force(nums, target)\n  # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6b64\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u975e\u5e38\u8017\u65f6\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\u56fe 10-10 \u6240\u793a\u7684\u6b65\u9aa4\u3002

  1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002
  2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\u3002
<1><2><3>

\u56fe 10-10 \u00a0 \u8f85\u52a9\u54c8\u5e0c\u8868\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\"\"\"\n    # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    dic = {}\n    # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    unordered_map<int, int> dic;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Dictionary<int, int> dic = [];\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    hashTable := map[int]int{}\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic: [Int: Int] = [:]\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m = {};\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m: Map<number, number> = new Map();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e8c\uff1a \u8f85\u52a9\u54c8\u5e0c\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  Map<int, int> dic = HashMap();\n  // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let mut dic = HashMap::new();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
two_sum.c
/* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    val dic = HashMap<Int, Int>()\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  dic = {}\n  # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u8fd0\u884c\u6548\u7387\u3002

\u7531\u4e8e\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u989d\u5916\u7684\u54c8\u5e0c\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5c3d\u7ba1\u5982\u6b64\uff0c\u8be5\u65b9\u6cd5\u7684\u6574\u4f53\u65f6\u7a7a\u6548\u7387\u66f4\u4e3a\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u9898\u7684\u6700\u4f18\u89e3\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5","text":"

\u641c\u7d22\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u4e8e\u5728\u6570\u636e\u7ed3\u6784\uff08\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u6216\u56fe\uff09\u4e2d\u641c\u7d22\u4e00\u4e2a\u6216\u4e00\u7ec4\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5143\u7d20\u3002

\u641c\u7d22\u7b97\u6cd5\u53ef\u6839\u636e\u5b9e\u73b0\u601d\u8def\u5206\u4e3a\u4ee5\u4e0b\u4e24\u7c7b\u3002

  • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
  • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

\u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u7d22","text":"

\u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u7684\u6bcf\u4e2a\u5143\u7d20\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

  • \u201c\u7ebf\u6027\u641c\u7d22\u201d\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\u7b49\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u5b83\u4ece\u6570\u636e\u7ed3\u6784\u7684\u4e00\u7aef\u5f00\u59cb\uff0c\u9010\u4e2a\u8bbf\u95ee\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u5230\u8fbe\u53e6\u4e00\u7aef\u4ecd\u6ca1\u6709\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
  • \u201c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u548c\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u662f\u56fe\u548c\u6811\u7684\u4e24\u79cd\u904d\u5386\u7b56\u7565\u3002\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\u9010\u5c42\u641c\u7d22\uff0c\u7531\u8fd1\u53ca\u8fdc\u5730\u8bbf\u95ee\u5404\u4e2a\u8282\u70b9\u3002\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\uff0c\u518d\u56de\u6eaf\u5e76\u5c1d\u8bd5\u5176\u4ed6\u8def\u5f84\uff0c\u76f4\u5230\u904d\u5386\u5b8c\u6574\u4e2a\u6570\u636e\u7ed3\u6784\u3002

\u66b4\u529b\u641c\u7d22\u7684\u4f18\u70b9\u662f\u7b80\u5355\u4e14\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u505a\u9884\u5904\u7406\u548c\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\u3002

\u7136\u800c\uff0c\u6b64\u7c7b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u5143\u7d20\u6570\u91cf\uff0c\u56e0\u6b64\u5728\u6570\u636e\u91cf\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u8f83\u5dee\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9002\u5e94\u641c\u7d22","text":"

\u81ea\u9002\u5e94\u641c\u7d22\u5229\u7528\u6570\u636e\u7684\u7279\u6709\u5c5e\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u6765\u4f18\u5316\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ece\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

  • \u201c\u4e8c\u5206\u67e5\u627e\u201d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
  • \u201c\u54c8\u5e0c\u67e5\u627e\u201d\u5229\u7528\u54c8\u5e0c\u8868\u5c06\u641c\u7d22\u6570\u636e\u548c\u76ee\u6807\u6570\u636e\u5efa\u7acb\u4e3a\u952e\u503c\u5bf9\u6620\u5c04\uff0c\u4ece\u800c\u5b9e\u73b0\u67e5\u8be2\u64cd\u4f5c\u3002
  • \u201c\u6811\u67e5\u627e\u201d\u5728\u7279\u5b9a\u7684\u6811\u7ed3\u6784\uff08\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\uff09\u4e2d\uff0c\u57fa\u4e8e\u6bd4\u8f83\u8282\u70b9\u503c\u6765\u5feb\u901f\u6392\u9664\u8282\u70b9\uff0c\u4ece\u800c\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

\u6b64\u7c7b\u7b97\u6cd5\u7684\u4f18\u70b9\u662f\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u7136\u800c\uff0c\u4f7f\u7528\u8fd9\u4e9b\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u67e5\u627e\u9700\u8981\u9884\u5148\u5bf9\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\uff0c\u54c8\u5e0c\u67e5\u627e\u548c\u6811\u67e5\u627e\u90fd\u9700\u8981\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u7ef4\u62a4\u8fd9\u4e9b\u6570\u636e\u7ed3\u6784\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u5f00\u9500\u3002

Tip

\u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u4e8e\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u7d22\u65b9\u6cd5\u9009\u53d6","text":"

\u7ed9\u5b9a\u5927\u5c0f\u4e3a \\(n\\) \u7684\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u7ebf\u6027\u641c\u7d22\u3001\u4e8c\u5206\u67e5\u627e\u3001\u6811\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u7b49\u591a\u79cd\u65b9\u6cd5\u4ece\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u56fe 10-11 \u6240\u793a\u3002

\u56fe 10-11 \u00a0 \u591a\u79cd\u641c\u7d22\u7b56\u7565

\u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

\u8868 10-1 \u00a0 \u67e5\u627e\u7b97\u6cd5\u6548\u7387\u5bf9\u6bd4

\u7ebf\u6027\u641c\u7d22 \u4e8c\u5206\u67e5\u627e \u6811\u67e5\u627e \u54c8\u5e0c\u67e5\u627e \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u989d\u5916\u7a7a\u95f4 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u6570\u636e\u9884\u5904\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6811 \\(O(n \\log n)\\) \u5efa\u54c8\u5e0c\u8868 \\(O(n)\\) \u6570\u636e\u662f\u5426\u6709\u5e8f \u65e0\u5e8f \u6709\u5e8f \u6709\u5e8f \u65e0\u5e8f

\u641c\u7d22\u7b97\u6cd5\u7684\u9009\u62e9\u8fd8\u53d6\u51b3\u4e8e\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u4e0e\u66f4\u65b0\u9891\u7387\u7b49\u3002

\u7ebf\u6027\u641c\u7d22

  • \u901a\u7528\u6027\u8f83\u597d\uff0c\u65e0\u987b\u4efb\u4f55\u6570\u636e\u9884\u5904\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u4eec\u4ec5\u9700\u67e5\u8be2\u4e00\u6b21\u6570\u636e\uff0c\u90a3\u4e48\u5176\u4ed6\u4e09\u79cd\u65b9\u6cd5\u7684\u6570\u636e\u9884\u5904\u7406\u7684\u65f6\u95f4\u6bd4\u7ebf\u6027\u641c\u7d22\u7684\u65f6\u95f4\u8fd8\u8981\u66f4\u957f\u3002
  • \u9002\u7528\u4e8e\u4f53\u91cf\u8f83\u5c0f\u7684\u6570\u636e\uff0c\u6b64\u60c5\u51b5\u4e0b\u65f6\u95f4\u590d\u6742\u5ea6\u5bf9\u6548\u7387\u5f71\u54cd\u8f83\u5c0f\u3002
  • \u9002\u7528\u4e8e\u6570\u636e\u66f4\u65b0\u9891\u7387\u8f83\u9ad8\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u8be5\u65b9\u6cd5\u4e0d\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u4efb\u4f55\u989d\u5916\u7ef4\u62a4\u3002

\u4e8c\u5206\u67e5\u627e

  • \u9002\u7528\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u6548\u7387\u8868\u73b0\u7a33\u5b9a\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002
  • \u6570\u636e\u91cf\u4e0d\u80fd\u8fc7\u5927\uff0c\u56e0\u4e3a\u5b58\u50a8\u6570\u7ec4\u9700\u8981\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u3002
  • \u4e0d\u9002\u7528\u4e8e\u9ad8\u9891\u589e\u5220\u6570\u636e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u7ef4\u62a4\u6709\u5e8f\u6570\u7ec4\u7684\u5f00\u9500\u8f83\u5927\u3002

\u54c8\u5e0c\u67e5\u627e

  • \u9002\u5408\u5bf9\u67e5\u8be2\u6027\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u573a\u666f\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002
  • \u4e0d\u9002\u5408\u9700\u8981\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u65e0\u6cd5\u7ef4\u62a4\u6570\u636e\u7684\u6709\u5e8f\u6027\u3002
  • \u5bf9\u54c8\u5e0c\u51fd\u6570\u548c\u54c8\u5e0c\u51b2\u7a81\u5904\u7406\u7b56\u7565\u7684\u4f9d\u8d56\u6027\u8f83\u9ad8\uff0c\u5177\u6709\u8f83\u5927\u7684\u6027\u80fd\u52a3\u5316\u98ce\u9669\u3002
  • \u4e0d\u9002\u5408\u6570\u636e\u91cf\u8fc7\u5927\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u9700\u8981\u989d\u5916\u7a7a\u95f4\u6765\u6700\u5927\u7a0b\u5ea6\u5730\u51cf\u5c11\u51b2\u7a81\uff0c\u4ece\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8be2\u6027\u80fd\u3002

\u6811\u67e5\u627e

  • \u9002\u7528\u4e8e\u6d77\u91cf\u6570\u636e\uff0c\u56e0\u4e3a\u6811\u8282\u70b9\u5728\u5185\u5b58\u4e2d\u662f\u5206\u6563\u5b58\u50a8\u7684\u3002
  • \u9002\u5408\u9700\u8981\u7ef4\u62a4\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\u3002
  • \u5728\u6301\u7eed\u589e\u5220\u8282\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u4ea7\u751f\u503e\u659c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • \u82e5\u4f7f\u7528 AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u5219\u5404\u9879\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a33\u5b9a\u8fd0\u884c\uff0c\u4f46\u7ef4\u62a4\u6811\u5e73\u8861\u7684\u64cd\u4f5c\u4f1a\u589e\u52a0\u989d\u5916\u7684\u5f00\u9500\u3002
"},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7ed3","text":"
  • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u8fdb\u884c\u67e5\u627e\u3002\u5b83\u8981\u6c42\u8f93\u5165\u6570\u636e\u6709\u5e8f\uff0c\u4e14\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u6216\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
  • \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u6570\u636e\u3002\u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\uff0c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u548c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u9002\u7528\u4e8e\u56fe\u548c\u6811\u3002\u6b64\u7c7b\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\uff0c\u4f46\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u8f83\u9ad8\u3002
  • \u54c8\u5e0c\u67e5\u627e\u3001\u6811\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u5c5e\u4e8e\u9ad8\u6548\u641c\u7d22\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002\u6b64\u7c7b\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u501f\u52a9\u989d\u5916\u6570\u636e\u7ed3\u6784\u3002
  • \u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5bf9\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u548c\u66f4\u65b0\u9891\u7387\u7b49\u56e0\u7d20\u8fdb\u884c\u5177\u4f53\u5206\u6790\uff0c\u4ece\u800c\u9009\u62e9\u5408\u9002\u7684\u641c\u7d22\u65b9\u6cd5\u3002
  • \u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u5c0f\u578b\u6216\u9891\u7e41\u66f4\u65b0\u7684\u6570\u636e\uff1b\u4e8c\u5206\u67e5\u627e\u9002\u7528\u4e8e\u5927\u578b\u3001\u6392\u5e8f\u7684\u6570\u636e\uff1b\u54c8\u5e0c\u67e5\u627e\u9002\u7528\u4e8e\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u987b\u8303\u56f4\u67e5\u8be2\u7684\u6570\u636e\uff1b\u6811\u67e5\u627e\u9002\u7528\u4e8e\u9700\u8981\u7ef4\u62a4\u987a\u5e8f\u548c\u652f\u6301\u8303\u56f4\u67e5\u8be2\u7684\u5927\u578b\u52a8\u6001\u6570\u636e\u3002
  • \u7528\u54c8\u5e0c\u67e5\u627e\u66ff\u6362\u7ebf\u6027\u67e5\u627e\u662f\u4e00\u79cd\u5e38\u7528\u7684\u4f18\u5316\u8fd0\u884c\u65f6\u95f4\u7684\u7b56\u7565\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

Abstract

\u6392\u5e8f\u72b9\u5982\u4e00\u628a\u5c06\u6df7\u4e71\u53d8\u4e3a\u79e9\u5e8f\u7684\u9b54\u6cd5\u94a5\u5319\uff0c\u4f7f\u6211\u4eec\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u4e0e\u5904\u7406\u6570\u636e\u3002

\u65e0\u8bba\u662f\u7b80\u5355\u7684\u5347\u5e8f\uff0c\u8fd8\u662f\u590d\u6742\u7684\u5206\u7c7b\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u4eec\u5c55\u793a\u4e86\u6570\u636e\u7684\u548c\u8c10\u7f8e\u611f\u3002

"},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5
  • 11.2 \u00a0 \u9009\u62e9\u6392\u5e8f
  • 11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f
  • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
  • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
  • 11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f
  • 11.7 \u00a0 \u5806\u6392\u5e8f
  • 11.8 \u00a0 \u6876\u6392\u5e8f
  • 11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f
  • 11.10 \u00a0 \u57fa\u6570\u6392\u5e8f
  • 11.11 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

\u5192\u6ce1\u6392\u5e8f\uff08bubble sort\uff09\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

\u5982\u56fe 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u8fc7\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6765\u6a21\u62df\uff1a\u4ece\u6570\u7ec4\u6700\u5de6\u7aef\u5f00\u59cb\u5411\u53f3\u904d\u5386\uff0c\u4f9d\u6b21\u6bd4\u8f83\u76f8\u90bb\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u6362\u4e8c\u8005\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

<1><2><3><4><5><6><7>

\u56fe 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u5192\u6ce1

"},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u5982\u56fe 11-5 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
  4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

\u56fe 11-5 \u00a0 \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.ts
/* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.dart
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
bubble_sort.rs
/* \u5192\u6ce1\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.c
/* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
bubble_sort.kt
/* \u5192\u6ce1\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u4f18\u5316","text":"

\u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

\u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(n^2)\\) \uff1b\u4f46\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u53ef\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.cpp
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.java
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.cs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.go
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.swift
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.js
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.ts
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.dart
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
bubble_sort.rs
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
bubble_sort.c
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
bubble_sort.kt
/* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort_with_flag}\n
bubble_sort.zig
// \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u603b\u548c\u4e3a \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
"},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u51e0\u79cd\u6392\u5e8f\u7b97\u6cd5\u90fd\u5c5e\u4e8e\u201c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u901a\u8fc7\u6bd4\u8f83\u5143\u7d20\u95f4\u7684\u5927\u5c0f\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u6b64\u7c7b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u65e0\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u63a2\u8ba8\u51e0\u79cd\u201c\u975e\u6bd4\u8f83\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u7ebf\u6027\u9636\u3002

\u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u987a\u5e8f\u7684\u6876\uff0c\u6bcf\u4e2a\u6876\u5bf9\u5e94\u4e00\u4e2a\u6570\u636e\u8303\u56f4\uff0c\u5c06\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff1b\u7136\u540e\uff0c\u5728\u6bcf\u4e2a\u6876\u5185\u90e8\u5206\u522b\u6267\u884c\u6392\u5e8f\uff1b\u6700\u7ec8\u6309\u7167\u6876\u7684\u987a\u5e8f\u5c06\u6240\u6709\u6570\u636e\u5408\u5e76\u3002

"},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5176\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u5185\u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-13 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\u3002
  2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u8fd9\u91cc\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\u3002
  3. \u6309\u7167\u6876\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u5408\u5e76\u7ed3\u679c\u3002

\u56fe 11-13 \u00a0 \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums:\n        # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i = int(num * k)\n        # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
bucket_sort.cpp
/* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = num * k;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.java
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int) (num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int)(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
bucket_sort.go
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i := int(num * float64(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5185\u7f6e\u5207\u7247\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
bucket_sort.swift
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
bucket_sort.js
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.ts
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.dart
/* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 _num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c06 _num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
bucket_sort.rs
/* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
bucket_sort.c
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8bb0\u5f55\u6bcf\u4e2a\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52a8\u6001\u6570\u7ec4\u7684\u6570\u7ec4\uff08\u6876\uff09\n    // \u4e3a\u6bcf\u4e2a\u6876\u9884\u5206\u914d\u8db3\u591f\u7684\u7a7a\u95f4\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u5e76\u6392\u5e8f\u540e\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(buckets[i]);\n    }\n}\n
bucket_sort.kt
/* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
bucket_sort.rb
[class]{}-[func]{bucket_sort}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u6876\u6392\u5e8f\u9002\u7528\u4e8e\u5904\u7406\u4f53\u91cf\u5f88\u5927\u7684\u6570\u636e\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u5305\u542b 100 \u4e07\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\u7a7a\u95f4\u9650\u5236\uff0c\u7cfb\u7edf\u5185\u5b58\u65e0\u6cd5\u4e00\u6b21\u6027\u52a0\u8f7d\u6240\u6709\u6570\u636e\u3002\u6b64\u65f6\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u6210 1000 \u4e2a\u6876\uff0c\u7136\u540e\u5206\u522b\u5bf9\u6bcf\u4e2a\u6876\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u7ed3\u679c\u5408\u5e76\u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\) \uff1a\u5047\u8bbe\u5143\u7d20\u5728\u5404\u4e2a\u6876\u5185\u5e73\u5747\u5206\u5e03\uff0c\u90a3\u4e48\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u6570\u91cf\u4e3a \\(\\frac{n}{k}\\) \u3002\u5047\u8bbe\u6392\u5e8f\u5355\u4e2a\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u65f6\u95f4\uff0c\u5219\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u65f6\u95f4\u3002\u5f53\u6876\u6570\u91cf \\(k\\) \u6bd4\u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5219\u8d8b\u5411\u4e8e \\(O(n)\\) \u3002\u5408\u5e76\u7ed3\u679c\u65f6\u9700\u8981\u904d\u5386\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8d39 \\(O(n + k)\\) \u65f6\u95f4\u3002
  • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u6570\u636e\u88ab\u5206\u914d\u5230\u4e00\u4e2a\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8be5\u6876\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
"},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

\u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \u4e2a\uff0c\u5404\u4e2a\u6876\u4e2d\u7684\u5546\u54c1\u6570\u91cf\u5dee\u8ddd\u4f1a\u975e\u5e38\u5927\u3002

\u4e3a\u5b9e\u73b0\u5e73\u5747\u5206\u914d\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u8bbe\u5b9a\u4e00\u6761\u5927\u81f4\u7684\u5206\u754c\u7ebf\uff0c\u5c06\u6570\u636e\u7c97\u7565\u5730\u5206\u5230 3 \u4e2a\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u6bd5\u540e\uff0c\u518d\u5c06\u5546\u54c1\u8f83\u591a\u7684\u6876\u7ee7\u7eed\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6570\u91cf\u5927\u81f4\u76f8\u7b49\u3002

\u5982\u56fe 11-14 \u6240\u793a\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u76ee\u6807\u662f\u8ba9\u53f6\u8282\u70b9\u7684\u503c\u5c3d\u53ef\u80fd\u5e73\u5747\u3002\u5f53\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f6e\u5c06\u6570\u636e\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u5177\u4f53\u5212\u5206\u65b9\u5f0f\u53ef\u6839\u636e\u6570\u636e\u7279\u70b9\u7075\u6d3b\u9009\u62e9\u3002

\u56fe 11-14 \u00a0 \u9012\u5f52\u5212\u5206\u6876

\u5982\u679c\u6211\u4eec\u63d0\u524d\u77e5\u9053\u5546\u54c1\u4ef7\u683c\u7684\u6982\u7387\u5206\u5e03\uff0c\u5219\u53ef\u4ee5\u6839\u636e\u6570\u636e\u6982\u7387\u5206\u5e03\u8bbe\u7f6e\u6bcf\u4e2a\u6876\u7684\u4ef7\u683c\u5206\u754c\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u5206\u5e03\u5e76\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7edf\u8ba1\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u6570\u636e\u7279\u70b9\u91c7\u7528\u67d0\u79cd\u6982\u7387\u6a21\u578b\u8fdb\u884c\u8fd1\u4f3c\u3002

\u5982\u56fe 11-15 \u6240\u793a\uff0c\u6211\u4eec\u5047\u8bbe\u5546\u54c1\u4ef7\u683c\u670d\u4ece\u6b63\u6001\u5206\u5e03\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8bbe\u5b9a\u4ef7\u683c\u533a\u95f4\uff0c\u4ece\u800c\u5c06\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\u3002

\u56fe 11-15 \u00a0 \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

\u8ba1\u6570\u6392\u5e8f\uff08counting sort\uff09\u901a\u8fc7\u7edf\u8ba1\u5143\u7d20\u6570\u91cf\u6765\u5b9e\u73b0\u6392\u5e8f\uff0c\u901a\u5e38\u5e94\u7528\u4e8e\u6574\u6570\u6570\u7ec4\u3002

"},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

\u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\uff0c\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-16 \u6240\u793a\u3002

  1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6570\u5b57\uff0c\u8bb0\u4e3a \\(m\\) \uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(m + 1\\) \u7684\u8f85\u52a9\u6570\u7ec4 counter \u3002
  2. \u501f\u52a9 counter \u7edf\u8ba1 nums \u4e2d\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5176\u4e2d counter[num] \u5bf9\u5e94\u6570\u5b57 num \u7684\u51fa\u73b0\u6b21\u6570\u3002\u7edf\u8ba1\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u904d\u5386 nums\uff08\u8bbe\u5f53\u524d\u6570\u5b57\u4e3a num\uff09\uff0c\u6bcf\u8f6e\u5c06 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
  3. \u7531\u4e8e counter \u7684\u5404\u4e2a\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u5f53\u4e8e\u6240\u6709\u6570\u5b57\u5df2\u7ecf\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u51fa\u73b0\u6b21\u6570\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

\u56fe 11-16 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
counting_sort.cpp
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.java
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.cs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.go
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
counting_sort.swift
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
counting_sort.js
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.ts
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.dart
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
counting_sort.rs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
counting_sort.c
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
counting_sort.kt
/* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort_naive}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u8ba1\u6570\u6392\u5e8f\u4e0e\u6876\u6392\u5e8f\u7684\u8054\u7cfb

\u4ece\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u6570\u6392\u5e8f\u4e2d\u7684\u8ba1\u6570\u6570\u7ec4 counter \u7684\u6bcf\u4e2a\u7d22\u5f15\u89c6\u4e3a\u4e00\u4e2a\u6876\uff0c\u5c06\u7edf\u8ba1\u6570\u91cf\u7684\u8fc7\u7a0b\u770b\u4f5c\u5c06\u5404\u4e2a\u5143\u7d20\u5206\u914d\u5230\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u672c\u8d28\u4e0a\uff0c\u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u6570\u636e\u4e0b\u7684\u4e00\u4e2a\u7279\u4f8b\u3002

"},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

\u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u6309\u7167\u5546\u54c1\u4ef7\u683c\uff08\u7c7b\u7684\u6210\u5458\u53d8\u91cf\uff09\u5bf9\u5546\u54c1\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u7b97\u6cd5\u53ea\u80fd\u7ed9\u51fa\u4ef7\u683c\u7684\u6392\u5e8f\u7ed3\u679c\u3002

\u90a3\u4e48\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u6570\u636e\u7684\u6392\u5e8f\u7ed3\u679c\u5462\uff1f\u6211\u4eec\u9996\u5148\u8ba1\u7b97 counter \u7684\u201c\u524d\u7f00\u548c\u201d\u3002\u987e\u540d\u601d\u4e49\uff0c\u7d22\u5f15 i \u5904\u7684\u524d\u7f00\u548c prefix[i] \u7b49\u4e8e\u6570\u7ec4\u524d i \u4e2a\u5143\u7d20\u4e4b\u548c\uff1a

\\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

\u524d\u7f00\u548c\u5177\u6709\u660e\u786e\u7684\u610f\u4e49\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7ed3\u679c\u6570\u7ec4 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u8fd9\u4e2a\u4fe1\u606f\u975e\u5e38\u5173\u952e\uff0c\u56e0\u4e3a\u5b83\u544a\u8bc9\u6211\u4eec\u5404\u4e2a\u5143\u7d20\u5e94\u8be5\u51fa\u73b0\u5728\u7ed3\u679c\u6570\u7ec4\u7684\u54ea\u4e2a\u4f4d\u7f6e\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5012\u5e8f\u904d\u5386\u539f\u6570\u7ec4 nums \u7684\u6bcf\u4e2a\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

  1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\u3002
  2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6570\u7ec4 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7ed3\u679c\uff0c\u6700\u540e\u4f7f\u7528 res \u8986\u76d6\u539f\u6570\u7ec4 nums \u5373\u53ef\u3002\u56fe 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b\u3002

<1><2><3><4><5><6><7><8>

\u56fe 11-17 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6b65\u9aa4

\u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1  # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n
counting_sort.cpp
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums = res;\n}\n
counting_sort.java
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.cs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.go
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    copy(nums, res)\n}\n
counting_sort.swift
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1 // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.js
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.ts
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.dart
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c06 _num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[_num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  nums.setAll(0, res);\n}\n
counting_sort.rs
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.c
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
counting_sort.kt
/* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]-- // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u6d89\u53ca\u904d\u5386 nums \u548c\u904d\u5386 counter \uff0c\u90fd\u4f7f\u7528\u7ebf\u6027\u65f6\u95f4\u3002\u4e00\u822c\u60c5\u51b5\u4e0b \\(n \\gg m\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u4e8e \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
"},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u5c40\u9650\u6027","text":"

\u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\u76f8\u5bf9\u8f83\u4e3a\u4e25\u683c\u3002

\u8ba1\u6570\u6392\u5e8f\u53ea\u9002\u7528\u4e8e\u975e\u8d1f\u6574\u6570\u3002\u82e5\u60f3\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u8f6c\u6362\u4e3a\u975e\u8d1f\u6574\u6570\uff0c\u5e76\u4e14\u5728\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u4e0d\u80fd\u6539\u53d8\u5404\u4e2a\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u5927\u5c0f\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u5bf9\u4e8e\u5305\u542b\u8d1f\u6570\u7684\u6574\u6570\u6570\u7ec4\uff0c\u53ef\u4ee5\u5148\u7ed9\u6240\u6709\u6570\u5b57\u52a0\u4e0a\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5168\u90e8\u6570\u5b57\u8f6c\u5316\u4e3a\u6b63\u6570\uff0c\u6392\u5e8f\u5b8c\u6210\u540e\u518d\u8f6c\u6362\u56de\u53bb\u3002

\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5219\u4f1a\u5360\u7528\u8fc7\u591a\u7a7a\u95f4\u3002\u800c\u5f53 \\(n \\ll m\\) \u65f6\uff0c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u7b97\u6cd5\u8fd8\u8981\u6162\u3002

"},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u6392\u5e8f","text":"

Tip

\u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u201c\u5806\u201c\u7ae0\u8282\u3002

\u5806\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\u3002

  1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
  2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

\u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

"},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-12 \u6240\u793a\u3002

  1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
  2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
  3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
  4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

Tip

\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u56fe 11-12 \u00a0 \u5806\u6392\u5e8f\u6b65\u9aa4

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u201c\u5806\u201d\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316 sift_down() \u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 sift_down() \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0)\n
heap_sort.cpp
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.java
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.cs
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
heap_sort.go
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.swift
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swapAt(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
heap_sort.js
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.ts
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.dart
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
heap_sort.rs
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
heap_sort.c
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.kt
/* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.rb
[class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
heap_sort.zig
[class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
"},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

\u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

\u56fe 11-6 \u5c55\u793a\u4e86\u6570\u7ec4\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

\u56fe 11-6 \u00a0 \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-7 \u6240\u793a\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
  2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

\u56fe 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.swift
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.js
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.ts
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.dart
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  }\n}\n
insertion_sort.rs
/* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.c
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
insertion_sort.kt
/* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u5faa\u73af: \u5df2\u6392\u5e8f\u5143\u7d20\u4e3a 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
insertion_sort.rb
### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  end\nend\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
"},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u4f18\u52bf","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

\u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u5730\u4f4d\uff0c\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u4f5c\u7528\u3002

\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u91c7\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u4e3a\uff1a\u5bf9\u4e8e\u957f\u6570\u7ec4\uff0c\u91c7\u7528\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

\u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
  • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
  • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
"},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

\u5f52\u5e76\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5305\u542b\u56fe 11-10 \u6240\u793a\u7684\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u9636\u6bb5\u3002

  1. \u5212\u5206\u9636\u6bb5\uff1a\u901a\u8fc7\u9012\u5f52\u4e0d\u65ad\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u5f00\uff0c\u5c06\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u8f6c\u6362\u4e3a\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002
  2. \u5408\u5e76\u9636\u6bb5\uff1a\u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u5212\u5206\uff0c\u5f00\u59cb\u5408\u5e76\uff0c\u6301\u7eed\u5730\u5c06\u5de6\u53f3\u4e24\u4e2a\u8f83\u77ed\u7684\u6709\u5e8f\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u8f83\u957f\u7684\u6709\u5e8f\u6570\u7ec4\uff0c\u76f4\u81f3\u7ed3\u675f\u3002

\u56fe 11-10 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u5982\u56fe 11-11 \u6240\u793a\uff0c\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002

  1. \u8ba1\u7b97\u6570\u7ec4\u4e2d\u70b9 mid \uff0c\u9012\u5f52\u5212\u5206\u5de6\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [left, mid] \uff09\u548c\u53f3\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [mid + 1, right] \uff09\u3002
  2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u3002

\u201c\u5408\u5e76\u9636\u6bb5\u201d\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ece\u957f\u5ea6\u4e3a 1 \u7684\u5b50\u6570\u7ec4\u5f00\u59cb\u5408\u5e76\uff0c\u5408\u5e76\u9636\u6bb5\u4e2d\u7684\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u662f\u6709\u5e8f\u7684\u3002

<1><2><3><4><5><6><7><8><9><10>

\u56fe 11-11 \u00a0 \u5f52\u5e76\u6392\u5e8f\u6b65\u9aa4

\u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u4e0e\u4e8c\u53c9\u6811\u540e\u5e8f\u904d\u5386\u7684\u9012\u5f52\u987a\u5e8f\u662f\u4e00\u81f4\u7684\u3002

  • \u540e\u5e8f\u904d\u5386\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6811\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6811\uff0c\u6700\u540e\u5904\u7406\u6839\u8282\u70b9\u3002
  • \u5f52\u5e76\u6392\u5e8f\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6570\u7ec4\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6570\u7ec4\uff0c\u6700\u540e\u5904\u7406\u5408\u5e76\u3002

\u5f52\u5e76\u6392\u5e8f\u7684\u5b9e\u73b0\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\u3002\u8bf7\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u800c tmp \u7684\u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\"\"\"\n    # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if left >= right:\n        return  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    # \u5212\u5206\u9636\u6bb5\n    mid = (left + right) // 2  # \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    # \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n
merge_sort.cpp
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.java
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    MergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    MergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    Merge(nums, left, mid, right);\n}\n
merge_sort.go
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.swift
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    let mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
merge_sort.js
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.dart
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  // \u5212\u5206\u9636\u6bb5\n  int mid = (left + right) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\n  mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  // \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right);\n}\n
merge_sort.rs
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    }\n\n    // \u5212\u5206\u9636\u6bb5\n    let mid = (left + right) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.c
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = (left + right) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.kt
/* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else \n            tmp[k++] = nums[j++]\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return  // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    val mid = (left + right) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.rb
[class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
merge_sort.zig
// \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n// \u5de6\u5b50\u6570\u7ec4\u533a\u95f4 [left, mid]\n// \u53f3\u5b50\u6570\u7ec4\u533a\u95f4 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u53f3\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 <= \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u5de6\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u672a\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 > \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    var mid = (left + right) / 2;           // \u8ba1\u7b97\u4e2d\u70b9\n    try mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    try mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    try merge(nums, left, mid, right);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
"},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u94fe\u8868\u6392\u5e8f","text":"

\u5bf9\u4e8e\u94fe\u8868\uff0c\u5f52\u5e76\u6392\u5e8f\u76f8\u8f83\u4e8e\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u6392\u5e8f\u4efb\u52a1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(1)\\) \u3002

  • \u5212\u5206\u9636\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u201d\u6765\u5b9e\u73b0\u94fe\u8868\u5212\u5206\u5de5\u4f5c\uff0c\u4ece\u800c\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\u3002
  • \u5408\u5e76\u9636\u6bb5\uff1a\u5728\u94fe\u8868\u4e2d\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4ec5\u9700\u6539\u53d8\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u5b9e\u73b0\uff0c\u56e0\u6b64\u5408\u5e76\u9636\u6bb5\uff08\u5c06\u4e24\u4e2a\u77ed\u6709\u5e8f\u94fe\u8868\u5408\u5e76\u4e3a\u4e00\u4e2a\u957f\u6709\u5e8f\u94fe\u8868\uff09\u65e0\u987b\u521b\u5efa\u989d\u5916\u94fe\u8868\u3002

\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u8fd0\u884c\u9ad8\u6548\uff0c\u5e94\u7528\u5e7f\u6cdb\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5176\u76ee\u6807\u662f\uff1a\u9009\u62e9\u6570\u7ec4\u4e2d\u7684\u67d0\u4e2a\u5143\u7d20\u4f5c\u4e3a\u201c\u57fa\u51c6\u6570\u201d\uff0c\u5c06\u6240\u6709\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u4fa7\uff0c\u800c\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u4fa7\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u54e8\u5175\u5212\u5206\u7684\u6d41\u7a0b\u5982\u56fe 11-8 \u6240\u793a\u3002

  1. \u9009\u53d6\u6570\u7ec4\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u521d\u59cb\u5316\u4e24\u4e2a\u6307\u9488 i \u548c j \u5206\u522b\u6307\u5411\u6570\u7ec4\u7684\u4e24\u7aef\u3002
  2. \u8bbe\u7f6e\u4e00\u4e2a\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u522b\u5bfb\u627e\u7b2c\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u540e\u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\u3002
  3. \u5faa\u73af\u6267\u884c\u6b65\u9aa4 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u65f6\u505c\u6b62\uff0c\u6700\u540e\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\u3002
<1><2><3><4><5><6><7><8><9>

\u56fe 11-8 \u00a0 \u54e8\u5175\u5212\u5206\u6b65\u9aa4

\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u539f\u6570\u7ec4\u88ab\u5212\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u6570\u7ec4\u3001\u57fa\u51c6\u6570\u3001\u53f3\u5b50\u6570\u7ec4\uff0c\u4e14\u6ee1\u8db3\u201c\u5de6\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u51c6\u6570 \\(\\leq\\) \u53f3\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u8fd9\u4e24\u4e2a\u5b50\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

\u54e8\u5175\u5212\u5206\u7684\u5b9e\u8d28\u662f\u5c06\u4e00\u4e2a\u8f83\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u7b80\u5316\u4e3a\u4e24\u4e2a\u8f83\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u6362 */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u5143\u7d20\u4ea4\u6362 */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u5143\u7d20\u4ea4\u6362 */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u54e8\u5175\u5212\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n    return i;\n}\n
quick_sort.kt
/* \u5143\u7d20\u4ea4\u6362 */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i              // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{partition}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u5feb\u901f\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-9 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u3002
  2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u201c\u54e8\u5175\u5212\u5206\u201d\u3002
  3. \u6301\u7eed\u9012\u5f52\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\uff0c\u4ece\u800c\u5b8c\u6210\u6574\u4e2a\u6570\u7ec4\u7684\u6392\u5e8f\u3002

\u56fe 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right:\n        return\n    # \u54e8\u5175\u5212\u5206\n    pivot = self.partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = Partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    pivot := q.partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  if (left >= right) return;\n  // \u54e8\u5175\u5212\u5206\n  int pivot = _partition(nums, left, right);\n  // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return\n    // \u54e8\u5175\u5212\u5206\n    val pivot = partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    var pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
"},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u4e3a\u4ec0\u4e48\u5feb","text":"

\u4ece\u540d\u79f0\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u5e94\u8be5\u5177\u6709\u4e00\u5b9a\u7684\u4f18\u52bf\u3002\u5c3d\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e0e\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u548c\u201c\u5806\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u51fa\u73b0\u6700\u5dee\u60c5\u51b5\u7684\u6982\u7387\u5f88\u4f4e\uff1a\u867d\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u6ca1\u6709\u5f52\u5e76\u6392\u5e8f\u7a33\u5b9a\uff0c\u4f46\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fd0\u884c\u3002
  • \u7f13\u5b58\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u6267\u884c\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u65f6\uff0c\u7cfb\u7edf\u53ef\u5c06\u6574\u4e2a\u5b50\u6570\u7ec4\u52a0\u8f7d\u5230\u7f13\u5b58\uff0c\u56e0\u6b64\u8bbf\u95ee\u5143\u7d20\u7684\u6548\u7387\u8f83\u9ad8\u3002\u800c\u50cf\u201c\u5806\u6392\u5e8f\u201d\u8fd9\u7c7b\u7b97\u6cd5\u9700\u8981\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u5143\u7d20\uff0c\u4ece\u800c\u7f3a\u4e4f\u8fd9\u4e00\u7279\u6027\u3002
  • \u590d\u6742\u5ea6\u7684\u5e38\u6570\u7cfb\u6570\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u79cd\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f83\u3001\u8d4b\u503c\u3001\u4ea4\u6362\u7b49\u64cd\u4f5c\u7684\u603b\u6570\u91cf\u6700\u5c11\u3002\u8fd9\u4e0e\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

\u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\)\u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u90fd\u6709\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

\u4e3a\u4e86\u5c3d\u91cf\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u53d1\u751f\uff0c\u6211\u4eec\u53ef\u4ee5\u4f18\u5316\u54e8\u5175\u5212\u5206\u4e2d\u7684\u57fa\u51c6\u6570\u7684\u9009\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u968f\u673a\u9009\u53d6\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u8fd0\u6c14\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9009\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u51c6\u6570\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u5c3d\u5982\u4eba\u610f\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u4f2a\u968f\u673a\u6570\u201d\u3002\u5982\u679c\u6211\u4eec\u9488\u5bf9\u4f2a\u968f\u673a\u6570\u5e8f\u5217\u6784\u5efa\u4e00\u4e2a\u7279\u5b9a\u7684\u6d4b\u8bd5\u6837\u4f8b\uff0c\u90a3\u4e48\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

\u4e3a\u4e86\u8fdb\u4e00\u6b65\u6539\u8fdb\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6570\u7ec4\u4e2d\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\uff08\u901a\u5e38\u4e3a\u6570\u7ec4\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u70b9\u5143\u7d20\uff09\uff0c\u5e76\u5c06\u8fd9\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u57fa\u51c6\u6570\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6982\u7387\u5c06\u5927\u5e45\u63d0\u5347\u3002\u5f53\u7136\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u9009\u53d6\u66f4\u591a\u5019\u9009\u5143\u7d20\uff0c\u4ee5\u8fdb\u4e00\u6b65\u63d0\u9ad8\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002\u91c7\u7528\u8fd9\u79cd\u65b9\u6cd5\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6982\u7387\u5927\u5927\u964d\u4f4e\u3002

\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u95f4\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.js
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u95f4\n  return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.kt
/* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i                         // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
quick_sort.zig
// \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n// \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u8bbe\u9012\u5f52\u4e2d\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(m\\) \uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u4ea7\u751f\u957f\u5ea6\u4e3a \\(0\\) \u7684\u5de6\u5b50\u6570\u7ec4\u548c\u957f\u5ea6\u4e3a \\(m - 1\\) \u7684\u53f3\u5b50\u6570\u7ec4\uff0c\u8fd9\u610f\u5473\u7740\u6bcf\u4e00\u5c42\u9012\u5f52\u8c03\u7528\u51cf\u5c11\u7684\u95ee\u9898\u89c4\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u51cf\u5c11\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u9012\u5f52\u6811\u7684\u9ad8\u5ea6\u4f1a\u8fbe\u5230 \\(n - 1\\) \uff0c\u6b64\u65f6\u9700\u8981\u5360\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

\u4e3a\u4e86\u9632\u6b62\u6808\u5e27\u7a7a\u95f4\u7684\u7d2f\u79ef\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6bcf\u8f6e\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u540e\uff0c\u6bd4\u8f83\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u4ec5\u5bf9\u8f83\u77ed\u7684\u5b50\u6570\u7ec4\u8fdb\u884c\u9012\u5f52\u3002\u7531\u4e8e\u8f83\u77ed\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(n / 2\\) \uff0c\u56e0\u6b64\u8fd9\u79cd\u65b9\u6cd5\u80fd\u786e\u4fdd\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff0c\u4ece\u800c\u5c06\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right:\n        # \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    for left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n      left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n      right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    }\n  }\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            l = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            r = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.rb
[class]{QuickSortTailCall}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                   // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u8ba1\u6570\u6392\u5e8f\uff0c\u5b83\u9002\u7528\u4e8e\u6570\u636e\u91cf \\(n\\) \u8f83\u5927\u4f46\u6570\u636e\u8303\u56f4 \\(m\\) \u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u5bf9 \\(n = 10^6\\) \u4e2a\u5b66\u53f7\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u5b66\u53f7\u662f\u4e00\u4e2a \\(8\\) \u4f4d\u6570\u5b57\uff0c\u8fd9\u610f\u5473\u7740\u6570\u636e\u8303\u56f4 \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u5185\u5b58\u7a7a\u95f4\uff0c\u800c\u57fa\u6570\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002

\u57fa\u6570\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u901a\u8fc7\u7edf\u8ba1\u4e2a\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u57fa\u6570\u6392\u5e8f\u5229\u7528\u6570\u5b57\u5404\u4f4d\u4e4b\u95f4\u7684\u9012\u8fdb\u5173\u7cfb\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e00\u4f4d\u8fdb\u884c\u6392\u5e8f\uff0c\u4ece\u800c\u5f97\u5230\u6700\u7ec8\u7684\u6392\u5e8f\u7ed3\u679c\u3002

"},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

\u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-18 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \u3002
  2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u201c\u8ba1\u6570\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u3002
  3. \u5c06 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u540e\u8fd4\u56de\u6b65\u9aa4 2. \u7ee7\u7eed\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u540e\u7ed3\u675f\u3002

\u56fe 11-18 \u00a0 \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u5256\u6790\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u4e8e\u4e00\u4e2a \\(d\\) \u8fdb\u5236\u7684\u6570\u5b57 \\(x\\) \uff0c\u8981\u83b7\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8ba1\u7b97\u516c\u5f0f\uff1a

\\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\u3002\u5bf9\u4e8e\u5b66\u53f7\u6570\u636e\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

\u6b64\u5916\uff0c\u6211\u4eec\u9700\u8981\u5c0f\u5e45\u6539\u52a8\u8ba1\u6570\u6392\u5e8f\u4ee3\u7801\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u636e\u6570\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u8fdb\u884c\u6392\u5e8f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
def digit(num: int, exp: int) -> int:\n    \"\"\"\u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter = [0] * 10\n    n = len(nums)\n    # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1  # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n    # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    m = max(nums)\n    # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    exp = 1\n    while exp <= m:\n        # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
radix_sort.cpp
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
radix_sort.java
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.cs
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
radix_sort.go
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++             // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
radix_sort.swift
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var counter = Array(repeating: 0, count: 10)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1 // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
radix_sort.js
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.ts
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.dart
/* \u83b7\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  }\n  // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  // dart \u4e2d int \u7684\u957f\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
radix_sort.rs
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
radix_sort.c
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < size; i++) {\n        // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        int d = digit(nums[i], exp);\n        // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
radix_sort.kt
/* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    while (exp <= m) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
radix_sort.rb
[class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
radix_sort.zig
// \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6570\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4e3a\u4ec0\u4e48\u4ece\u6700\u4f4e\u4f4d\u5f00\u59cb\u6392\u5e8f\uff1f

\u5728\u8fde\u7eed\u7684\u6392\u5e8f\u8f6e\u6b21\u4e2d\uff0c\u540e\u4e00\u8f6e\u6392\u5e8f\u4f1a\u8986\u76d6\u524d\u4e00\u8f6e\u6392\u5e8f\u7684\u7ed3\u679c\u3002\u4e3e\u4f8b\u6765\u8bf4\uff0c\u5982\u679c\u7b2c\u4e00\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a > b\\) \uff0c\u90a3\u4e48\u7b2c\u4e8c\u8f6e\u7684\u7ed3\u679c\u5c06\u53d6\u4ee3\u7b2c\u4e00\u8f6e\u7684\u7ed3\u679c\u3002\u7531\u4e8e\u6570\u5b57\u7684\u9ad8\u4f4d\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4f4e\u4f4d\uff0c\u56e0\u6b64\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

\u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u8bbe\u6570\u636e\u91cf\u4e3a \\(n\\)\u3001\u6570\u636e\u4e3a \\(d\\) \u8fdb\u5236\u3001\u6700\u5927\u4f4d\u6570\u4e3a \\(k\\) \uff0c\u5219\u5bf9\u67d0\u4e00\u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u65f6\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5bf9\u8f83\u5c0f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
  • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5f53\u8ba1\u6570\u6392\u5e8f\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u4e5f\u7a33\u5b9a\uff1b\u5f53\u8ba1\u6570\u6392\u5e8f\u4e0d\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u65e0\u6cd5\u4fdd\u8bc1\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\u3002
"},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

\u9009\u62e9\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7b80\u5355\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

\u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 11-2 \u6240\u793a\u3002

  1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
  2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 11-2 \u00a0 \u9009\u62e9\u6392\u5e8f\u6b65\u9aa4

\u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
def selection_sort(nums: list[int]):\n    \"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in range(n - 1):\n        # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n
selection_sort.cpp
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        swap(nums[i], nums[k]);\n    }\n}\n
selection_sort.java
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.cs
/* \u9009\u62e9\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
selection_sort.go
/* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
selection_sort.swift
/* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swapAt(i, k)\n    }\n}\n
selection_sort.js
/* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.ts
/* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.dart
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
selection_sort.rs
/* \u9009\u62e9\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in 0..n - 1 {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swap(i, k);\n    }\n}\n
selection_sort.c
/* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.kt
/* \u9009\u62e9\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
selection_sort.rb
[class]{}-[func]{selection_sort}\n
selection_sort.zig
[class]{}-[func]{selectionSort}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
  • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5982\u56fe 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u6362\u81f3\u4e0e\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

\u56fe 11-3 \u00a0 \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

\u6392\u5e8f\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u4e8e\u5bf9\u4e00\u7ec4\u6570\u636e\u6309\u7167\u7279\u5b9a\u987a\u5e8f\u8fdb\u884c\u6392\u5217\u3002\u6392\u5e8f\u7b97\u6cd5\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u56e0\u4e3a\u6709\u5e8f\u6570\u636e\u901a\u5e38\u80fd\u591f\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

\u5982\u56fe 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65ad\u89c4\u5219\u53ef\u6839\u636e\u9700\u6c42\u8bbe\u5b9a\uff0c\u5982\u6570\u5b57\u5927\u5c0f\u3001\u5b57\u7b26 ASCII \u7801\u987a\u5e8f\u6216\u81ea\u5b9a\u4e49\u89c4\u5219\u3002

\u56fe 11-1 \u00a0 \u6570\u636e\u7c7b\u578b\u548c\u5224\u65ad\u89c4\u5219\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8bc4\u4ef7\u7ef4\u5ea6","text":"

\u8fd0\u884c\u6548\u7387\uff1a\u6211\u4eec\u671f\u671b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c3d\u91cf\u4f4e\uff0c\u4e14\u603b\u4f53\u64cd\u4f5c\u6570\u91cf\u8f83\u5c11\uff08\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u539f\u5730\u6392\u5e8f\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u987b\u501f\u52a9\u989d\u5916\u7684\u8f85\u52a9\u6570\u7ec4\uff0c\u4ece\u800c\u8282\u7701\u5185\u5b58\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u6570\u636e\u642c\u8fd0\u64cd\u4f5c\u8f83\u5c11\uff0c\u8fd0\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

\u7a33\u5b9a\u6027\uff1a\u7a33\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u540e\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u76f8\u5bf9\u987a\u5e8f\u4e0d\u53d1\u751f\u6539\u53d8\u3002

\u7a33\u5b9a\u6392\u5e8f\u662f\u591a\u7ea7\u6392\u5e8f\u573a\u666f\u7684\u5fc5\u8981\u6761\u4ef6\u3002\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u5b58\u50a8\u5b66\u751f\u4fe1\u606f\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u975e\u7a33\u5b9a\u6392\u5e8f\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\uff1a

# \u8f93\u5165\u6570\u636e\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8bbe\u4f7f\u7528\u975e\u7a33\u5b9a\u6392\u5e8f\u7b97\u6cd5\u6309\u5e74\u9f84\u6392\u5e8f\u5217\u8868\uff0c\n# \u7ed3\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5bf9\u4f4d\u7f6e\u6539\u53d8\uff0c\n# \u8f93\u5165\u6570\u636e\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8d28\u4e22\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

\u81ea\u9002\u5e94\u6027\uff1a\u81ea\u9002\u5e94\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5e76\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

\u81ea\u9002\u5e94\u6027\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u6765\u8bc4\u4f30\u3002\u5982\u679c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u5dee\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8bf4\u660e\u6392\u5e8f\u7b97\u6cd5\u5728\u67d0\u4e9b\u6570\u636e\u4e0b\u6027\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u89c6\u4e3a\u8d1f\u9762\u5c5e\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u5219\u88ab\u89c6\u4e3a\u6b63\u9762\u5c5e\u6027\u3002

\u662f\u5426\u57fa\u4e8e\u6bd4\u8f83\uff1a\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u4f9d\u8d56\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u6765\u5224\u65ad\u5143\u7d20\u7684\u76f8\u5bf9\u987a\u5e8f\uff0c\u4ece\u800c\u6392\u5e8f\u6574\u4e2a\u6570\u7ec4\uff0c\u7406\u8bba\u6700\u4f18\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f83\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5bf9\u8f83\u5dee\u3002

"},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u7b97\u6cd5","text":"

\u8fd0\u884c\u5feb\u3001\u539f\u5730\u3001\u7a33\u5b9a\u3001\u6b63\u5411\u81ea\u9002\u5e94\u3001\u901a\u7528\u6027\u597d\u3002\u663e\u7136\uff0c\u8fc4\u4eca\u4e3a\u6b62\u5c1a\u672a\u53d1\u73b0\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\u65f6\uff0c\u9700\u8981\u6839\u636e\u5177\u4f53\u7684\u6570\u636e\u7279\u70b9\u548c\u95ee\u9898\u9700\u6c42\u6765\u51b3\u5b9a\u3002

\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5171\u540c\u5b66\u4e60\u5404\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5e76\u57fa\u4e8e\u4e0a\u8ff0\u8bc4\u4ef7\u7ef4\u5ea6\u5bf9\u5404\u4e2a\u6392\u5e8f\u7b97\u6cd5\u7684\u4f18\u7f3a\u70b9\u8fdb\u884c\u5206\u6790\u3002

"},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u5192\u6ce1\u6392\u5e8f\u901a\u8fc7\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u5b9e\u73b0\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(n)\\) \u3002
  • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f6e\u5c06\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u6570\u636e\u91cf\u7684\u6392\u5e8f\u4efb\u52a1\u4e2d\u975e\u5e38\u53d7\u6b22\u8fce\u3002
  • \u5feb\u901f\u6392\u5e8f\u57fa\u4e8e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5212\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9009\u53d6\u5230\u6700\u5dee\u7684\u57fa\u51c6\u6570\uff0c\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6570\u57fa\u51c6\u6570\u6216\u968f\u673a\u57fa\u51c6\u6570\u53ef\u4ee5\u964d\u4f4e\u8fd9\u79cd\u52a3\u5316\u7684\u6982\u7387\u3002\u5c3e\u9012\u5f52\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u51cf\u5c11\u9012\u5f52\u6df1\u5ea6\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(\\log n)\\) \u3002
  • \u5f52\u5e76\u6392\u5e8f\u5305\u62ec\u5212\u5206\u548c\u5408\u5e76\u4e24\u4e2a\u9636\u6bb5\uff0c\u5178\u578b\u5730\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5f52\u5e76\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u6570\u7ec4\u9700\u8981\u521b\u5efa\u8f85\u52a9\u6570\u7ec4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u94fe\u8868\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002
  • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u4e2a\u6b65\u9aa4\uff1a\u6570\u636e\u5206\u6876\u3001\u6876\u5185\u6392\u5e8f\u548c\u5408\u5e76\u7ed3\u679c\u3002\u5b83\u540c\u6837\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9002\u7528\u4e8e\u6570\u636e\u4f53\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u3002\u6876\u6392\u5e8f\u7684\u5173\u952e\u5728\u4e8e\u5bf9\u6570\u636e\u8fdb\u884c\u5e73\u5747\u5206\u914d\u3002
  • \u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5b83\u901a\u8fc7\u7edf\u8ba1\u6570\u636e\u51fa\u73b0\u7684\u6b21\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u6709\u9650\u7684\u60c5\u51b5\uff0c\u5e76\u4e14\u8981\u6c42\u6570\u636e\u80fd\u591f\u8f6c\u6362\u4e3a\u6b63\u6574\u6570\u3002
  • \u57fa\u6570\u6392\u5e8f\u901a\u8fc7\u9010\u4f4d\u6392\u5e8f\u6765\u5b9e\u73b0\u6570\u636e\u6392\u5e8f\uff0c\u8981\u6c42\u6570\u636e\u80fd\u591f\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u6570\u5b57\u3002
  • \u603b\u7684\u6765\u8bf4\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a33\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7b49\u4f18\u70b9\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e00\u6837\uff0c\u6ca1\u6709\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\u80fd\u591f\u540c\u65f6\u6ee1\u8db3\u6240\u6709\u8fd9\u4e9b\u6761\u4ef6\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u6570\u636e\u7684\u7279\u6027\u6765\u9009\u62e9\u5408\u9002\u7684\u6392\u5e8f\u7b97\u6cd5\u3002
  • \u56fe 11-19 \u5bf9\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a33\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9002\u5e94\u6027\u7b49\u3002

\u56fe 11-19 \u00a0 \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

"},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6392\u5e8f\u7b97\u6cd5\u7a33\u5b9a\u6027\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

\u5728\u73b0\u5b9e\u4e2d\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u57fa\u4e8e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u8fdb\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b66\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u4e24\u4e2a\u5c5e\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u4e00\u4e2a\u591a\u7ea7\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5bf9\u8eab\u9ad8\u8fdb\u884c\u6392\u5e8f\u3002\u7531\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e0d\u7a33\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

\u53ef\u4ee5\u53d1\u73b0\uff0c\u5b66\u751f D \u548c C \u7684\u4f4d\u7f6e\u53d1\u751f\u4e86\u4ea4\u6362\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u574f\u4e86\uff0c\u800c\u8fd9\u662f\u6211\u4eec\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

Q\uff1a\u54e8\u5175\u5212\u5206\u4e2d\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u4e0e\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u7684\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u5417\uff1f

\u4e0d\u884c\uff0c\u5f53\u6211\u4eec\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u4e3a\u57fa\u51c6\u6570\u65f6\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u518d\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002\u8fd9\u4e2a\u7ed3\u8bba\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u6211\u4eec\u6765\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

\u54e8\u5175\u5212\u5206 partition() \u7684\u6700\u540e\u4e00\u6b65\u662f\u4ea4\u6362 nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u57fa\u51c6\u6570\u5de6\u8fb9\u7684\u5143\u7d20\u90fd <= \u57fa\u51c6\u6570\uff0c\u8fd9\u5c31\u8981\u6c42\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u524d nums[left] >= nums[i] \u5fc5\u987b\u6210\u7acb\u3002\u5047\u8bbe\u6211\u4eec\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\uff0c\u90a3\u4e48\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5219\u4f1a\u5728 i == j \u65f6\u8df3\u51fa\u5faa\u73af\uff0c\u6b64\u65f6\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6b64\u65f6\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u64cd\u4f5c\u4f1a\u628a\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\uff0c\u5bfc\u81f4\u54e8\u5175\u5212\u5206\u5931\u8d25\u3002

\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u6570\u7ec4 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u4ece\u5de6\u5411\u53f3\u67e5\u627e\u201d\uff0c\u54e8\u5175\u5212\u5206\u540e\u6570\u7ec4\u4e3a [1, 0, 0, 0, 0] \uff0c\u8fd9\u4e2a\u7ed3\u679c\u662f\u4e0d\u6b63\u786e\u7684\u3002

\u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u9009\u62e9 nums[right] \u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u6b63\u597d\u53cd\u8fc7\u6765\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002

Q\uff1a\u5173\u4e8e\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u4e3a\u4ec0\u4e48\u9009\u77ed\u7684\u6570\u7ec4\u80fd\u4fdd\u8bc1\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff1f

\u9012\u5f52\u6df1\u5ea6\u5c31\u662f\u5f53\u524d\u672a\u8fd4\u56de\u7684\u9012\u5f52\u65b9\u6cd5\u7684\u6570\u91cf\u3002\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u6211\u4eec\u5c06\u539f\u6570\u7ec4\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002\u5728\u5c3e\u9012\u5f52\u4f18\u5316\u540e\uff0c\u5411\u4e0b\u9012\u5f52\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u6700\u5927\u4e3a\u539f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8bbe\u6700\u5dee\u60c5\u51b5\uff0c\u4e00\u76f4\u4e3a\u4e00\u534a\u957f\u5ea6\uff0c\u90a3\u4e48\u6700\u7ec8\u7684\u9012\u5f52\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

\u56de\u987e\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u4f1a\u8fde\u7eed\u5730\u9012\u5f52\u957f\u5ea6\u8f83\u5927\u7684\u6570\u7ec4\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u4e3a \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002\u5c3e\u9012\u5f52\u4f18\u5316\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u3002

Q\uff1a\u5f53\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u65f6\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n^2)\\) \u5417\uff1f\u8be5\u5982\u4f55\u5904\u7406\u8fd9\u79cd\u9000\u5316\u60c5\u51b5\uff1f

\u662f\u7684\u3002\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u54e8\u5175\u5212\u5206\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a\u5c0f\u4e8e\u3001\u7b49\u4e8e\u3001\u5927\u4e8e\u57fa\u51c6\u6570\u3002\u4ec5\u5411\u4e0b\u9012\u5f52\u5c0f\u4e8e\u548c\u5927\u4e8e\u7684\u4e24\u90e8\u5206\u3002\u5728\u8be5\u65b9\u6cd5\u4e0b\uff0c\u8f93\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u6570\u7ec4\uff0c\u4ec5\u4e00\u8f6e\u54e8\u5175\u5212\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u4ec0\u4e48\u662f \\(O(n^2)\\) \uff1f

\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u4e2a\u6876\u4e2d\u3002\u5982\u679c\u6211\u4eec\u91c7\u7528\u4e00\u4e2a \\(O(n^2)\\) \u7b97\u6cd5\u6765\u6392\u5e8f\u8fd9\u4e9b\u5143\u7d20\uff0c\u5219\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

"},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u6808\u4e0e\u961f\u5217","text":"

Abstract

\u6808\u5982\u540c\u53e0\u732b\u732b\uff0c\u800c\u961f\u5217\u5c31\u50cf\u732b\u732b\u6392\u961f\u3002

\u4e24\u8005\u5206\u522b\u4ee3\u8868\u5148\u5165\u540e\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u903b\u8f91\u5173\u7cfb\u3002

"},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 5.1 \u00a0 \u6808
  • 5.2 \u00a0 \u961f\u5217
  • 5.3 \u00a0 \u53cc\u5411\u961f\u5217
  • 5.4 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u53cc\u5411\u961f\u5217","text":"

\u5728\u961f\u5217\u4e2d\uff0c\u6211\u4eec\u4ec5\u80fd\u5220\u9664\u5934\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u5982\u56fe 5-7 \u6240\u793a\uff0c\u53cc\u5411\u961f\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u7075\u6d3b\u6027\uff0c\u5141\u8bb8\u5728\u5934\u90e8\u548c\u5c3e\u90e8\u6267\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u6216\u5220\u9664\u64cd\u4f5c\u3002

\u56fe 5-7 \u00a0 \u53cc\u5411\u961f\u5217\u7684\u64cd\u4f5c

"},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u53cc\u5411\u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u53cc\u5411\u961f\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u79f0\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

\u8868 5-3 \u00a0 \u53cc\u5411\u961f\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push_first() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) push_last() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop_first() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 \\(O(1)\\)

\u540c\u6837\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u5df2\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
from collections import deque\n\n# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeq.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeq.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deq[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deq.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deq.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deq) == 0\n
deque.cpp
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
deque.java
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.pollFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.pollLast();    // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c06\u94fe\u8868 LinkedList \u770b\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.AddLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.AddFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.PushBack(2)      // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.PushFront(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\n
deque.swift
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.append(2) // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.insert(1, at: 0)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u4f7f\u7528 Array \u6a21\u62df\u65f6 popFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet popFirst = deque.removeFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nlet popLast = deque.removeLast() // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.js
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\n
deque.ts
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u4e49\u4e3a\u53cc\u5411\u961f\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.addLast(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.addFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.first; // \u961f\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.removeFirst(); // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.removeLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u961f\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u961f\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop_front) = deque.pop_front() { // \u961f\u9996\u5143\u7d20\u51fa\u961f\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
deque.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\n
deque.kt
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2)  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u961f\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nval popFirst = deque.pollFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nval popLast = deque.pollLast()   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = deque.isEmpty()\n
deque.rb
# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\n# Ruby \u6ca1\u6709\u5185\u76f4\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u961f\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#unshift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8bbf\u95ee\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u961f\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0c Array#shift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize = deque.length\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = size.zero?\n
deque.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u53cc\u5411\u961f\u5217\u5b9e\u73b0 *","text":"

\u53cc\u5411\u961f\u5217\u7684\u5b9e\u73b0\u4e0e\u961f\u5217\u7c7b\u4f3c\uff0c\u53ef\u4ee5\u9009\u62e9\u94fe\u8868\u6216\u6570\u7ec4\u4f5c\u4e3a\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

"},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u56de\u987e\u4e0a\u4e00\u8282\u5185\u5bb9\uff0c\u6211\u4eec\u4f7f\u7528\u666e\u901a\u5355\u5411\u94fe\u8868\u6765\u5b9e\u73b0\u961f\u5217\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u5220\u9664\u5934\u8282\u70b9\uff08\u5bf9\u5e94\u51fa\u961f\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0\u65b0\u8282\u70b9\uff08\u5bf9\u5e94\u5165\u961f\u64cd\u4f5c\uff09\u3002

\u5bf9\u4e8e\u53cc\u5411\u961f\u5217\u800c\u8a00\uff0c\u5934\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u6267\u884c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u53cc\u5411\u961f\u5217\u9700\u8981\u5b9e\u73b0\u53e6\u4e00\u4e2a\u5bf9\u79f0\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u5411\u94fe\u8868\u201d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

\u5982\u56fe 5-8 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u53cc\u5411\u94fe\u8868\u7684\u5934\u8282\u70b9\u548c\u5c3e\u8282\u70b9\u89c6\u4e3a\u53cc\u5411\u961f\u5217\u7684\u961f\u9996\u548c\u961f\u5c3e\uff0c\u540c\u65f6\u5b9e\u73b0\u5728\u4e24\u7aef\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u7684\u529f\u80fd\u3002

LinkedListDequepush_last()push_first()pop_last()pop_first()

\u56fe 5-8 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5982\u56fe 5-9 \u6240\u793a\uff0c\u4e0e\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7c7b\u4f3c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u73af\u5f62\u6570\u7ec4\u6765\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u3002

ArrayDequepush_last()push_first()pop_last()pop_first()

\u56fe 5-9 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u5728\u961f\u5217\u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\uff0c\u4ec5\u9700\u589e\u52a0\u201c\u961f\u9996\u5165\u961f\u201d\u548c\u201c\u961f\u5c3e\u51fa\u961f\u201d\u7684\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u53cc\u5411\u961f\u5217\u5e94\u7528","text":"

\u53cc\u5411\u961f\u5217\u517c\u5177\u6808\u4e0e\u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5b9e\u73b0\u8fd9\u4e24\u8005\u7684\u6240\u6709\u5e94\u7528\u573a\u666f\uff0c\u540c\u65f6\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

\u6211\u4eec\u77e5\u9053\uff0c\u8f6f\u4ef6\u7684\u201c\u64a4\u9500\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u6808\u6765\u5b9e\u73b0\uff1a\u7cfb\u7edf\u5c06\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u6808\u4e2d\uff0c\u7136\u540e\u901a\u8fc7 pop \u5b9e\u73b0\u64a4\u9500\u3002\u7136\u800c\uff0c\u8003\u8651\u5230\u7cfb\u7edf\u8d44\u6e90\u7684\u9650\u5236\uff0c\u8f6f\u4ef6\u901a\u5e38\u4f1a\u9650\u5236\u64a4\u9500\u7684\u6b65\u6570\uff08\u4f8b\u5982\u4ec5\u5141\u8bb8\u4fdd\u5b58 \\(50\\) \u6b65\uff09\u3002\u5f53\u6808\u7684\u957f\u5ea6\u8d85\u8fc7 \\(50\\) \u65f6\uff0c\u8f6f\u4ef6\u9700\u8981\u5728\u6808\u5e95\uff08\u961f\u9996\uff09\u6267\u884c\u5220\u9664\u64cd\u4f5c\u3002\u4f46\u6808\u65e0\u6cd5\u5b9e\u73b0\u8be5\u529f\u80fd\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u4f7f\u7528\u53cc\u5411\u961f\u5217\u6765\u66ff\u4ee3\u6808\u3002\u8bf7\u6ce8\u610f\uff0c\u201c\u64a4\u9500\u201d\u7684\u6838\u5fc3\u903b\u8f91\u4ecd\u7136\u9075\u5faa\u6808\u7684\u5148\u5165\u540e\u51fa\u539f\u5219\uff0c\u53ea\u662f\u53cc\u5411\u961f\u5217\u80fd\u591f\u66f4\u52a0\u7075\u6d3b\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u903b\u8f91\u3002

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u961f\u5217","text":"

\u961f\u5217\uff08queue\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u89c4\u5219\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u987e\u540d\u601d\u4e49\uff0c\u961f\u5217\u6a21\u62df\u4e86\u6392\u961f\u73b0\u8c61\uff0c\u5373\u65b0\u6765\u7684\u4eba\u4e0d\u65ad\u52a0\u5165\u961f\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

\u5982\u56fe 5-4 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u961f\u5217\u5934\u90e8\u79f0\u4e3a\u201c\u961f\u9996\u201d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u201c\u961f\u5c3e\u201d\uff0c\u5c06\u628a\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u5165\u961f\u201d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u51fa\u961f\u201d\u3002

\u56fe 5-4 \u00a0 \u961f\u5217\u7684\u5148\u5165\u5148\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u961f\u5217\u7684\u5e38\u89c1\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u65b9\u6cd5\u540d\u79f0\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u6211\u4eec\u5728\u6b64\u91c7\u7528\u4e0e\u6808\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

\u8868 5-2 \u00a0 \u961f\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u961f\uff0c\u5373\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop() \u961f\u9996\u5143\u7d20\u51fa\u961f \\(O(1)\\) peek() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\)

\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u73b0\u6210\u7684\u961f\u5217\u7c7b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
from collections import deque\n\n# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u5f53\u4f5c\u961f\u5217\u4f7f\u7528\n# \u867d\u7136 queue.Queue() \u662f\u7eaf\u6b63\u7684\u961f\u5217\u7c7b\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 0\n
queue.cpp
/* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
queue.java
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u961f\u5217\u6765\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\n
queue.swift
/* \u521d\u59cb\u5316\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u7531\u4e8e\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 removeFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet pool = queue.removeFirst()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.js
/* \u521d\u59cb\u5316\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.ts
/* \u521d\u59cb\u5316\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
queue.dart
/* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u961f\u5217\u7c7b Qeque \u662f\u53cc\u5411\u961f\u5217\uff0c\u4e5f\u53ef\u4f5c\u4e3a\u961f\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.removeFirst();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u53cc\u5411\u961f\u5217\u4f5c\u4e3a\u666e\u901a\u961f\u5217\u6765\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
queue.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
queue.kt
/* \u521d\u59cb\u5316\u961f\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u961f */\nval pop = queue.poll()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = queue.isEmpty()\n
queue.rb
# \u521d\u59cb\u5316\u961f\u5217\n# Ruby \u5185\u7f6e\u7684\u961f\u5217\uff08Thread::Queue) \u6ca1\u6709 peek \u548c\u904d\u5386\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u961f\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8bbf\u95ee\u961f\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u961f\n# \u6e05\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#shift \u65b9\u6cd5\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop = queue.shift\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize = queue.length\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = queue.empty?\n
queue.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u961f\u5217\u5b9e\u73b0","text":"

\u4e3a\u4e86\u5b9e\u73b0\u961f\u5217\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u6dfb\u52a0\u5143\u7d20\uff0c\u5e76\u5728\u53e6\u4e00\u7aef\u5220\u9664\u5143\u7d20\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u7b26\u5408\u8981\u6c42\u3002

"},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u5982\u56fe 5-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u201c\u5934\u8282\u70b9\u201d\u548c\u201c\u5c3e\u8282\u70b9\u201d\u5206\u522b\u89c6\u4e3a\u201c\u961f\u9996\u201d\u548c\u201c\u961f\u5c3e\u201d\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

LinkedListQueuepush()pop()

\u56fe 5-5 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u5728\u6570\u7ec4\u4e2d\u5220\u9664\u9996\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4f1a\u5bfc\u81f4\u51fa\u961f\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002\u7136\u800c\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u6765\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002

\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf front \u6307\u5411\u961f\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u5e76\u7ef4\u62a4\u4e00\u4e2a\u53d8\u91cf size \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + size \uff0c\u8fd9\u4e2a\u516c\u5f0f\u8ba1\u7b97\u51fa\u7684 rear \u6307\u5411\u961f\u5c3e\u5143\u7d20\u4e4b\u540e\u7684\u4e0b\u4e00\u4e2a\u4f4d\u7f6e\u3002

\u57fa\u4e8e\u6b64\u8bbe\u8ba1\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u533a\u95f4\u4e3a [front, rear - 1]\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u6cd5\u5982\u56fe 5-6 \u6240\u793a\u3002

  • \u5165\u961f\u64cd\u4f5c\uff1a\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 size \u589e\u52a0 1 \u3002
  • \u51fa\u961f\u64cd\u4f5c\uff1a\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 size \u51cf\u5c11 1 \u3002

\u53ef\u4ee5\u770b\u5230\uff0c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u90fd\u53ea\u9700\u8fdb\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002

ArrayQueuepush()pop()

\u56fe 5-6 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u4e00\u4e2a\u95ee\u9898\uff1a\u5728\u4e0d\u65ad\u8fdb\u884c\u5165\u961f\u548c\u51fa\u961f\u7684\u8fc7\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52a8\uff0c\u5f53\u5b83\u4eec\u5230\u8fbe\u6570\u7ec4\u5c3e\u90e8\u65f6\u5c31\u65e0\u6cd5\u7ee7\u7eed\u79fb\u52a8\u4e86\u3002\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u73af\u5f62\u6570\u7ec4\u201d\u3002

\u5bf9\u4e8e\u73af\u5f62\u6570\u7ec4\uff0c\u6211\u4eec\u9700\u8981\u8ba9 front \u6216 rear \u5728\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u76f4\u63a5\u56de\u5230\u6570\u7ec4\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002\u8fd9\u79cd\u5468\u671f\u6027\u89c4\u5f8b\u53ef\u4ee5\u901a\u8fc7\u201c\u53d6\u4f59\u64cd\u4f5c\u201d\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff1a\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e0d\u96be\u89e3\u51b3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u66ff\u6362\u4e3a\u52a8\u6001\u6570\u7ec4\uff0c\u4ece\u800c\u5f15\u5165\u6269\u5bb9\u673a\u5236\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u884c\u5b9e\u73b0\u3002

\u4e24\u79cd\u5b9e\u73b0\u7684\u5bf9\u6bd4\u7ed3\u8bba\u4e0e\u6808\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u961f\u5217\u5178\u578b\u5e94\u7528","text":"
  • \u6dd8\u5b9d\u8ba2\u5355\u3002\u8d2d\u7269\u8005\u4e0b\u5355\u540e\uff0c\u8ba2\u5355\u5c06\u52a0\u5165\u961f\u5217\u4e2d\uff0c\u7cfb\u7edf\u968f\u540e\u4f1a\u6839\u636e\u987a\u5e8f\u5904\u7406\u961f\u5217\u4e2d\u7684\u8ba2\u5355\u3002\u5728\u53cc\u5341\u4e00\u671f\u95f4\uff0c\u77ed\u65f6\u95f4\u5185\u4f1a\u4ea7\u751f\u6d77\u91cf\u8ba2\u5355\uff0c\u9ad8\u5e76\u53d1\u6210\u4e3a\u5de5\u7a0b\u5e08\u4eec\u9700\u8981\u91cd\u70b9\u653b\u514b\u7684\u95ee\u9898\u3002
  • \u5404\u7c7b\u5f85\u529e\u4e8b\u9879\u3002\u4efb\u4f55\u9700\u8981\u5b9e\u73b0\u201c\u5148\u6765\u540e\u5230\u201d\u529f\u80fd\u7684\u573a\u666f\uff0c\u4f8b\u5982\u6253\u5370\u673a\u7684\u4efb\u52a1\u961f\u5217\u3001\u9910\u5385\u7684\u51fa\u9910\u961f\u5217\u7b49\uff0c\u961f\u5217\u5728\u8fd9\u4e9b\u573a\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7ef4\u62a4\u5904\u7406\u987a\u5e8f\u3002
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u6808","text":"

\u6808\uff08stack\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u903b\u8f91\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002

\u6211\u4eec\u53ef\u4ee5\u5c06\u6808\u7c7b\u6bd4\u4e3a\u684c\u9762\u4e0a\u7684\u4e00\u645e\u76d8\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u4eec\u5c06\u76d8\u5b50\u66ff\u6362\u4e3a\u5404\u79cd\u7c7b\u578b\u7684\u5143\u7d20\uff08\u5982\u6574\u6570\u3001\u5b57\u7b26\u3001\u5bf9\u8c61\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u6808\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u3002

\u5982\u56fe 5-1 \u6240\u793a\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u201c\u6808\u9876\u201d\uff0c\u5e95\u90e8\u79f0\u4e3a\u201c\u6808\u5e95\u201d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u6808\u201d\uff0c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u6808\u201d\u3002

\u56fe 5-1 \u00a0 \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u6808\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u4eec\u4ee5\u5e38\u89c1\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u4e3a\u4f8b\u3002

\u8868 5-1 \u00a0 \u6808\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5 \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u6808\uff08\u6dfb\u52a0\u81f3\u6808\u9876\uff09 \\(O(1)\\) pop() \u6808\u9876\u5143\u7d20\u51fa\u6808 \\(O(1)\\) peek() \u8bbf\u95ee\u6808\u9876\u5143\u7d20 \\(O(1)\\)

\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u6808\u7c7b\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8bed\u8a00\u53ef\u80fd\u6ca1\u6709\u4e13\u95e8\u63d0\u4f9b\u6808\u7c7b\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u8bed\u8a00\u7684\u201c\u6570\u7ec4\u201d\u6216\u201c\u94fe\u8868\u201d\u5f53\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u5728\u7a0b\u5e8f\u903b\u8f91\u4e0a\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
# \u521d\u59cb\u5316\u6808\n# Python \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a list \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
stack.java
/* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* \u521d\u59cb\u5316\u6808 */\n// \u5728 Go \u4e2d\uff0c\u63a8\u8350\u5c06 Slice \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u6808 */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\n
stack.swift
/* \u521d\u59cb\u5316\u6808 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.js
/* \u521d\u59cb\u5316\u6808 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.ts
/* \u521d\u59cb\u5316\u6808 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.dart
/* \u521d\u59cb\u5316\u6808 */\n// Dart \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a List \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.removeLast();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* \u521d\u59cb\u5316\u6808 */\n// \u628a Vec \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.pop().unwrap();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = stack.is_empty();\n
stack.c
// C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
stack.kt
/* \u521d\u59cb\u5316\u6808 */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u6808 */\nval pop = stack.pop()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = stack.isEmpty()\n
stack.rb
# \u521d\u59cb\u5316\u6808\n# Ruby \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u6808\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u6808\npop = stack.pop\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize = stack.length\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty = stack.empty?\n
stack.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u6808\u7684\u5b9e\u73b0","text":"

\u4e3a\u4e86\u6df1\u5165\u4e86\u89e3\u6808\u7684\u8fd0\u884c\u673a\u5236\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u6808\u7c7b\u3002

\u6808\u9075\u5faa\u5148\u5165\u540e\u51fa\u7684\u539f\u5219\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u80fd\u5728\u6808\u9876\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u6dfb\u52a0\u548c\u5220\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u6808\u53ef\u4ee5\u89c6\u4e3a\u4e00\u79cd\u53d7\u9650\u5236\u7684\u6570\u7ec4\u6216\u94fe\u8868\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u201c\u5c4f\u853d\u201d\u6570\u7ec4\u6216\u94fe\u8868\u7684\u90e8\u5206\u65e0\u5173\u64cd\u4f5c\uff0c\u4f7f\u5176\u5bf9\u5916\u8868\u73b0\u7684\u903b\u8f91\u7b26\u5408\u6808\u7684\u7279\u6027\u3002

"},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u5934\u8282\u70b9\u89c6\u4e3a\u6808\u9876\uff0c\u5c3e\u8282\u70b9\u89c6\u4e3a\u6808\u5e95\u3002

\u5982\u56fe 5-2 \u6240\u793a\uff0c\u5bf9\u4e8e\u5165\u6808\u64cd\u4f5c\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u5143\u7d20\u63d2\u5165\u94fe\u8868\u5934\u90e8\uff0c\u8fd9\u79cd\u8282\u70b9\u63d2\u5165\u65b9\u6cd5\u88ab\u79f0\u4e3a\u201c\u5934\u63d2\u6cd5\u201d\u3002\u800c\u5bf9\u4e8e\u51fa\u6808\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06\u5934\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u5373\u53ef\u3002

LinkedListStackpush()pop()

\u56fe 5-2 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5982\u56fe 5-3 \u6240\u793a\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5206\u522b\u5bf9\u5e94\u5728\u6570\u7ec4\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u4e0e\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(1)\\) \u3002

ArrayStackpush()pop()

\u56fe 5-3 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

\u7531\u4e8e\u5165\u6808\u7684\u5143\u7d20\u53ef\u80fd\u4f1a\u6e90\u6e90\u4e0d\u65ad\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff0c\u8fd9\u6837\u5c31\u65e0\u987b\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":"

\u652f\u6301\u64cd\u4f5c

\u4e24\u79cd\u5b9e\u73b0\u90fd\u652f\u6301\u6808\u5b9a\u4e49\u4e2d\u7684\u5404\u9879\u64cd\u4f5c\u3002\u6570\u7ec4\u5b9e\u73b0\u989d\u5916\u652f\u6301\u968f\u673a\u8bbf\u95ee\uff0c\u4f46\u8fd9\u5df2\u8d85\u51fa\u4e86\u6808\u7684\u5b9a\u4e49\u8303\u7574\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u4f1a\u7528\u5230\u3002

\u65f6\u95f4\u6548\u7387

\u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u5728\u9884\u5148\u5206\u914d\u597d\u7684\u8fde\u7eed\u5185\u5b58\u4e2d\u8fdb\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u7f13\u5b58\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f83\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u6808\u65f6\u8d85\u51fa\u6570\u7ec4\u5bb9\u91cf\uff0c\u4f1a\u89e6\u53d1\u6269\u5bb9\u673a\u5236\uff0c\u5bfc\u81f4\u8be5\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53d8\u4e3a \\(O(n)\\) \u3002

\u5728\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0\u4e2d\uff0c\u94fe\u8868\u7684\u6269\u5bb9\u975e\u5e38\u7075\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u6570\u7ec4\u6269\u5bb9\u65f6\u6548\u7387\u964d\u4f4e\u7684\u95ee\u9898\u3002\u4f46\u662f\uff0c\u5165\u6808\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u8282\u70b9\u5bf9\u8c61\u5e76\u4fee\u6539\u6307\u9488\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u5165\u6808\u5143\u7d20\u672c\u8eab\u5c31\u662f\u8282\u70b9\u5bf9\u8c61\uff0c\u90a3\u4e48\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9aa4\uff0c\u4ece\u800c\u63d0\u9ad8\u6548\u7387\u3002

\u7efc\u4e0a\u6240\u8ff0\uff0c\u5f53\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u6570\u636e\u7c7b\u578b\u65f6\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

  • \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u5728\u89e6\u53d1\u6269\u5bb9\u65f6\u6548\u7387\u4f1a\u964d\u4f4e\uff0c\u4f46\u7531\u4e8e\u6269\u5bb9\u662f\u4f4e\u9891\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
  • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002

\u7a7a\u95f4\u6548\u7387

\u5728\u521d\u59cb\u5316\u5217\u8868\u65f6\uff0c\u7cfb\u7edf\u4f1a\u4e3a\u5217\u8868\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8be5\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\uff1b\u5e76\u4e14\uff0c\u6269\u5bb9\u673a\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u8fdb\u884c\u6269\u5bb9\u7684\uff0c\u6269\u5bb9\u540e\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002

\u7136\u800c\uff0c\u7531\u4e8e\u94fe\u8868\u8282\u70b9\u9700\u8981\u989d\u5916\u5b58\u50a8\u6307\u9488\uff0c\u56e0\u6b64\u94fe\u8868\u8282\u70b9\u5360\u7528\u7684\u7a7a\u95f4\u76f8\u5bf9\u8f83\u5927\u3002

\u7efc\u4e0a\uff0c\u6211\u4eec\u4e0d\u80fd\u7b80\u5355\u5730\u786e\u5b9a\u54ea\u79cd\u5b9e\u73b0\u66f4\u52a0\u8282\u7701\u5185\u5b58\uff0c\u9700\u8981\u9488\u5bf9\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

"},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u6808\u7684\u5178\u578b\u5e94\u7528","text":"
  • \u6d4f\u89c8\u5668\u4e2d\u7684\u540e\u9000\u4e0e\u524d\u8fdb\u3001\u8f6f\u4ef6\u4e2d\u7684\u64a4\u9500\u4e0e\u53cd\u64a4\u9500\u3002\u6bcf\u5f53\u6211\u4eec\u6253\u5f00\u65b0\u7684\u7f51\u9875\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u5bf9\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u540e\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u4e2a\u7f51\u9875\u3002\u540e\u9000\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u5728\u6267\u884c\u51fa\u6808\u3002\u5982\u679c\u8981\u540c\u65f6\u652f\u6301\u540e\u9000\u548c\u524d\u8fdb\uff0c\u90a3\u4e48\u9700\u8981\u4e24\u4e2a\u6808\u6765\u914d\u5408\u5b9e\u73b0\u3002
  • \u7a0b\u5e8f\u5185\u5b58\u7ba1\u7406\u3002\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u5728\u6808\u9876\u6dfb\u52a0\u4e00\u4e2a\u6808\u5e27\uff0c\u7528\u4e8e\u8bb0\u5f55\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u5411\u4e0b\u9012\u63a8\u9636\u6bb5\u4f1a\u4e0d\u65ad\u6267\u884c\u5165\u6808\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u9636\u6bb5\u5219\u4f1a\u4e0d\u65ad\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u6808\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002
  • \u5728\u65f6\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u5177\u6709\u8f83\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u6269\u5bb9\u8fc7\u7a0b\u4e2d\uff0c\u5355\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6808\u7684\u94fe\u8868\u5b9e\u73b0\u5177\u6709\u66f4\u4e3a\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002
  • \u5728\u7a7a\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u53ef\u80fd\u5bfc\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u94fe\u8868\u8282\u70b9\u6240\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u6bd4\u6570\u7ec4\u5143\u7d20\u66f4\u5927\u3002
  • \u961f\u5217\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u540c\u6837\u53ef\u4ee5\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u7684\u5bf9\u6bd4\u4e0a\uff0c\u961f\u5217\u7684\u7ed3\u8bba\u4e0e\u524d\u8ff0\u6808\u7684\u7ed3\u8bba\u76f8\u4f3c\u3002
  • \u53cc\u5411\u961f\u5217\u662f\u4e00\u79cd\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u961f\u5217\uff0c\u5b83\u5141\u8bb8\u5728\u4e24\u7aef\u8fdb\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u662f\u5426\u662f\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\uff1f

\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u529f\u80fd\u672c\u8d28\u4e0a\u662f\u201c\u6808\u201d\u7684\u4f53\u73b0\u3002\u5f53\u7528\u6237\u8bbf\u95ee\u4e00\u4e2a\u65b0\u9875\u9762\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u88ab\u6dfb\u52a0\u5230\u6808\u9876\uff1b\u5f53\u7528\u6237\u70b9\u51fb\u540e\u9000\u6309\u94ae\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u4ece\u6808\u9876\u5f39\u51fa\u3002\u4f7f\u7528\u53cc\u5411\u961f\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u5728\u201c\u53cc\u5411\u961f\u5217\u201d\u7ae0\u8282\u6709\u63d0\u5230\u3002

Q\uff1a\u5728\u51fa\u6808\u540e\uff0c\u662f\u5426\u9700\u8981\u91ca\u653e\u51fa\u6808\u8282\u70b9\u7684\u5185\u5b58\uff1f

\u5982\u679c\u540e\u7eed\u4ecd\u9700\u8981\u4f7f\u7528\u5f39\u51fa\u8282\u70b9\uff0c\u5219\u4e0d\u9700\u8981\u91ca\u653e\u5185\u5b58\u3002\u82e5\u4e4b\u540e\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8bed\u8a00\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\u3002

Q\uff1a\u53cc\u5411\u961f\u5217\u50cf\u662f\u4e24\u4e2a\u6808\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u4e48\uff1f

\u53cc\u5411\u961f\u5217\u5c31\u50cf\u662f\u6808\u548c\u961f\u5217\u7684\u7ec4\u5408\u6216\u4e24\u4e2a\u6808\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73b0\u7684\u662f\u6808 + \u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u53ef\u4ee5\u5b9e\u73b0\u6808\u4e0e\u961f\u5217\u7684\u6240\u6709\u5e94\u7528\uff0c\u5e76\u4e14\u66f4\u52a0\u7075\u6d3b\u3002

Q\uff1a\u64a4\u9500\uff08undo\uff09\u548c\u53cd\u64a4\u9500\uff08redo\uff09\u5177\u4f53\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff1f

\u4f7f\u7528\u4e24\u4e2a\u6808\uff0c\u6808 A \u7528\u4e8e\u64a4\u9500\uff0c\u6808 B \u7528\u4e8e\u53cd\u64a4\u9500\u3002

  1. \u6bcf\u5f53\u7528\u6237\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c\uff0c\u5c06\u8fd9\u4e2a\u64cd\u4f5c\u538b\u5165\u6808 A \uff0c\u5e76\u6e05\u7a7a\u6808 B \u3002
  2. \u5f53\u7528\u6237\u6267\u884c\u201c\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 A \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 B \u3002
  3. \u5f53\u7528\u6237\u6267\u884c\u201c\u53cd\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 B \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 A \u3002
"},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6811","text":"

Abstract

\u53c2\u5929\u5927\u6811\u5145\u6ee1\u751f\u547d\u529b\uff0c\u6839\u6df1\u53f6\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

\u5b83\u4e3a\u6211\u4eec\u5c55\u73b0\u4e86\u6570\u636e\u5206\u6cbb\u7684\u751f\u52a8\u5f62\u6001\u3002

"},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
  • 7.1 \u00a0 \u4e8c\u53c9\u6811
  • 7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386
  • 7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a
  • 7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811
  • 7.5 \u00a0 AVL \u6811 *
  • 7.6 \u00a0 \u5c0f\u7ed3
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

\u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u4e48\uff0c\u6211\u4eec\u80fd\u5426\u7528\u6570\u7ec4\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\u3002\u7ed9\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u6240\u6709\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u5219\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\u3002

\u6839\u636e\u5c42\u5e8f\u904d\u5386\u7684\u7279\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u63a8\u5bfc\u51fa\u7236\u8282\u70b9\u7d22\u5f15\u4e0e\u5b50\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u201c\u6620\u5c04\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(i\\) \uff0c\u5219\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \u3002\u56fe 7-12 \u5c55\u793a\u4e86\u5404\u4e2a\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\u3002

\u56fe 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u6620\u5c04\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u7ed9\u5b9a\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u7279\u4f8b\uff0c\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\u901a\u5e38\u5b58\u5728\u8bb8\u591a None \u3002\u7531\u4e8e\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b None \uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b None \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\u3002\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002

\u5982\u56fe 7-13 \u6240\u793a\uff0c\u7ed9\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u4e0a\u8ff0\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

\u56fe 7-13 \u00a0 \u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5bf9\u5e94\u591a\u79cd\u4e8c\u53c9\u6811\u53ef\u80fd\u6027

\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u4e2d\u663e\u5f0f\u5730\u5199\u51fa\u6240\u6709 None \u3002\u5982\u56fe 7-14 \u6240\u793a\uff0c\u8fd9\u6837\u5904\u7406\u540e\uff0c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u53c9\u6811\u4e86\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\n# \u4f7f\u7528 None \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6807\u8bb0\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88c5\u7c7b Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 any \u7c7b\u578b\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 None \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
### \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a ###\n# \u4f7f\u7528 nil \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
\n

\u56fe 7-14 \u00a0 \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u4f7f\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u56de\u987e\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u5b9a\u4e49\uff0cNone \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002

\u8fd9\u610f\u5473\u7740\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u56fe 7-15 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u4f8b\u5b50\u3002

\u56fe 7-15 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

\u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u68f5\u57fa\u4e8e\u6570\u7ec4\u8868\u793a\u7684\u4e8c\u53c9\u6811\uff0c\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u64cd\u4f5c\u3002

  • \u7ed9\u5b9a\u67d0\u8282\u70b9\uff0c\u83b7\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3001\u7236\u8282\u70b9\u3002
  • \u83b7\u53d6\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u3001\u540e\u5e8f\u904d\u5386\u3001\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

  • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\u3002
  • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\u3002
  • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\u3002

\u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

  • \u6570\u7ec4\u5b58\u50a8\u9700\u8981\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5b58\u50a8\u6570\u636e\u91cf\u8fc7\u5927\u7684\u6811\u3002
  • \u589e\u5220\u8282\u70b9\u9700\u8981\u901a\u8fc7\u6570\u7ec4\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u5b9e\u73b0\uff0c\u6548\u7387\u8f83\u4f4e\u3002
  • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf None \u65f6\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u7684\u8282\u70b9\u6570\u636e\u6bd4\u91cd\u8f83\u4f4e\uff0c\u7a7a\u95f4\u5229\u7528\u7387\u8f83\u4f4e\u3002
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6811 *","text":"

\u5728\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7ae0\u8282\u4e2d\u6211\u4eec\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u9000\u5316\u4e3a\u94fe\u8868\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u52a3\u5316\u4e3a \\(O(n)\\) \u3002

\u5982\u56fe 7-24 \u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

\u56fe 7-24 \u00a0 AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u56fe 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e24\u4e2a\u8282\u70b9\u540e\uff0c\u6811\u5c06\u4e25\u91cd\u5411\u5de6\u503e\u659c\uff0c\u67e5\u627e\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u968f\u4e4b\u52a3\u5316\u3002

\u56fe 7-25 \u00a0 AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8bba\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6811\u3002\u8bba\u6587\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u6301\u7eed\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4e0d\u4f1a\u9000\u5316\uff0c\u4ece\u800c\u4f7f\u5f97\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7ea7\u522b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5728\u9700\u8981\u9891\u7e41\u8fdb\u884c\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u573a\u666f\u4e2d\uff0cAVL \u6811\u80fd\u59cb\u7ec8\u4fdd\u6301\u9ad8\u6548\u7684\u6570\u636e\u64cd\u4f5c\u6027\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u5e94\u7528\u4ef7\u503c\u3002

"},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

AVL \u6811\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u53c9\u6811\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e24\u7c7b\u4e8c\u53c9\u6811\u7684\u6240\u6709\u6027\u8d28\uff0c\u56e0\u6b64\u662f\u4e00\u79cd\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff08balanced binary search tree\uff09\u3002

"},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u8282\u70b9\u9ad8\u5ea6","text":"

\u7531\u4e8e AVL \u6811\u7684\u76f8\u5173\u64cd\u4f5c\u9700\u8981\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e3a\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u8282\u70b9\u503c\n        self.height: int = 0                # \u8282\u70b9\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\n    int val{};          // \u8282\u70b9\u503c\n    int height = 0;     // \u8282\u70b9\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\n    TreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    public int val;        // \u8282\u70b9\u503c\n    public int height;     // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u8282\u70b9\n    public TreeNode right; // \u53f3\u5b50\u8282\u70b9\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public int height;      // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val    int       // \u8282\u70b9\u503c\n    Height int       // \u8282\u70b9\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var height: Int // \u8282\u70b9\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    height; //\u8282\u70b9\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;            // \u8282\u70b9\u503c\n    height: number;         // \u8282\u70b9\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  int height;      // \u8282\u70b9\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    height: i32,                            // \u8282\u70b9\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val height: Int = 0          // \u8282\u70b9\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\n}\n
### AVL \u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :height # \u8282\u70b9\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
\n

\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\u5b83\u7684\u6700\u8fdc\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u5373\u6240\u7ecf\u8fc7\u7684\u201c\u8fb9\u201d\u7684\u6570\u91cf\u3002\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff0c\u53f6\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(0\\) \uff0c\u800c\u7a7a\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(-1\\) \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e24\u4e2a\u5de5\u5177\u51fd\u6570\uff0c\u5206\u522b\u7528\u4e8e\u83b7\u53d6\u548c\u66f4\u65b0\u8282\u70b9\u7684\u9ad8\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u4e49\u4e3a\u8282\u70b9\u5de6\u5b50\u6811\u7684\u9ad8\u5ea6\u51cf\u53bb\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\uff0c\u540c\u65f6\u89c4\u5b9a\u7a7a\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4e3a \\(0\\) \u3002\u6211\u4eec\u540c\u6837\u5c06\u83b7\u53d6\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

\u8bbe\u5e73\u8861\u56e0\u5b50\u4e3a \\(f\\) \uff0c\u5219\u4e00\u68f5 AVL \u6811\u7684\u4efb\u610f\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6ee1\u8db3 \\(-1 \\le f \\le 1\\) \u3002

"},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6811\u65cb\u8f6c","text":"

AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u201c\u65cb\u8f6c\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u591f\u5728\u4e0d\u5f71\u54cd\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u65cb\u8f6c\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7684\u6027\u8d28\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u201c\u5e73\u8861\u4e8c\u53c9\u6811\u201d\u3002

\u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5931\u8861\u8282\u70b9\u201d\u3002\u6839\u636e\u8282\u70b9\u5931\u8861\u60c5\u51b5\u7684\u4e0d\u540c\uff0c\u65cb\u8f6c\u64cd\u4f5c\u5206\u4e3a\u56db\u79cd\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3002\u4e0b\u9762\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

\u5982\u56fe 7-26 \u6240\u793a\uff0c\u8282\u70b9\u4e0b\u65b9\u4e3a\u5e73\u8861\u56e0\u5b50\u3002\u4ece\u5e95\u81f3\u9876\u770b\uff0c\u4e8c\u53c9\u6811\u4e2d\u9996\u4e2a\u5931\u8861\u8282\u70b9\u662f\u201c\u8282\u70b9 3\u201d\u3002\u6211\u4eec\u5173\u6ce8\u4ee5\u8be5\u5931\u8861\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\uff0c\u5c06\u8be5\u8282\u70b9\u8bb0\u4e3a node \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u8bb0\u4e3a child \uff0c\u6267\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u3002

<1><2><3><4>

\u56fe 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9aa4

\u5982\u56fe 7-27 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

\u56fe 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

\u201c\u5411\u53f3\u65cb\u8f6c\u201d\u662f\u4e00\u79cd\u5f62\u8c61\u5316\u7684\u8bf4\u6cd5\uff0c\u5b9e\u9645\u4e0a\u9700\u8981\u901a\u8fc7\u4fee\u6539\u8282\u70b9\u6307\u9488\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

\u76f8\u5e94\u5730\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u56fe 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

\u56fe 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u5982\u56fe 7-29 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

\u56fe 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

\u53ef\u4ee5\u89c2\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u903b\u8f91\u4e0a\u662f\u955c\u50cf\u5bf9\u79f0\u7684\uff0c\u5b83\u4eec\u5206\u522b\u89e3\u51b3\u7684\u4e24\u79cd\u5931\u8861\u60c5\u51b5\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u57fa\u4e8e\u5bf9\u79f0\u6027\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u53f3\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

\u5bf9\u4e8e\u56fe 7-30 \u4e2d\u7684\u5931\u8861\u8282\u70b9 3 \uff0c\u4ec5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u65e0\u6cd5\u4f7f\u5b50\u6811\u6062\u590d\u5e73\u8861\u3002\u6b64\u65f6\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u53f3\u65cb\u201d\u3002

\u56fe 7-30 \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

\u5982\u56fe 7-31 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u5de6\u65cb\u201d\u3002

\u56fe 7-31 \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f6c\u7684\u9009\u62e9","text":"

\u56fe 7-32 \u5c55\u793a\u7684\u56db\u79cd\u5931\u8861\u60c5\u51b5\u4e0e\u4e0a\u8ff0\u6848\u4f8b\u9010\u4e2a\u5bf9\u5e94\uff0c\u5206\u522b\u9700\u8981\u91c7\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

\u56fe 7-32 \u00a0 AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u4eec\u901a\u8fc7\u5224\u65ad\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f83\u9ad8\u4e00\u4fa7\u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8d1f\u53f7\uff0c\u6765\u786e\u5b9a\u5931\u8861\u8282\u70b9\u5c5e\u4e8e\u56fe 7-32 \u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

\u8868 7-3 \u00a0 \u56db\u79cd\u65cb\u8f6c\u60c5\u51b5\u7684\u9009\u62e9\u6761\u4ef6

\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5e94\u91c7\u7528\u7684\u65cb\u8f6c\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(>0\\) \u5148\u53f3\u65cb\u540e\u5de6\u65cb

\u4e3a\u4e86\u4fbf\u4e8e\u4f7f\u7528\uff0c\u6211\u4eec\u5c06\u65cb\u8f6c\u64cd\u4f5c\u5c01\u88c5\u6210\u4e00\u4e2a\u51fd\u6570\u3002\u6709\u4e86\u8fd9\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u5c31\u80fd\u5bf9\u5404\u79cd\u5931\u8861\u60c5\u51b5\u8fdb\u884c\u65cb\u8f6c\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

AVL \u6811\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u5728\u4e3b\u4f53\u4e0a\u7c7b\u4f3c\u3002\u552f\u4e00\u7684\u533a\u522b\u5728\u4e8e\uff0c\u5728 AVL \u6811\u4e2d\u63d2\u5165\u8282\u70b9\u540e\uff0c\u4ece\u8be5\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e00\u7cfb\u5217\u5931\u8861\u8282\u70b9\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4ece\u8fd9\u4e2a\u8282\u70b9\u5f00\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u7c7b\u4f3c\u5730\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5220\u9664\u8282\u70b9\u65b9\u6cd5\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u4ece\u5e95\u81f3\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
avl_tree.rs
/* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
avl_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
avl_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

AVL \u6811\u7684\u8282\u70b9\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

"},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
  • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\u3002
  • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\u3002
  • \u7ea2\u9ed1\u6811\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u3002\u76f8\u8f83\u4e8e AVL \u6811\uff0c\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u66f4\u5bbd\u677e\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u66f4\u5c11\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

\u5982\u56fe 7-16 \u6240\u793a\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\uff08binary search tree\uff09\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002

  1. \u5bf9\u4e8e\u6839\u8282\u70b9\uff0c\u5de6\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c \\(<\\) \u6839\u8282\u70b9\u7684\u503c \\(<\\) \u53f3\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c\u3002
  2. \u4efb\u610f\u8282\u70b9\u7684\u5de6\u3001\u53f3\u5b50\u6811\u4e5f\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5373\u540c\u6837\u6ee1\u8db3\u6761\u4ef6 1. \u3002

\u56fe 7-16 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811

"},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":"

\u6211\u4eec\u5c06\u4e8c\u53c9\u641c\u7d22\u6811\u5c01\u88c5\u4e3a\u4e00\u4e2a\u7c7b BinarySearchTree \uff0c\u5e76\u58f0\u660e\u4e00\u4e2a\u6210\u5458\u53d8\u91cf root \uff0c\u6307\u5411\u6811\u7684\u6839\u8282\u70b9\u3002

"},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

\u7ed9\u5b9a\u76ee\u6807\u8282\u70b9\u503c num \uff0c\u53ef\u4ee5\u6839\u636e\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u6765\u67e5\u627e\u3002\u5982\u56fe 7-17 \u6240\u793a\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u8282\u70b9 cur \uff0c\u4ece\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9 root \u51fa\u53d1\uff0c\u5faa\u73af\u6bd4\u8f83\u8282\u70b9\u503c cur.val \u548c num \u4e4b\u95f4\u7684\u5927\u5c0f\u5173\u7cfb\u3002

  • \u82e5 cur.val < num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.right \u3002
  • \u82e5 cur.val > num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.left \u3002
  • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\u3002
<1><2><3><4>

\u56fe 7-17 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u8282\u70b9\u793a\u4f8b

\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u60c5\u51b5\u3002\u5faa\u73af\u6b21\u6570\u6700\u591a\u4e3a\u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff0c\u5f53\u4e8c\u53c9\u6811\u5e73\u8861\u65f6\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

\u7ed9\u5b9a\u4e00\u4e2a\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u4e3a\u4e86\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-18 \u6240\u793a\u3002

  1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff1a\u4e0e\u67e5\u627e\u64cd\u4f5c\u76f8\u4f3c\uff0c\u4ece\u6839\u8282\u70b9\u51fa\u53d1\uff0c\u6839\u636e\u5f53\u524d\u8282\u70b9\u503c\u548c num \u7684\u5927\u5c0f\u5173\u7cfb\u5faa\u73af\u5411\u4e0b\u641c\u7d22\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\uff08\u904d\u5386\u81f3 None \uff09\u65f6\u8df3\u51fa\u5faa\u73af\u3002
  2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e None \u7684\u4f4d\u7f6e\u3002

\u56fe 7-18 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

\u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

  • \u4e8c\u53c9\u641c\u7d22\u6811\u4e0d\u5141\u8bb8\u5b58\u5728\u91cd\u590d\u8282\u70b9\uff0c\u5426\u5219\u5c06\u8fdd\u53cd\u5176\u5b9a\u4e49\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u8282\u70b9\u5728\u6811\u4e2d\u5df2\u5b58\u5728\uff0c\u5219\u4e0d\u6267\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
  • \u4e3a\u4e86\u5b9e\u73b0\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\u3002\u8fd9\u6837\u5728\u904d\u5386\u81f3 None \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u83b7\u53d6\u5230\u5176\u7236\u8282\u70b9\uff0c\u4ece\u800c\u5b8c\u6210\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

\u4e0e\u67e5\u627e\u8282\u70b9\u76f8\u540c\uff0c\u63d2\u5165\u8282\u70b9\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

"},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

\u5148\u5728\u4e8c\u53c9\u6811\u4e2d\u67e5\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u518d\u5c06\u5176\u5220\u9664\u3002\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u4ecd\u7136\u6ee1\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u6839\u636e\u76ee\u6807\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u79cd\u60c5\u51b5\uff0c\u6267\u884c\u5bf9\u5e94\u7684\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u3002

\u5982\u56fe 7-19 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \u65f6\uff0c\u8868\u793a\u8be5\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

\u56fe 7-19 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0 \uff09

\u5982\u56fe 7-20 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

\u56fe 7-20 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1 \uff09

\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(2\\) \u65f6\uff0c\u6211\u4eec\u65e0\u6cd5\u76f4\u63a5\u5220\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u8282\u70b9\u66ff\u6362\u8be5\u8282\u70b9\u3002\u7531\u4e8e\u8981\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u56e0\u6b64\u8fd9\u4e2a\u8282\u70b9\u53ef\u4ee5\u662f\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\u6216\u5de6\u5b50\u6811\u7684\u6700\u5927\u8282\u70b9\u3002

\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\uff08\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\uff0c\u5219\u5220\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-21 \u6240\u793a\u3002

  1. \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\u5728\u201c\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff0c\u8bb0\u4e3a tmp \u3002
  2. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff0c\u5e76\u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \u3002
<1><2><3><4>

\u56fe 7-21 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 2 \uff09

\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u540c\u6837\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d\u67e5\u627e\u5f85\u5220\u9664\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u540e\u7ee7\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u904d\u5386\u6709\u5e8f","text":"

\u5982\u56fe 7-22 \u6240\u793a\uff0c\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u904d\u5386\u987a\u5e8f\uff0c\u800c\u4e8c\u53c9\u641c\u7d22\u6811\u6ee1\u8db3\u201c\u5de6\u5b50\u8282\u70b9 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u8282\u70b9\u201d\u7684\u5927\u5c0f\u5173\u7cfb\u3002

\u8fd9\u610f\u5473\u7740\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u8fdb\u884c\u4e2d\u5e8f\u904d\u5386\u65f6\uff0c\u603b\u662f\u4f1a\u4f18\u5148\u904d\u5386\u4e0b\u4e00\u4e2a\u6700\u5c0f\u8282\u70b9\uff0c\u4ece\u800c\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u6027\u8d28\uff1a\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

\u5229\u7528\u4e2d\u5e8f\u904d\u5386\u5347\u5e8f\u7684\u6027\u8d28\uff0c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u83b7\u53d6\u6709\u5e8f\u6570\u636e\u4ec5\u9700 \\(O(n)\\) \u65f6\u95f4\uff0c\u65e0\u987b\u8fdb\u884c\u989d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

\u56fe 7-22 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002\u89c2\u5bdf\u8868 7-2 \uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f\u5bf9\u6570\u9636\uff0c\u5177\u6709\u7a33\u5b9a\u4e14\u9ad8\u6548\u7684\u6027\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u6570\u636e\u7684\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

\u8868 7-2 \u00a0 \u6570\u7ec4\u4e0e\u641c\u7d22\u6811\u7684\u6548\u7387\u5bf9\u6bd4

\u65e0\u5e8f\u6570\u7ec4 \u4e8c\u53c9\u641c\u7d22\u6811 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

\u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f6e\u5faa\u73af\u5185\u67e5\u627e\u4efb\u610f\u8282\u70b9\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u4e0d\u65ad\u5730\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\uff0c\u53ef\u80fd\u5bfc\u81f4\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u56fe 7-23 \u6240\u793a\u7684\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

\u56fe 7-23 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
  • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
  • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
  • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u53c9\u6811","text":"

\u4e8c\u53c9\u6811\uff08binary tree\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u4e8c\u53c9\u6811\u7684\u57fa\u672c\u5355\u5143\u662f\u8282\u70b9\uff0c\u6bcf\u4e2a\u8282\u70b9\u5305\u542b\u503c\u3001\u5de6\u5b50\u8282\u70b9\u5f15\u7528\u548c\u53f3\u5b50\u8282\u70b9\u5f15\u7528\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    int val;          // \u8282\u70b9\u503c\n    TreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    int val;         // \u8282\u70b9\u503c\n    TreeNode left;   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n        Right: nil, // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n        Val:   v,   // \u8282\u70b9\u503c\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct TreeNode {\n    int val;                // \u8282\u70b9\u503c\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    struct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
### \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
\n

\u6bcf\u4e2a\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u5206\u522b\u6307\u5411\u5de6\u5b50\u8282\u70b9\uff08left-child node\uff09\u548c\u53f3\u5b50\u8282\u70b9\uff08right-child node\uff09\uff0c\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u7236\u8282\u70b9\uff08parent node\uff09\u3002\u5f53\u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u65f6\uff0c\u6211\u4eec\u5c06\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6811\uff08right subtree\uff09\u3002

\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u9664\u53f6\u8282\u70b9\u5916\uff0c\u5176\u4ed6\u6240\u6709\u8282\u70b9\u90fd\u5305\u542b\u5b50\u8282\u70b9\u548c\u975e\u7a7a\u5b50\u6811\u3002\u5982\u56fe 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c06\u201c\u8282\u70b9 2\u201d\u89c6\u4e3a\u7236\u8282\u70b9\uff0c\u5219\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u5206\u522b\u662f\u201c\u8282\u70b9 4\u201d\u548c\u201c\u8282\u70b9 5\u201d\uff0c\u5de6\u5b50\u6811\u662f\u201c\u8282\u70b9 4 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\uff0c\u53f3\u5b50\u6811\u662f\u201c\u8282\u70b9 5 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\u3002

\u56fe 7-1 \u00a0 \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

"},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

\u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed\u5982\u56fe 7-2 \u6240\u793a\u3002

  • \u6839\u8282\u70b9\uff08root node\uff09\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\u3002
  • \u53f6\u8282\u70b9\uff08leaf node\uff09\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 None \u3002
  • \u8fb9\uff08edge\uff09\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002
  • \u8282\u70b9\u6240\u5728\u7684\u5c42\uff08level\uff09\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \u3002
  • \u8282\u70b9\u7684\u5ea6\uff08degree\uff09\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u8303\u56f4\u662f 0\u30011\u30012 \u3002
  • \u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
  • \u8282\u70b9\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
  • \u8282\u70b9\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u8ddd\u79bb\u8be5\u8282\u70b9\u6700\u8fdc\u7684\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002

\u56fe 7-2 \u00a0 \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

Tip

\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8282\u70b9\u7684\u6570\u91cf\u201d\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

"},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u53c9\u6811","text":"

\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\uff08\u6307\u9488\uff09\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// \u521d\u59cb\u5316\u8282\u70b9\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
# \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9","text":"

\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u3002\u56fe 7-3 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u793a\u4f8b\u3002

\u56fe 7-3 \u00a0 \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = p\np.left = n2\n# \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.cpp
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.cs
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.go
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.js
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.ts
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.dart
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u5220\u9664\u8282\u70b9 p\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
binary_tree.rb
# \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 _p\nn1.left = _p\n_p.left = n2\n# \u5220\u9664\u8282\u70b9\nn1.left = n2\n
binary_tree.zig
\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u8282\u70b9\u53ef\u80fd\u4f1a\u6539\u53d8\u4e8c\u53c9\u6811\u7684\u539f\u6709\u903b\u8f91\u7ed3\u6784\uff0c\u800c\u5220\u9664\u8282\u70b9\u901a\u5e38\u610f\u5473\u7740\u5220\u9664\u8be5\u8282\u70b9\u53ca\u5176\u6240\u6709\u5b50\u6811\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5b9e\u73b0\u6709\u5b9e\u9645\u610f\u4e49\u7684\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff08perfect binary tree\uff09\u6240\u6709\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u5b8c\u5168\u586b\u6ee1\u3002\u5728\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\uff0c\u53f6\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u7684\u5ea6\u90fd\u4e3a \\(2\\) \uff1b\u82e5\u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \uff0c\u5219\u8282\u70b9\u603b\u6570\u4e3a \\(2^{h+1} - 1\\) \uff0c\u5448\u73b0\u6807\u51c6\u7684\u6307\u6570\u7ea7\u5173\u7cfb\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u89c1\u7684\u7ec6\u80de\u5206\u88c2\u73b0\u8c61\u3002

Tip

\u8bf7\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u6ee1\u4e8c\u53c9\u6811\u3002

\u56fe 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c42\u7684\u8282\u70b9\u672a\u88ab\u586b\u6ee1\uff0c\u4e14\u6700\u5e95\u5c42\u8282\u70b9\u5c3d\u91cf\u9760\u5de6\u586b\u5145\u3002

\u56fe 7-5 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-6 \u6240\u793a\uff0c\u5b8c\u6ee1\u4e8c\u53c9\u6811\uff08full binary tree\uff09\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

\u56fe 7-6 \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811","text":"

\u5982\u56fe 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u53c9\u6811\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u8282\u70b9\u7684\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7edd\u5bf9\u503c\u4e0d\u8d85\u8fc7 1 \u3002

\u56fe 7-7 \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811

"},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

\u56fe 7-8 \u5c55\u793a\u4e86\u4e8c\u53c9\u6811\u7684\u7406\u60f3\u7ed3\u6784\u4e0e\u9000\u5316\u7ed3\u6784\u3002\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u201c\u94fe\u8868\u201d\u3002

  • \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u7406\u60f3\u60c5\u51b5\uff0c\u53ef\u4ee5\u5145\u5206\u53d1\u6325\u4e8c\u53c9\u6811\u201c\u5206\u6cbb\u201d\u7684\u4f18\u52bf\u3002
  • \u94fe\u8868\u5219\u662f\u53e6\u4e00\u4e2a\u6781\u7aef\uff0c\u5404\u9879\u64cd\u4f5c\u90fd\u53d8\u4e3a\u7ebf\u6027\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u56fe 7-8 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

\u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7ed3\u6784\u548c\u6700\u5dee\u7ed3\u6784\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf\u3001\u8282\u70b9\u603b\u6570\u3001\u9ad8\u5ea6\u7b49\u8fbe\u5230\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u3002

\u8868 7-1 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

\u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u7684\u6811\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

\u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

\u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

\u5982\u56fe 7-9 \u6240\u793a\uff0c\u5c42\u5e8f\u904d\u5386\uff08level-order traversal\uff09\u4ece\u9876\u90e8\u5230\u5e95\u90e8\u9010\u5c42\u904d\u5386\u4e8c\u53c9\u6811\uff0c\u5e76\u5728\u6bcf\u4e00\u5c42\u6309\u7167\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\u8bbf\u95ee\u8282\u70b9\u3002

\u5c42\u5e8f\u904d\u5386\u672c\u8d28\u4e0a\u5c5e\u4e8e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\uff08breadth-first traversal\uff09\uff0c\u4e5f\u79f0\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\u3002

\u56fe 7-9 \u00a0 \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u201c\u961f\u5217\u201d\u6765\u5b9e\u73b0\u3002\u961f\u5217\u9075\u5faa\u201c\u5148\u8fdb\u5148\u51fa\u201d\u7684\u89c4\u5219\uff0c\u800c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5219\u9075\u5faa\u201c\u9010\u5c42\u63a8\u8fdb\u201d\u7684\u89c4\u5219\uff0c\u4e24\u8005\u80cc\u540e\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
binary_tree_bfs.cpp
/* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

"},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d \\(n\\) \u4e3a\u8282\u70b9\u6570\u91cf\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6ee1\u4e8c\u53c9\u6811\u65f6\uff0c\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u6700\u591a\u540c\u65f6\u5b58\u5728 \\((n + 1) / 2\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002
"},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

\u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\uff08depth-first traversal\uff09\uff0c\u4e5f\u79f0\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff08depth-first search, DFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\u3002

\u56fe 7-10 \u5c55\u793a\u4e86\u5bf9\u4e8c\u53c9\u6811\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u68f5\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u4e2a\u8282\u70b9\u90fd\u4f1a\u9047\u5230\u4e09\u4e2a\u4f4d\u7f6e\uff0c\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u3002

\u56fe 7-10 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386

"},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
\u53ef\u89c6\u5316\u8fd0\u884c

\u5168\u5c4f\u89c2\u770b >

Tip

\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4e5f\u53ef\u4ee5\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

\u56fe 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u904d\u5386\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5176\u53ef\u5206\u4e3a\u201c\u9012\u201d\u548c\u201c\u5f52\u201d\u4e24\u4e2a\u9006\u5411\u7684\u90e8\u5206\u3002

  1. \u201c\u9012\u201d\u8868\u793a\u5f00\u542f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5e8f\u5728\u6b64\u8fc7\u7a0b\u4e2d\u8bbf\u95ee\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002
  2. \u201c\u5f52\u201d\u8868\u793a\u51fd\u6570\u8fd4\u56de\uff0c\u4ee3\u8868\u5f53\u524d\u8282\u70b9\u5df2\u7ecf\u8bbf\u95ee\u5b8c\u6bd5\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u56fe 7-11 \u00a0 \u524d\u5e8f\u904d\u5386\u7684\u9012\u5f52\u8fc7\u7a0b

"},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
  • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
  • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u7cfb\u7edf\u5360\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
  • \u4e8c\u53c9\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4f53\u73b0\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u6bcf\u4e2a\u4e8c\u53c9\u6811\u8282\u70b9\u5305\u542b\u4e00\u4e2a\u503c\u4ee5\u53ca\u4e24\u4e2a\u6307\u9488\uff0c\u5206\u522b\u6307\u5411\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u3002
  • \u5bf9\u4e8e\u4e8c\u53c9\u6811\u4e2d\u7684\u67d0\u4e2a\u8282\u70b9\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6811\u88ab\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6811\u3002
  • \u4e8c\u53c9\u6811\u7684\u76f8\u5173\u672f\u8bed\u5305\u62ec\u6839\u8282\u70b9\u3001\u53f6\u8282\u70b9\u3001\u5c42\u3001\u5ea6\u3001\u8fb9\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
  • \u4e8c\u53c9\u6811\u7684\u521d\u59cb\u5316\u3001\u8282\u70b9\u63d2\u5165\u548c\u8282\u70b9\u5220\u9664\u64cd\u4f5c\u4e0e\u94fe\u8868\u64cd\u4f5c\u65b9\u6cd5\u7c7b\u4f3c\u3002
  • \u5e38\u89c1\u7684\u4e8c\u53c9\u6811\u7c7b\u578b\u6709\u5b8c\u7f8e\u4e8c\u53c9\u6811\u3001\u5b8c\u5168\u4e8c\u53c9\u6811\u3001\u5b8c\u6ee1\u4e8c\u53c9\u6811\u548c\u5e73\u8861\u4e8c\u53c9\u6811\u3002\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u6700\u7406\u60f3\u7684\u72b6\u6001\uff0c\u800c\u94fe\u8868\u662f\u9000\u5316\u540e\u7684\u6700\u5dee\u72b6\u6001\u3002
  • \u4e8c\u53c9\u6811\u53ef\u4ee5\u7528\u6570\u7ec4\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c06\u8282\u70b9\u503c\u548c\u7a7a\u4f4d\u6309\u5c42\u5e8f\u904d\u5386\u987a\u5e8f\u6392\u5217\uff0c\u5e76\u6839\u636e\u7236\u8282\u70b9\u4e0e\u5b50\u8282\u70b9\u4e4b\u95f4\u7684\u7d22\u5f15\u6620\u5c04\u5173\u7cfb\u6765\u5b9e\u73b0\u6307\u9488\u3002
  • \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386\u662f\u4e00\u79cd\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u65b9\u6cd5\uff0c\u5b83\u4f53\u73b0\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u901a\u8fc7\u961f\u5217\u6765\u5b9e\u73b0\u3002
  • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u7686\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u5b83\u4eec\u4f53\u73b0\u4e86\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u6765\u5b9e\u73b0\u3002
  • \u4e8c\u53c9\u641c\u7d22\u6811\u662f\u4e00\u79cd\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u627e\u6570\u636e\u7ed3\u6784\uff0c\u5176\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \u3002\u5f53\u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u5404\u9879\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • AVL \u6811\uff0c\u4e5f\u79f0\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\u6811\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
  • AVL \u6811\u7684\u65cb\u8f6c\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4f1a\u4ece\u5e95\u5411\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5bf9\u4e8e\u53ea\u6709\u4e00\u4e2a\u8282\u70b9\u7684\u4e8c\u53c9\u6811\uff0c\u6811\u7684\u9ad8\u5ea6\u548c\u6839\u8282\u70b9\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u5417\uff1f

\u662f\u7684\uff0c\u56e0\u4e3a\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\u3002

Q\uff1a\u4e8c\u53c9\u6811\u4e2d\u7684\u63d2\u5165\u4e0e\u5220\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u8fd9\u91cc\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u4e48\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u4e3a\u8d44\u6e90\u7684\u5b50\u8282\u70b9\u7684\u8d44\u6e90\u91ca\u653e\u5417\uff1f

\u62ff\u4e8c\u53c9\u641c\u7d22\u6811\u6765\u4e3e\u4f8b\uff0c\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u8981\u5206\u4e09\u79cd\u60c5\u51b5\u5904\u7406\uff0c\u5176\u4e2d\u6bcf\u79cd\u60c5\u51b5\u90fd\u9700\u8981\u8fdb\u884c\u591a\u4e2a\u6b65\u9aa4\u7684\u8282\u70b9\u64cd\u4f5c\u3002

Q\uff1a\u4e3a\u4ec0\u4e48 DFS \u904d\u5386\u4e8c\u53c9\u6811\u6709\u524d\u3001\u4e2d\u3001\u540e\u4e09\u79cd\u987a\u5e8f\uff0c\u5206\u522b\u6709\u4ec0\u4e48\u7528\u5462\uff1f

\u4e0e\u987a\u5e8f\u548c\u9006\u5e8f\u904d\u5386\u6570\u7ec4\u7c7b\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u662f\u4e09\u79cd\u4e8c\u53c9\u6811\u904d\u5386\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u4eec\u5f97\u5230\u4e00\u4e2a\u7279\u5b9a\u987a\u5e8f\u7684\u904d\u5386\u7ed3\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\uff0c\u7531\u4e8e\u8282\u70b9\u5927\u5c0f\u6ee1\u8db3 \u5de6\u5b50\u8282\u70b9\u503c < \u6839\u8282\u70b9\u503c < \u53f3\u5b50\u8282\u70b9\u503c \uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u4f18\u5148\u7ea7\u904d\u5386\u6811\uff0c\u5c31\u53ef\u4ee5\u83b7\u5f97\u6709\u5e8f\u7684\u8282\u70b9\u5e8f\u5217\u3002

Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u5904\u7406\u5931\u8861\u8282\u70b9 node\u3001child\u3001grand_child \u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u90a3 node \u7684\u7236\u8282\u70b9\u548c node \u539f\u6765\u7684\u8fde\u63a5\u4e0d\u9700\u8981\u7ef4\u62a4\u5417\uff1f\u53f3\u65cb\u64cd\u4f5c\u540e\u5c82\u4e0d\u662f\u65ad\u6389\u4e86\uff1f

\u6211\u4eec\u9700\u8981\u4ece\u9012\u5f52\u7684\u89c6\u89d2\u6765\u770b\u8fd9\u4e2a\u95ee\u9898\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u4f20\u5165\u7684\u662f\u5b50\u6811\u7684\u6839\u8282\u70b9\uff0c\u6700\u7ec8 return child \u8fd4\u56de\u65cb\u8f6c\u4e4b\u540e\u7684\u5b50\u6811\u7684\u6839\u8282\u70b9\u3002\u5b50\u6811\u7684\u6839\u8282\u70b9\u548c\u5176\u7236\u8282\u70b9\u7684\u8fde\u63a5\u662f\u5728\u8be5\u51fd\u6570\u8fd4\u56de\u540e\u5b8c\u6210\u7684\uff0c\u4e0d\u5c5e\u4e8e\u53f3\u65cb\u64cd\u4f5c\u7684\u7ef4\u62a4\u8303\u56f4\u3002

Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u6570\u88ab\u5212\u5206\u5230 private \u548c public \u4e2d\uff0c\u8fd9\u65b9\u9762\u6709\u4ec0\u4e48\u8003\u91cf\u5417\uff1f\u4e3a\u4ec0\u4e48\u8981\u5c06 height() \u51fd\u6570\u548c updateHeight() \u51fd\u6570\u5206\u522b\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

\u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u8303\u56f4\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u7c7b\u5185\u90e8\u4f7f\u7528\uff0c\u90a3\u4e48\u5c31\u8bbe\u8ba1\u4e3a private \u3002\u4f8b\u5982\uff0c\u7528\u6237\u5355\u72ec\u8c03\u7528 updateHeight() \u662f\u6ca1\u6709\u610f\u4e49\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8bbf\u95ee\u8282\u70b9\u9ad8\u5ea6\uff0c\u7c7b\u4f3c\u4e8e vector.size() \uff0c\u56e0\u6b64\u8bbe\u7f6e\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

Q\uff1a\u5982\u4f55\u4ece\u4e00\u7ec4\u8f93\u5165\u6570\u636e\u6784\u5efa\u4e00\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\uff1f\u6839\u8282\u70b9\u7684\u9009\u62e9\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

\u662f\u7684\uff0c\u6784\u5efa\u6811\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4ee3\u7801\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7ed9\u51fa\u3002\u81f3\u4e8e\u6839\u8282\u70b9\u7684\u9009\u62e9\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u8f93\u5165\u6570\u636e\u6392\u5e8f\uff0c\u7136\u540e\u5c06\u4e2d\u70b9\u5143\u7d20\u4f5c\u4e3a\u6839\u8282\u70b9\uff0c\u518d\u9012\u5f52\u5730\u6784\u5efa\u5de6\u53f3\u5b50\u6811\u3002\u8fd9\u6837\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8bc1\u6811\u7684\u5e73\u8861\u6027\u3002

Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u7b26\u4e32\u5bf9\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

\u5728 Java \u4e2d\uff0c\u5bf9\u4e8e\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c== \u7528\u4e8e\u5bf9\u6bd4\u4e24\u4e2a\u53d8\u91cf\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5bf9\u4e8e\u5f15\u7528\u7c7b\u578b\uff0c\u4e24\u79cd\u7b26\u53f7\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

  • == \uff1a\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u53d8\u91cf\u662f\u5426\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5373\u5b83\u4eec\u5728\u5185\u5b58\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
  • equals()\uff1a\u7528\u6765\u5bf9\u6bd4\u4e24\u4e2a\u5bf9\u8c61\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9\u6bd4\u503c\uff0c\u6211\u4eec\u5e94\u8be5\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u901a\u8fc7 String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u7b26\u4e32\u90fd\u5b58\u50a8\u5728\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\uff0c\u5b83\u4eec\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u6765\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u3002

Q\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u7684\u8282\u70b9\u6570\u91cf\u662f \\(2^h\\) \u5417\uff1f

\u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6ee1\u4e8c\u53c9\u6811\uff0c\u5176\u8282\u70b9\u603b\u6570 \\(n = 7\\) \uff0c\u5219\u5e95\u5c42\u8282\u70b9\u6570\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 0a92689b4bc31317ef92468d24abaf40f095c23d..6ee63b3febbcc0711f19fb1d2da9e03e612ed422 100644 GIT binary patch delta 15 Wcmey&{+XRkzMF$1b;Cxsx6A-6tp#xa delta 15 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 z zL?J)dcWNU41J>9su>e0i;w+MeBRvE_#w?1%>iZ|to1o7B>ppR66|q~d_=59qrZbTM0Xmj|FD;7DCrA%9jO+_$WIgX4~uK9?9U*?sbT z2UBL-Y643w({r!;PXHj$<44dh*U8m=V19NEv%NYDYzzYvkB-?^HE~D>n^7j*N-92{ z6rf7RXTeeeN!<~6t#cdE_hhd{j`BxXLKw6hEv2|lIf%&0(D`mfN;v^D3_-bgNQSl0 z^Tssbyy6^ciQByu$*DiM-ruHPuQo=B{t^N94W)JqUh_W;O(vp;bh{c)PoB zo{90a3{FFlRzkWN+W;Y}7%=C^N54`_+48yPNH50P)(^#Wn{@OB{6zPDA!-7`L03De zq1PXJ$=$8pv~0PFr33iyCKGdjlFSIqe_%$^aq3(_DSyKZMAY~wU zl6cC`dZmud-dzu2o&Oy0p=0Z~LK%1G&7Ax&H7UNm07hNqPw7B-nQn#sL~XBLLJ%qi z0C3w0x?{K2c9aghaWK~SxA-Dw(?ot2|{8&T?4EoQl(n%tyq%OsC>Lx2EDG8Sf z0V4Qh$#rG9%Gr9F3hSgFjuKhjzwbF%<7N>oD$r`FT4f=^CXdWps;iui#lrWgh6uW1 zK~=#~%3~>%eu}!C+nvC;n0l5ObDi*Bso6v7^yv{m+ugxPSgA+{x{ zJ3B(e7_aRb@F^;x>9f3kRJ_e9)B%a>N?nDBwhohJa*UyBTAjrjL~hm`(B+R}qYb*x z#Qs}0jNo?m4<8m;6k5vslz3hH#aQ&8kC-3^gi-?CzH$W7sF%P}p{+G4s|M#iC134PuzeeG&1GiDA|I-{IkH|#$Jb0&2 Q@!z|Wyt-VYjCuI~1NPuw0{{R3 literal 32117 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 diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step1.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step1.png index 8b70e7ac586be53b43b5a608a6a26ab0f6517a4b..35fbc71a1dbb422f20a4ab3c49881449e824141d 100644 GIT binary patch literal 22989 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%0Dn>%s%ptm#y9MX026SMP5v5- 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 DLJkYl diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step10.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step10.png index 80dc83febfd1f001592986ab3d80b4b6ee47fbb7..18efb8e6180e07ad2ff95c6f6306e50b782258c2 100644 GIT binary patch literal 44103 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 literal 43930 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 ADF6Tf diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step11.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step11.png index 408949826c7b950efe6eb64fbd887d8cc671d190..014c3d880d6057a3af7b5660a3be7cc74cca0a38 100644 GIT binary patch literal 33864 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 delta 32774 zcmY&_wcf8; ztGnx*s$JF9b!yiPM8YLUz$JPs++N>4-`?I{-8|pi++1H@UtL{Y++CkvK3!g3UR+$9 z-d-Hv93NdD9$ud8UL2jDpYNXUAD=y)otSTnHgO=9+^v#0;eO?e>=#uQLrbemN=j0S_n=T{ zadB}{{$fEvL4JOIZfNH)20A)A8X6j^s;cB+BLu<23N|y6W>X^i6MS0Z9IB(N%A<;k zin4&Ltdx|LgoK2cnAp2_?}UYg%^+lUAP_JrCn>J!n{(QQ=8A9Ceg87z954Mg+o)c1 zf>=zo644iaz$yCq+Wk8|LLcG2symv5Kw*y2%`4(ITI5&BNIHy0_z70Kpztc68K%Um zuWLF)6bjXS>L%xBZ)$egYPO8T6aT&+pMFQ$a#mW)J-wRw@TtO*ZuL+0-#hN>r^l5? zJBgHU@ZVD=;4y(9$BJ~;S`>YF5a^Y}TWCti90&vo<}lTm-w2}B9Cs;4*M$S+XT<6g z%=v3uX-%MJF~%WOgF&j2ONp3pMBKH3gBh32#GJ@5BjVV$~d) zlB4CAKH$y+v+MDQ=QLy4B+%>g-5tF~sWqIp?fK_q)>`XJlMkOU{}2&VF;G`%*Pyjm zDoJ~8X5`b}c+>S%*u=Dl3a*?kaaQsD9_lG`c_PNNxj8_;z`hqHrUFTognCqk3+;w8NB3q5A0C!i(%#irNG-f;HHVevcj6_Gbk*a({dUNrC z0;&L?ri$$uO0|q-=a^1x`XiN<#5u1}`o<#Sek+!QyC!223lUj9Hr!Kd0#`!*R$55d z7Qpaxy+e;%=d^elpP?kesXy@lmg+&oYTkj#imNz>&QaQb4ms|lXB~3<%F+AM9?Y4F z-t}kq1ABCr#z$k(o2$DS+uA(>FMU_MelMBdHA!t( z@KKM(HOsCS+D*BtI`U4giJ-VfR4F8k`vHD>fh|h!=-yFFn+MhYO<$;c`{#a`5Yac1 z()GuVj(T9+a%0ANR2LD2{5{hhcNpA8QrW;J`Ieea9*6m2>l?WkQmEiIJhchQ<_c^`i84pH0=?D zb!KN@7akE;kuvEujAyVzsmkAzF2s8l@o%etUZDK5aIEUJJlye{&ufl*ajeP}+d-Y% zrQ`c|P;C#dMMFwd8Oq%VHo;H~N*j>TbJn@l<8SO|RZoozVlO-85A35Q#R^8KFt#bv z=%aARZt}O>)G8NXX~tR2_P;0Q*pAK3uI*lMrH`C@wZ{zx((RUUxnyrEr1UMk`l)U& zn0-fGvh<6{?Rk;kD8_4%Exr%^Nq;_}+$@`&)KHBjJUC-+!oz^IWf#NgX$?eKdRqtc z_SrsMGNsY6X3Zj%4SCm8GYGIX>!rqH$XgZ=4;k+3Xd@0}HGMYz^pI#Dw9;#B=+;N@ z(xy?3Z|v6R(u_{0=!J08g4Vo#^gIHSVyTF)c~&r@)-lhm`MnON ze2y(s0tSVXJ(qA(rd4A{`vfqherI#=O0gI^86>n~h;MLu72frU^_irQ>lelaZ4-Fp z>CXU96UqqbkBTpsYHLJM`U=OB_ax5LL|xBJc^udEzkkeuOy2BNR1zi)6jY6yF8^lr zsi<~79EDe)qWL*1!iULS{8aC&G#m`yJgJ0mb`+hZr2oc6huigq$(Ek1VdfD!q(9E}_BOSKwk|VB_n7GndMbovnSrLv;>Rh=4V^_L^xWU6jPSEswm3S_K-OceQp zYgJ|5JF6NU_GD=BMlu2+o$%*-$1Rs*?{7mRQ16$NPcU3<_hxFl13HE<%!e0sx)@3Z zI{lsN*vV1_P$t7-v-j%KhEIYdK~q)lenpL<7c`a&ERho}AI#xq5KL25nC!d4KhIiz zqw0R>(=pj>>0f2rD{3pscmUBU5#$tG zOIu57x<(g$a!Ir`Q;-0=#xKP;+z>N$Cg}WlhLrfn`rWF$wcj3_oRm6XaMyA)YAm`y zeU?6*_~NpGNEHj}X^m0aNCNJU4#`D@tMSQPmBiHFzIDz&> zRX0m)*DSQlZ}6F(xs=EAXM*p{YP=87-{hS0SNY$`w`7Hg3Hg^ zVvI+Paofi+I?vA%y^)qlK78hrt#teBj?Qts#y{uzH~j{e$KDDLlz^P#w!@i9X?MgG z(&p)002KsgtX9rTA|2C6y72Xi{WafTrF^LH zF&dGH^fTbQ6|YF4kpJ^eDbA52N7W|CvdlkM$2-#b+sw^Ty4zdiflz^QMH_-lPbLG; zeWLnG)+|y9S0*JdT6hOWR^QWMtGc-AI=1FDF-mRV+sDlJ=eD*g%?QQ?m?0b)Zzp_%IZxYhM%;5Mmw!j+>5a$e=7p=kvGB+1qvbRu@7IzEuQio4-07o?Y1ik7Vxe9!}6v4Kf(^sP{v3VF*O z3BruTbBai=J5i@S%V}t)f3sX%7mcv9x0n_YA;giC69Qno8TSVgkA zu(a~vrDwJUsW@`-_WIhRdQEchi(%aLBskmjA%c+6rxlIGWx1gqa!xZpZPB~*Dj8W1 z8aAqaiIqXYbg_75sIk>xZ6NWl_0j|ivY4)HBwuD&c-Y7uL2sH{n4@dzAZue+{xk@0 z#=XwZ264g1&SCRBq=A7iPJ3EZ3|8T7!nE4Qx6_wXqa9y zYPdu$VLzAY5DJFF##O{{6{O~N7$BFIx#%a)v~>RkIxn6l_+fd)-}}bQD#!^(o$-`c zmVgYVldI`cW)l!`e!47W2dFbDS*~R^(K{jEPj#TWaQWSW-JKF%`*v?sOf8KRv({22 zK}+fBFZ8P>HzZwa7#zGf{>ad90AF1{+i!KO6L=N^!hE9tE7SoKHY7dv+24-gnx zP|Yh&nFMe4EtCFk2X`hp6d@4bznKTm$?Gt*m`(H9U{f)M^|%VGl>-LF*Xd$G#&&Mo z+xb$ufXvB}_OnzyLgOq$18d%3>o%U6>iTZv!uqB~;{492SaDO3MA+^-42of>k|OUk zcTC4TfsG$twz8OpBm#$8TXR0vL8|RF)#z4mAqey$m(ddJ#MO47)E4GPwjfP9KbJ@7 z(a8G~7Ll&82X@zqgXQ7xKC`et?RJDxMjk6maN zI9NBFjPfrZ{>dGhc^hu@YM5%Yn$PRX^m?hJaB#?WxM;!uZA_@L3^s_?B^U*3RZkyK zDsj0SQNg}fMZh<^tO*g#*N}eQHz#bjFvRo<14Dcm^r_z0jYK#9FojbIr$ro_E5e(w z`i1@NsL?xxYEbfnRA#o*#9sM=KYdKw9|Tso-{V`!K4NO)?%P}_)pXnmQ%Rz-9z}7K zY=&P4yfl(!>Tc!b-(v)!oK&)3zFeaK{jNzv_OvmHk3XLaF@kJq8pVxDB{h};dL3X- zZUDQ(TSf+kBK4S{D7FMj*I4V)sJGiMfv*#xXc=G0&Aww=}W zMyz6V#+}#>xHnj!mjJ~h<$QCNH&G9Qq6k4YWqtIw8Y6LL(6>p|tGJEUC2?RktZa$x zi_y*Bo<^R2%(4ecJ^A@Z^Rd^knr*8XZh#)ed9}%5ey%#kXog5cnw3yZWWX=A7Ea-~ zzB#QOER^e!6KUViH+5z%;ykLDg_mtMRruYKNruoOP(s7W8Mcb~GNS!PieZ*oUfg!(zc4)E>~1&Lc3_q&Cp%BRN2N~PUo*BPvVU7476Pzd@w%oBBX z;L3-_Ch-wmM_cTa{*&X_wL-#566QkR32l0{PpB+?!%Xn-Gmdo5nFAGAv~S)hj#@#&!O<+d^L9UncWY-s??* z%+1EJedi_}A0+21fu9W(-^{NXVaj-(kruLC&C3M)8Ku!Mu%v6zA!am_;Lg)~ESZP( z-{kSHx!4sVsm`WNC@9$By^(t<(a&oVWQ8sEaBiYR7Kqe6z!bAABO+yYOMS2Q31wuz zUNJ<%O|RGxU3J(hsp`^K3xhu@H3?DZe5v@THG|n?i63}!dT*& zMosCyoAV@;Q)ujVu!t+y#pP;bCzlWyxb&ag*IK9Y6wDMSugM%SR*2uePlv%hvRz*l z0@uSL{s0i0RxH7p0fU;ogJ(0A^$${kkP*K%gbe1bv;AgD}SJer6b>zT>;vOo>+9(aJt?@zd9*B zU<#DJWa1DlY1*~_dW>xAR)*uj&1(y;S?&RVHclbN!5ca*7jHSv zYB7mOu{OJavLzpACZ4PWQBcq7Spblgm@?BmTLyj(E<9p-`I49o;#(<|Ok%1^_5*JF z<1NM*mpP|xNHpSbnGwHHVCW|e=hQmj>2Jxp;up6M2`ocfn!+yK_D8X-%SLD`oKC~a z4#D+h282p~W@m*R*%W-VbSih!3TjYo1!f6ZkB)Mf8weH}e3u$4U0S+XhAG8J66JRX zezvkRpS1OEaNVY|p-D&QUUBsH{i2)Ysk4wi`&BJyq?=rpI~ZnIyqreXq`M9R&eVLq zH1x4C*_?ZO>Esz0p{{tnqxLWQnvlihopUU`QNy^DJJ?P&T(&&T&$viF(XJw+e{yK1g^W+*b%9aP*TK-082>x=z9l>}*t(NA*M4!^{mdhgTr3`55W8zSCN zqnX&jKx~~s$O1J#C~KaT*9e6gT)&a?jA-zN zEb6q`*z zIl^_s|M-~kHkb~vHAYt&rI|QjRo@i;u-{~iwudX>pCb@hAeHl82`Kszv4-j8%QFw!!%E{5V zWT8HcUlqwsy;4AD-Gb{T>t1QHBnGWUgfw#71)UCDDK=N*dj4PwX-MR%)vEk}Rs;ic za8>u34JY$=@y9nSOvkTSEa0nbjR;OgUFde&6=%Qi2CGcHZc^>IEn-1W0OD~0og)+Z*#mRSuTyqN0^%z=g(K%3qFmR zDgSdYdf8zyl0^299vgQ`4Mr%uwiNRWKg`21gMyuKtv_`8nBu`#<>Y}ZMX@*rpCs7Q zVh{9@J0VUvLXajUGV6o5>7#nYawB&gxz3R}klwcD`lhW#knp4I{6hn_Z;ZamIxuNU zUL67EdSr8|v}XKMdQsw@HcS%$NJsHnnFUp;K^4fg+qMXLvtvWi1(i7E3WqQ_N>NxA z*{zMqmUl!^*XNmD zH6-NL<6M5^|0T;4Op?OjL{p%=3$WOQrX%(21>62q1Pj$P_LQ0x`?QA|^Ut{No3CFZr;PWI;4C*Wmdgv(-P z>~y(Bg_g*9-T5F^MTP|3^{LNNe!PZ)8~q1sJHu*u#>*Es1+4x!vD?^WQL*7NgSP>` zn@roq4$Q&)UjjGhz6jUG6C0)IN=7jinVI%WZ;W{iwDF%Dw6!N}zEB$s2fp4|h;zb` zsObB_E0HtAXs5NAQQW|H><0X#X5&p5*asisU8Z^b%>DFOvbB|i($-#Ppg~zy`-5dH z_bJ=qedm63&gds75!sQ4pjx|zlJXb%yz4YL1TOf-_^g66l8SpT=HQXX0hKY+$D8z~ z3|&cBaV_hjRfq4}bm!X8aQlZKW_T5(V|`l|E&$=R6BmUtX1B}1&VOYeV5lcO|0Vkw z*wVJ*jzgUkgOPGgXfv0=Eqz;@%T-1>J|M|k#{a|mI$PZFsZAr!E)NfimX$SmCXsL2 zVVOEBWZ$ppZ5CKUjIWQf;&nZNO31Tld;F8heqZX!K&uMDd2?UrW0~0}pZ{_eK8Z+o za-v&yT1j32$(ANCSB&tKN+hb`jAFyF~$kY(ElezE5+?(1Ib8A@r;p&p&Q-^ zF35P%nS}7ZQj{=)flHSELtg5GcVkPLk#c3w;`qd^Mt%!JsW?s9a6JG^FzB8A?BeAo z!O7IhR%}i@rs#C*|W^3+0AQH!C_24lcV+nWHr_z+ps^nV{* z40|D=%qU5nv9wckHzp4|H~D_V>JJi;3ZrkY)_aQN`?mVpO;yy!DuR+3dS3Z=vmlAn z^!_UzZoD5cYXNNLL%A*$>@Cf`sfzv48f1N>@|t;<|G@hD+gpNJ96|p7hEkM zrDfHa){;x9t)H8h44JN#k_ZK_5KM1|Vv%p#7pYn7) zFNi-vooGp{e7}daFl-kETd9FjVV3iWKO%k|htuGKW`CrfReGMQ^J--NuHS=(Ud>PO zZ>2BIcc*AcnNE-D=rEuEJh^vC*9a)BliOvi_%;THE*=;CD^p1%L%LbSfkR?bvQu+{ zQm7}SsOUq^(BQG{#|ctJP`TF;?<}91kQUT>136X@z`m&)R5_9dTJ!%pcYqhYRI;@b+sb9z6!fJRRpov7u_-8z zHWXj4WNd=4=cOkoUeL}$Y}y(*U1RfsDK4yKrqkm7iHIP&FNVyw+dlqhB?q5xG_JV8 zECXS2&9&W^tG}o$gTo=QOQ^SNxM`R-=mqMeZjvy$n zbB;|ryC+l|L`tqWj6fST`vwK7e4yS|UL^OCNXU*vf@M^AHwSSy_V(Y6NDY#y06M^n zjE#YE#)@vp_nBF<+)(h7>70qUe0GCb=j@p(L?2vdtU{4WXZ7c$Qx$p@u%wmpz$|8` z#d9xy;4h(Nk09lP#mL~cvTCFg62=4}f_2p%m}TwI4rwY^3z&F8K{^tUp}_684S!KJ zvu@!LU?Lz;ZI}Rr8Uv(iD3LM*z-u=h*&B(=Rq9Qv*?7p>%42{Mu?pmNA5!B7R&i4s zrRBHzK8KaefItt}S(>j`yOi%Q;_{1cOn0NC8a!j1;hVjBIR5 z)n1|`h*pOO?I}!M%l{w)f%<4KG;4DB*DW`#UZ7e-d2o(2 z7ceROkX{WzX}gAig!3tT;lAkua%|snFbGwAqgyOU5Cb%c-Az$g=dE;O^qxH zad^rGPA-h}t&UMUvV(X-{#^$n^FfgGS3L;L(^2YpKtUdGO1o;QnEdOCdL5 z!C*L5+*escc#KWHHxWHkdlOCZXCZjKATR?8?BSusdXx#qXGn9%6zNkD53CQG`U;lV z0Vsy?k|m%Tjh#*k>JEqkG?4wtI85h`3pxG1h2R>C|1<-Fi{1Me8W6DSFXfgD zmyC}25D}5Z7ct^j9|d3dP3DBSBwnwe_O+?Yxpr5onFZ16>E)?p9=l&v$aqo zOd<;8y5TV0f5vr}UR{JMGaHJ^#_){0JrXC9|F>6niTlsK~8-p2)x&5 ztN0S{;ns=;%YxGx=>q@E4$dnV$(Z6J`us#)EqcU={+~)Vu&!Da$=24z|3hp`ldZW? z?^uKv_*Xx`eDy59OHHQTLE*w$-zYCX?-v*T&sV=8L#(OoUtA0w?a++a;4=O-bz=X9iT^tdQP>Vh~4{W1O(2yA(+;)QNCN-5g-PN8_Y&cO-< zWa-*BFoFpGGed(Yg`3O0q`>#l3mG23K9!KL=&}vg;tiMa$dD8v-CZ0$;<;?i8VP@| zV>u?FGtAnLSHYu|ok*zDg0DJL#(9?6A z-K)aatcg=;dsXJ)A8l2Ltzr{RaXt-f`))N))<GM(!wzilw5q>*w#K=5F21_!f$57t zU$a|R!2EtSZ`?sYTz=x>96o9A1X%fV=I#b9+m3MgjY-z3q> zwr1bp#=a%P_XrF7=J0eN{LnC4iL8AXsm%hxLl87UGuo5LYU;-yvVK%=pR$tu+s9{F zkg~(@26%(2>gZtWBYM9I23^s8`|<28x&Bm z%pH1YS6ppx`eP*LQNhZN6zgQ~MY8Gf4{UKD$EIXja!-!(R&;-C^#{N^?OMf}>#m4Z zRnquNOH4evnl8`E29_s_v{Vd>-B+%~2HbtdNqzPKeJ9RMxy)lyQ|jpI?%{_n4p7h= z?0vfJH%V>Zd`}Up3LAewc+QBO8>Oz#3q7l5kMImHMFHA?lTSquGTV91D!pQ*5RZ4uvtGRBRMT(tl-JL+5wNsd z^D;jEFYd668Qtu-?2Ue%>V9~;dN5_Rq65;<5=&pwXY^{~puVhwd9?5CSvzh2rFwei zIp0H4cKL zWT=s7?oirDq#W{h7p+G$p~u+0pUg#<+`FH`$8am<4XE=Cu6kCLgLOQKp#2_disqgd z$^LEIKym9f)WjW{>D5sEdTPpwX%x~-ed_eOX;68Mle16y$=so!(tpzkaOMAWJDdJv z;TU2PcsmPOYGyVWkXZe_t7Gyj=3qkQ#4SEm1uijO8%Zrfofc%M+=Uv+_b z>ElM|irqD1*Gs5c^1~{Lr09v4(k0^PFbiK9z>_O7bwGu;-pu7vr?TC$j4Ccmh*nOd3b>WU@u(gBCB#ln z09!{p;d}WQcnSald6~=UJ(h^S=O{>BDiD2Nb9eH8`g3fu{`>gaG$_Bt)FvnjnZ&ui z-^@i@%|1v?G~Du(^iZraTe(-SF#1?2+mMvM_wJ|s^pRc3!kd&m&5wdUUpsr50$eWb zH^}r1TETz$j3}R{hCt)(mvJp?0h_qiIX$#H@^|0k1&`x_o77BZ6W{Aoev{TIVk9w6 z*$l5ekF;?zN@^{K6RyRaZi}moy)+JB;g|h)CqIGO-d&p@t%huo(GQ&Ld`|cRTw_1s zK0Yu+5}zcJZsbiP{*HivyYu~v1r!68vcsOQDrds7W^{)rx{a_ITv#wvSK2#fEK5Tb z<2@$`9^|-zNxs~~@XkviQ4{zPnQSOHx&$~R*`PHkM`WmQCgorAeaqdBvNF8pyNxmV z*48C9lz%yK8z6nfWz6-I5TqtP(%e z%NmhEI^ndD_QiAk&-iYU(x;;{y%c?6{$}myhj2Qe@7L|<%Eog!hDX%n_aQT&bJZ5q^gm7@BBUX#+}JcMFH37~mG-x0PFyN0Pd&M-v=&_MPP}0w#$Qdv z5e_@@e@JG*!v~mO@4eqE8m(WL%Ub=JK4Bkp?Z1u9v5hGTQatkw{Sk2Hbh$SkrUDnR zSxNNiGNcSMi${%gtkRXoASOU3FM%9J!efjOk3^)ACigQ=6u zbY!$>QK?Z5T3tnRTkW9D{Zg5lKoMnbaP$d$Gy(IVInzjbdOg2O;KMGYBrwP%H=P^# zyXZ+sRYB7GCpQd`t>i4PP~1r6OnezMHiVX$cwVQLF}Zx)@Rn1>OQ?~4bzc0} z?MAc6c&jMX)#jcrg+t7AB>k&0qFPD*E2n1Ssa^FwU$01hM5*H)4o^)?IgDV>Of%Ba&Ry^%?POn z-+)0TGb5|vDxKLpA|JK=D%@)ow2O_Kfaq!{+xaw7q;*hM3e-N}M;N4wm)Zk+U)`d$ zb#(ibzcGrfhmhOEIe^;hB#eKi_q_^-G@R-yNtNu~Sj+~+v}!>i|I@Qrm^Lpmz%RQ+-O|Fi~*q{84a)_yN50LC<@AmV(&I6;qCrM5@ydzC+5#T$c-9AfaYt*zH3Vte=098=?& zgM#u~)w7H4zc0I3)f#xM!G2owO@3dUwit8N{(@p)!$#!ge9MPr>9SauEsyyXvJ9LI zA$Dj2T>ie)O@2(xdaNG)n?;FJ&pYWoshFyYzr!6XQ8>h~2@8#nxYV`9InO3^FR!o~Zd$yU&RDca3RB~nSZS7vBdoLLhW$Q9wgRozhts1o;rbLx8>1h?| zuGU&x7eo-E(=_r`qrJprYl8ay{Xp#mxzSFyzX|~e0jL*E?PxC-jW?-Deh#(0WMRrs zAm6(z0MnEV8txPbgAx>Uf$fttblJ%4Ha8jfN!FtzE+#rFOR=%5sW&FkA2!${7ODEQ zlvB**^R~%IpEu)SaKo?9c~a0v%;AMOzB!EBPQR{Nf9WHUI4D0%ZJ%7`6ppepBT98i_KiVcWJbp9s38x*Q%*N^pevp*U=vMBS>shO}JjyK$(ZVXi~Fw zIXd$;OtXm%{USKNBDu9B4p7i&p;0^??}5sUMvpdHqk@oWe}P9|DQrJ@YPiYZk(=e9 zrbK4xD_ROVU8!VsE@&bqNZw)vt%WXS_W&=sH?kjKQR15+{r6`$pH`OKc(yc*5r0;P z7RoK>y%YN&iL@aJgo9v5n@q*4^i2=l;}&b}0zwTo)x0t5M819eU|+Vj8P{)|*!qKVe}3OaC7EIx${?tH@@`IBO971VV7Y*a1% zSy_K}W%2K5Kbr^+h$rMP>!WYF_arfn0B95m@*uQ@e^V=&bk^w!_i5}VaWu=}4k2UF}rk1|> z_f?h(*-G;SPORFLrhj#2TS^FnmX@;Yt%IRwL9+y5H>;`o?KMQC8ymhG{3lil2Cvh| zkl*1%alBMkSJqO3hH@SsAOAK5R?4q}`X{|+!){bo+t;7aznbG29k$@VTbx2{zTL|X z$^>iA&j7Pn#K^rtkAHc!Ahc^33t1gC0qi`z%I)7>82w?~6&nuXLf-6)^D~g&+2-CG z)c%*&2%daZy`PDNdEdswEK*}pQQyd71J7q_is|U%(>SgAw+_(LJb0p~xuiYp3H0Qx zkjuC@jLso61yJBlO=(ZenL>7y!URpdOr$Xw0G9<9vDo0$VlZY6ZE<}H8^_6k5u$(y zO^ac1v6d&%iyKX!^hoHYX0W^TGorlLn+?gOJ{=Kat4@;wACirXL>A$!G(J(B3R?Vk z)Mp@Me>gT|Fs&cEY?z9Aw#}8~>Y8;>Qi)ta>psg*=w1})ybF%{&B3}EPMQ6=b=jkr%9>dQ%RlllIfc1n^i1nS{r9W}ndf3zRTbcw21tFaNH zM}pHtWx zV4R?|z9lWjJW+O(UOsZn3pMgT!)Wy<+(9U{aPy39hOYwbII%V+v z7}img=id};5@=77;i*n^mKJj(>SvLmM!^#4!O)Q+5fs?iQO2LcEa*`nVgb%U`^s?o z1ldN}+1N!~Q$*_wsDKf^Chf*gl8BScp5iNWZNkT9f$q03>{ zO;7s{2P;%;nSt1p&y26v#_mGpB@u5+otcHD@5DdOm+%PqB{}+Z&`{)APU_=Z5%wwN zBMg=_FL*BJ8`d6#B^f;f%Ql=XO=UVtJw5?j97KC-=?_Ns2;uXLBihM|lts1Ck`JET z^lE}yIInkUWQlgAOhwbJ@Fd}h4w_enzf6?4H}d67rA?n5U8Ly;Z#Ho)D__risn8Q2 zD|F|YJS+z~rFOml5S`bf6H@R6N4T^5e9s!NS%}B*9vc*K}A;~eCj~*O<}5J zDjeIr#@%IMpof7{XiOLvVVM8da93GZqYW}u`hl_9J|NH+2I5!Lh!j1%s&8q$eAr$B z^Ab1L9|a&SWhdWa%#G8$&z*e{j)uBUP#l=%#{d`9N*>%bb!LtkJ*!|HCa%wy@{vEv zY)igx?P;zRase=Iu>-TY7onZ~zMej|T*S0dx1S?m%08{BoS7<2MW1uSD?F?SzCm4O zMlMGhdd%*uyvxe8jnUUt6*fP7rC_Su7K&Zs{^IQQX!5(bk1;Nae=|iJo!qO>16NOp z53n)1)YlYY9&$@;DN{WD+L}&)(b1dZjzq1v3r-!|uiZ=`JY6fU;U*Nd>!UjJBv4u- zfegIzi*YC4VP)ces%}lEU4ohsW_+yqPd)E6T_?e?sfs3E&X_V^Fl>iRG7Dla%}c6}j2nL2a>SuJ}T zpHTc#uc=&M`^5z4Ey_fwn~t>&ef^cb13U^Qwm0O zy3ZkHAS>rTxg%}L?c!(x_hsQ1vTtWCJo4bk-`GjfoHf$nj?3%qf4K~3meEeV*054( z@L>Npke6+Vi}AmL)TzoNi`cL2ED4;(AA}{RqGd(yF||DEDLW`=e;TB2=PRbt|I07m z#Z^UQgU`mb?!p)#MHX)afzPr_`b(MDK9R))c%{`9fbX2d@psxBX{)op@&Z^xLK87C z9(Q*H1do5vy&^84-sX2}yZy^m77slqrGv}ipV(0q>n{)XlrEI5XYIcuj1_3fEEPdD%ux5jPUIWl zlOAR+eep-#q;a^_^pA^p(VFp9`5v(bAE@IJzYWuoG>1#-Peuvr!$t4ybm}9y6GCRS z6$LPc%0I)tT7T-viDg7ogU^OxuM>=VV#y9`;)4-uE90KT`MRe5FK@W=5@SQo;d%|mvCwQNx6mh zQc0vGkSOc?(6W`B1Yy)EShj{K>bM6-2S)_MbU3G1!|&%%Cf!H4^k2k)D(fmaqFpz3 zlhgfWu*@pDcimQdU@BW+(PKP^T_W{=*>|}9j;6fek!`}OEnQH&#NBd*p>mblHPd>D z(W@6*_8Mi9t7(9d^Qe5B0mqccDx==4rMPs#Ci05rt3Wz!?l7Ts@Rd8eONinwoxF_h z31;vxOR;CZ<45G;2O#|5NhRY{X+U^wRP|4U)rC0 zl?mhKDD3KlU$JSd)4jBXiDkLSJ~pXK7ELXoO%htyM<<^tEWFB;^uvMiu*C#UpC-hJRl~8JJs`+1!$R zSDvj6*Ad#;?z!mlHRDJ0v~7G8d)YL&-@oQu)=@?*nYuLhE@t<<>XM$;8jj=hawvE$LJj-9c+JyZ$p6AwAx3ifzs45 zXb;GWbuo+M60{J1)-0kCPg8@L?V+c3SEz@9mxi1t*0O8d{3>;b_sbHVH!JdjRhDh~ zCT1eOm32@+fQBV`<>608tCzClC|h1`?m~S97Jm6k)qWA>X8PUGl7=@5LBf%6QHBG}2`q^Z zrHH*}XTE_OP64U=QGYo;Xr(eL(G~>@Nj;EIZ8|Y)@8bk|c8 zVmd~uxrLpmH>dRy>|alisUX?Hzm_Q_;k+{2QX~G*5rD-0{>~nPY$FQ17Z6K7>~YK; z#N}oBAF5HqPkhc}+zI7>Y0AGP?qpEjcq~l&=q;uv&MeqW3Nk1*ANUO3aABGsY1IEC zCL_kykTd1qVIe;R0{T>X;8NdN9R_zpuOi37+|1Mz;M_CmmYkUzQ_&MMO`!RxsoY!q zy+#}dl*K*2(}vK>Ly?+yuv3R`n#fzh0o5+Ujy^OyV1rDV=B8-Jz&7VAwblCuq2;knFS)C{9J^ zz%8$;IW&21+8g(RmCCP!Nvt~G<3fP`bz{VH_3{6-^_2ltL|wb*h=c;7A`Ko80qK%X z6+~K^LrZse%|Q?Zk&tdArMnxXySux);cy4v_q+G|as4&I#Gbu3Ywxw57`%rIZ1g5Z zJj6Phw+Jr?)}MWC1tqwag^rNC%ky+^0Uy)_HV#}1bOb7u0Yb^cYmD`_^0@{eXl>L!ONioAeYg_(%JfGpC?(m}J_1}24fo4oDlQ6bRh zJzvp?x^hrLUI;{(sZd|J{yd#DAXfQl<8Dq%L~iMWLUf-6${fm9y%OwR{VPO9;TZE& z5|rI#I%n|*4f(rxAOI$XGTYgw{{^|1(vPeq5-Mm7F4oyVY;&Cs0s^h#pW_wt*AxH= zwCWrsqJw^e>~V8@E(MZ*zY15}YoP7#N+SQu1g>ci$odPa2r&g-nmgIUb_2BB=ylHx z%>SO4A6+rhYJq2XvCNjIWvS?Uj}pJ&ji6s+baLd&6F^q>I9E4a>Pg6l`$0LK_AH*L zp;%+rbBc+i9*Vqr2M6eAmJXW*I9+_Ep-MzIJZJts)Oi!Z_W3p(>T-;nOnJ$z`0r!S zi*sg3N*^ygcejxF&bF=aB|W{Kc3?Qnj5jN@^^R>Q<)cX}TWl!ijHZ3{#L&=VCG+1O zR^-?wiAtX=Ja)HuGC)fGEI44jr-WCUKcCvpGl?XIJ4`7fJ6;GllYYXLNTFK4mCWEP$ z>SB^*@!LKsW>P&U<9WqYM(Fivjo;PuaOJAAU&Ubc4wxPGP-}H4_65p3t?JK6Ie~ zW%J)@CAcvom`&q`viuS4F`>RM)Yy(=BmER#ChU7O%;>%S;os&k^?XYB!#j(%UU_U$ z`tpI4Re2iTVK=;ssa$b`EQ+6H`ay=Um4HK+a!+<64q!OaO%WNG93+N@+ZsAVyWc}%?YKNQXD9?ZxO&^L`!Q&PmY zOz9c(0@JubLQd4_%SYk(D*eP|p&4q)Bo@^6LqCIp8I?h>*!^`rb#X$wF=v?d+|W*q zwU#ISJiAE>lE4X+*aP&=sG6G^>R(@^gP1GwcWfX^u$;nVOgGkiW!o+91L~o86Z$|D zBJUrRKS1& z;eYBh{%cr%(pFxKQd1?wC#c2@Vm4GeT0*Q6C|r_ z{Y~dHD``=$v?@-byvG}^g}+m#d$)izP$QAugEC8p23ZOAiw#uLG~`G}HS2Zx1Ifrn z$Xi6d-f$nEdaP`Y64`6dNC-eeglZ+0I77>-19z6!hR>QukZ(=)%KYhcnn(S!U-^h! z)r=`O-s^F_K79(a*Bs?`U)g|@7}PwkWlA;c;m9Lwa@V&`bn@It>nzQSkJeSLP>hv} zqhhU|$}>@aq3$;P-Am6fFJe!!G6Lj8P}>|ANr4DAawtI#l;Z{fLmc0tsJ9KfT?=O< zvff5nEUboCYZf)tPEcp1E0+y?DZ(>uehq0vS(E08T*RYn8w-I`$K+ZWeN-Nf{3;U78Il=keQqf`Exc{%`Izgn^WobQ~l zvwqPBX3PvH9_H^Mdk3kbls{x&b`u{Ca^CB3@pGhJ))iUkn%BE?hn<)D&*fH+J{t4P zdGns6uMa}-lxCrXNr}%{LtsE!|>;sa`oF~rkfNE;zjt3$dH;VL#6Q4 zV=Ir_nZJd`W+oO+)SN$?_klR|lvizgAidI&7>}ZTHo|`uO6=t8;y(+O-56kV>Bzul z!hdQ_->ZxDx(UV&BH&~4)eJBT>Y>ssVQQoiOCu{#TEjK}P$i7NL;Dq8EzE9-(qsfZ zSResQo`l6{#}4Sw%wI|DaiYoa$$JxK)E*OL$fVEb=k!^y#K1?KIygQ2c85M-^qUns z2LF(|(JMR)@zIa_!;Vrvep>3D^2}xYe5)RqXap$M)$o0O-%|a$!AXt1k)w0I1X$O9 z`Nw1YBchCvrSX7mZF5C|=NN|MI-bRjX(-Rn#rhokr~45Rxi2Bw5m6u8#p@L#egVrl zieTIy?-tH5h;*vM(Dy2CcGf2Vz?DCYM~VcXhUKiDkR{dPpb_f&-cY!Z*DTjpmpfY7 zR$c79!g(#$1mTm%oovG$V(MQxJdxRdvecvBgUv!cHgj%@z!|7>F$+tq5;eP_&Rz*C zwZpc)7@C{DqhS|DZtQN4aIrLouwQJh%<_G7{jL&nyBt40RE;>}G(h zCzGxb8@>mEgkIbsD&~&rdqR2dNp)?Rc>2$E*@)#p4%Ur$!Nw<3vu1vXRWxVvDqiBB zK|44oSOS>8I^&6S7&~cFZ)$!tLQpyMlby-(Wz0+ZR&>SLIU3gKKP)ITXU%BdNn!&m*|&F#IuFqZ9mlA{u1oIf)vxz>br4^lnbK8= zUCcgzej!qs(zj8@*0@J3U(`1OSysmVy}jmKbJ?3LO_wLiZYWqvpU1uaLLC~_cbMSN z=|;eyTKM*o|Jtc(HWungb7wv8alUI1gNlO1R~!7s>_s7R^7ZxB9$$1kTp0~87EE=b zr5Lr?jvS92(GRdffVU?&xTMTbC0;O{0<}xg_|s}@reVCiDk8nggS4(im#x(^g3vDr z%0$VaFU-ebabFN$G6iF5X)cYa@%AL<`n6w5kA+7-KZ?dlbrJ4{P_swT+ER;^Wny#^ zl51mh`-62@lB0bmcINWSEC8n0RifS?Rr*N!bqYy5TnuGb36%_@^} z2?FXHAJHk6lPHxhb2}L=)i%-HxZ-t0{BRM|EjC(8h5c^+gXYX%g8;zk*>&wQwU zp+AEX7#r%3>_#UZNX?YLDPNV-GUrI;ns_m7y=94w3}JO|Aw{N~0?=PPByG>wxGrz9 z(S5_Vgs8W_ASnD|=GE40`_qs#?&L0a0y&gv-oZ;zVNkW%Vd0uF2CiLW$rpf)Q;tld z!3^%mpqo%nMeB_c zd{$3vRUVbJg35&wk#B0l?U5=KA)->FgAAK_j$y2_%S;z%f052A6U4EQp;l_Z>W((9R(ASgFN3NmiaQ!CVsgm;(Q-* zWcGpjM)r2<=Qs~vxK}^xK^EM6vSluyD77Dt3Wd6w^<1*WQ7&dZeq#XzDW-)xFI-HH zHOwP)>!k{SwjKx#nN+?6>>&ykO>Sg8+-*8k%5r2*c~4w0axan=h7x!$DEFvJ7m^TA zgpPK4Uj+vY=Qrn1MQ9gEo9@?fL346Hy`1RSkP+lQXLWWie~o1pq}THeO>u5z53lDdS1Vhwndnag;aq zgVxZvErq%>MrNk`86}h4m_GRncjabA-x*K~pVx79iV0?q-O^t6NLi?BcFzcO&dq(a z3A(Nhti*0+HrXpBqDR=7s7M!;y3m$S8CKv>JfWnFS}W8hT<}_fsSk@CsOO!<0T7Ju z<-j`58q>qtwabV5)zWiONX@p(yFrPSyOAePPZ?CQc5Z%u_!hF3ohVw#zG`fiUizj& z!zkNYIyunu@!8pdav?;1lKdmfZ5x>XK(!?|W51_as0ff*D4K|do=s8dK;FCqMefIn_>4SBbRC1? znN^1kC!~#rQ(Aw!BHMLyVpRW3PCyXvpJryr@`O>@j&R*cUdDW|u=$n4D3>;7RnDo> z%86_79?~o}bE#=$lc%|rbT4T?7kaMAQ`0f^d@sNPH9342gta`*BRMA|)ibx6uOwuC(7{s)?F_RxI(}-MVIK z@H8k9L|Civ;V!9x9=ktj@ZrzOsr)ifaz5Q@Vu5SY995)Dvlow%0d8^oVx%|GbR)WB z+aI#LV_QXJOjVYamQR@0m*;5%veShQMtKv4jN0lGH6V`tje;#;)li>I(qJx_y5AtN zeNcoPnK|{Nsu$yWd1~a6S<^nOe=7dPbjMuXgSU`$$uL!VDmL{JB0VMgXQM}z6K0TD zii~L+i^0nL7RG0?liKfx%R|c5JQSP!`RK~G&ZH^bBTylQe&^x6Y4&Nr#fO#RgHUJw z#D$o+Pk)}IuGt{Y(I1;^U2=eKUutoM4U;(+4Wd=2jDdevY+rdWJPP$U_j6Ac^&3g}6m~QFh=TP0`e> zk4CSO!Lcg!p_VpY9vT4{ANAtVPnp>1OfdvllnL3{LLfm|F)*W_#V!eLMqxzP$G8;M zLU_xc3O9@?Bl5bh+0jqxPUF706t!|PVtponG=91-7@e=#8-8oORa}C5AU2iP35f&R z%?W?xRa*_jLLfXNLD>tkox60u)sL^Oc3u*dq7k9gRQo;5gMwRW(b12rR2J6$Cz9Ca z+FG4Vbn&vW<|$1Mk`ExSM?P2gApdBgm~{s~R`aGEwXiToL3v8o*25UlW@X_M@=VjL zWs|jNa&ZI|^5&7+ru>HOiFKvPIkNrOVdAC1~k7X$6R zSnGd<#+#~a3skiRuw4p7d+S@AL()`$ts4h~Tv4$v{so2pP%P^^%p#q{ z)dzYI$U>-pco3$VH>$T04tZL+1HPdk$g;(RT@sRPO(~^?IfA_h`5aI>gt{|ttO}#o zYPqfQ&VQ_i4oQA7xw7xwr^%L5V@7V*WTSfd81nfc@wktDE6Tfg`DMLy2qc+wqsIE3 z!2pyPbYgr1bVWa^nXi-bI36$%q9l;|T%l#FWqRjbAYh+GvGH|W%WaoIC6j0S`Mw(z zlFaRHeRF}n)LXyY-hkY=;A&Xd2M$lUYRcB3?)EnqWxmOhK`FMU8m_6DWcj@AP6sW6n&1SU}}xNEe~AZA_1X!r<* z1Kjr0&^}FM0#=?neRE&N1uLy8PBWVzP>74&rT6^HyQ|;m4cAwv=moc&nb~3;U^#TP zV%BlGriZ`^_YXzXqkIED&HQ?@wH?JM0b`E7(7JK2n)}NyaWB^{DncbISnc(KfsyI& z@mgflcFh+A1aY(Yp>f~yuSST|7Fk1JzssUbi_u>V+!*UkgQy~G*dOUxpqu);3-dUV z%a3osVrdqT%qVcT)*z8wv^skxSl@H0HtnI6ZFsr+!JX+#-&{9)ADy6A{9Wi-6fY~Q zf*dGvfE+Cq&vebyPe&7h-SY5@M!WX#_-Q^>RBcAnwr|#X0TJ)HYQ)jSc@GnCDBxz7 z)dXS3>kh7*jwMRAu1o?vLavUzlf)gtAyZM^HRYj{7`|wr2m`8q>|` zUiW3WhtG{hkC6L@11O*%w{nEtA>vQ34ukvdT<2xkPm5>Gfqp8OfODt!j7L4N(S-g@ zOz>iXN(P%{^kg=(-a5aRaKUGUhpCd^!F_CQ=2=ijg;dkSvh1r+PV7Uryj3lqBhXJ2 z7o63{stEz{G{hM=n%$)Fac(0d_ zaF}XVjC_NE*}N;ff(n!KXGZXun637`?&_9_5l9u>^R^`EHc&PKxyN7|=SYeMuAMF= zvUNGTZfDH{S|1AX@zs@g89Y9p?1T?q6i z)yiAb(bxplWM8}4&Fq%%#IB`pk-0uZ!+^X2b=d&vetlvh8YStj_cF+Vx~aL-y5nW< z2-ceK&0VkQhKHRHvwpoEq+01Ifa4ud%q7s&_(xTE6=)`zK-X1g;5eqsFWX_ic6x0p z{ED#;h*{l_m_V5l#GAS5&(xeluUD_8|ZN1gJprJCXFv>}&`e*#* z0x-Vytaj@x`RZ)D+W^*MW_hz#t%%7zzSIG)@HnXZqm7g*=9-?($K#Ow`6vbL;@Q8O zH|-T@8!4andc*2uY_ShGA1BCV6RE|6;}>JPb>Tz{t46E}*O%~~ zFMUQ9i;@_Zyxow?@Ca=%#(8%);GuEvl%rqHwp<5Nl4s!vCXPPnE2{LXuUDRa#nE`G z+a43ef1!{p?O1 zZl`sUGt*&x#Z1bThEd0}@p;%?qQ_YOH_DuHkYx{9K{b=u!yVSC7eq3$H(E7ZCKlLT zFRz+IJ?1FT6pWthL|3<_!GI)xu64WN6Rf`mJzVFh;9P$Wl{dJI67Q;6iqQL~&K;%@ z(IqChdiBeaY_dE^r)`0Vue3XE_MY6frdZWM1Wn~ACmx^ z^#W$U`+%}GHJg>?;Qn;QEh4xhrrySeu2VF5ydGj7FuA@zo`E}T`I8ew7-$yWygIMeEadtap z!tH(|&eLA>Z3XIJ&l;Wi3N;ev=86K%$kAP=HP>bKWpJ5vIxNv9G%Q_F++Z53sUq6#Ny7zH35u;c=4}AW<#2zNDEm91J`P!(%a4OMOJ2`W30`t_ve>H0WL3-@&}1A$;=(5-Ugj zQz!5)l4n2s6zflHvIX_ua4||kG}X263TVm$V^EYA4(j*FGx=S?%1S(4r1nJZQLBLu$V448_&0xj%2V&gbzo3fAdmt z=S}c~+nU^`m_E>IqeZq|hu~4U;{x^N-DO7ABE(&dqh6T4_V8NWHv#zleI|$(>_feY z${Az!$RA~{qwU&;|9F`SLfWUr?-`$>Z6s25vEQU`qOT%PfN~y2qS)3*fv)-EGjg(E z`u4TLs8k90;$u(IN!5W8)Z5jIuRo#LkIF2rPBvfFMKU~t8$>BemIkiM@f)ijrqn(< zIV^5w0`D68*Tf*f`MC55ZaU3R^~3FN#w)^wTITSUqKTp5F6z!cf9*E_{l?^1q^*0? z5JZ&NGER^IsG+5{9c0Uj{PS)u#a7LuTyE|mC`DGQd0YEH^J5c4^SJ&9=d||*CR=Jc zy@s?tN=u0sq^&etbwdx(MHKzaj1VZIiO`#z-t$ykR#-j3ol@^EuTuE;j4nv#kCnl) zY-eRS6`qjBNAPC6NkUv*?PM3L{Zrn!4@7 zUF}m84Jt^uGm3@{*Yd<><~~w`r+I#^PGZ(mk@ZNNLWb}pY8ewBtx{x3+*J8clRAc5 zGtyU$$+9GfjVHnd1oAI6#(ouI+Nkni zFQANe0o<+sQ|HX@S1t#U=oQUpGv7tk%^bpX&#mrm)~2m)FF#_cyME+p<$D9eD!3pyst%;*Or^)-*os3*_9IS715l( zvajJ+6jFR{fcv%wAiSs6Fo9UM!D>Df<*h0fdp-V{YeGtVeEPgN@B)pShBb#(`uMdV zvrCxmRkchTfkf0dD6(J0IJX;2I*5R-TBF1|4Rw-f?kWpJahbxA@K+Pwn~xqbevevH^MdvHmpYE+lT~ zIN(V1v1m*`SDs*V&p}80$g^Fsh;WiM@%wntfo=Urk~S_-m#55PoYNyD^$*paEJu$* zxJ)u|-p#hJh3PMRzWM}ZrIHiX)pk@U8v0Uz>hp`!Q-Qht3}ck1VvK0-d|GG!aQgg2 zyZBnoahBm4;?tYS&gI3RQ2(@`K_y()7Hi)N=2_c!`c3@b>sCRFr@n%oRI)W4c>%^8 z9OrURzWNfS@W*#u8+_AB_Ook(_(#bt-~p_b2)f-^R8}?MGxBQWxc7#$${Qc8W4cls z37F&z6D^R`p6|z+I;Xs-d%3La`+&sVQ!llOERUN|w81;GT$vGOS&ahdZ z*yUUBynAx=S=-CTHTz3qitR&uFzPW6sLuL8UE|Q-a5P@t@fR(EQA&4mbC@1r#5zD7 zJzPPXxG>1@KFHysGMYQ_P9eQzX=Ppgfg_p|cdoqlIa&1C{SMval@~xL>o9DU(O3Dq-8y^cO=@EziJ?^87Jf^X?L!GB zv+*Dkbw@QZaVE3&(T3RS4MV``fmOBIs-b3hdgDvRjjgzuM>}wSi>c9yZDvU=R3B(p zwDXFeQSX^JHVbD7rQ^K#s$c4or-lN`O^Km}Jj%^D!yPVX)-p28mrqdUJ6RqMW)K}L z#|od9oty8!ZEg$b$h*BL@;)gK*USo05^<%*wH;&yW(2B4us@{^L8 z1{FD(xXJG`5FY>jXqv%jY3zgDXgKZ#BXT`SX>Y)x|jTZWdy*7J7iBT0s->0E!PCh!H)N>OwrzCKHxjjQqXJChDm3dN(5bHqP5COPI`9HajPySHiX{!&N?f4O@LoZ2#eUfitVwjZrZP@J@T_OfmyN$4!Dgyq zu9!!R$TN0(pl!BD)B`lS4DaD2glHT1>?r2fpXG|JUPjJ6vegTM_Fb{HL-g(v&)S&* zv%rK4TCUnK8eM4`SjI!fJ7;!jxC(@e9)ulO*k0+b-= zjIWHMGe$V&P}p?z5WWij!>9L#Y-XgkTk-8 z5T_CFkl;zkvMkfCxU{y!N${3j;R(><*!X(p{`?uM zrc78Vu=i#Jr~hS5aYEQ(7u>6(qFu@S-!hD(^fcl|BFnxi>QmU zs5~6Mqr;3pPqig*<2gD^Q&liOGg&QdR%;Gyh-3WD`@_GoyBp8+;r$NvF9h4;umab% zg>hwu><7jm&1m5WS;i0?0eXt!8qDzhR4VLf^*tdoBrD6wgc0fQ3`nAjr$p#uh<^j`7Wp-CG?FgWH+nO^MGs0@4f$2AQW zVLayg17zk>V#Rq7smq;kh9}2%2@Q=QnMg45wnHyWN{G?|VL1^!o8)vcvEKgVhntsC zAM2|=_h8#s1?h+0_j_P}sHG9W(b$=b*K?#Yzef++vbAfHvMLttU|F||rs?LiX1$gp z2*Y&RoiZWSE30KV1E7L2E;U6)eSN>3Y`EC(w7>J4Uh@p~eaNx3A~(`*uJgMsoKM-Ls5`;EP#Aq1h zKwoo{r2wBU{o;$M-H;d$mV{UXlek%g$GAtGxTgpgtOB2LKCqI@#6Eg3s6zGy;rdvg zBmb}!a!j?s+)faG0^M7x5Y%WjYT200edB?MZ}rXo6pd*1r1zi3OhhDzb_6?}Zm zn_L4P{JUka=?!*LDqt?i2gffv)?gbsDh_-Q(-|;1*6?cm2>kIR$b1 zOPdjD*JG6tN~F`(E5+RX#yW=+<%$kd+Yf5`aFy}Swb#lj9FVeqMDX9>VnwaL(YO2I z=Pgn)G7Uc_jBw%q+QjAW2lo4SVNZFo#tfC1wPUr+YU@_V!C#y=5DAbTE5s;umrGtj z7@5u3Hl4cj6Mu9PRolTqceLS20?XN|<1GvmYnlUH+kBh0-(`&n>mhbl6N7dRu$DXE zLvbG%Cm&7ey_f!P2&q=(7Ku7}P)BQ!K4R}65N>WMov{2q=g$nerNPP$1_i z>r)5GE8CM<1e}MtiXo^BD#4WFha)fcNdypzk7(5VXAT#VOY?=%I;ZxF730CycQt$? zk{8X8(}%mPzp3wsEDg;V*!Vf$nVE6II>!;Zsgz{7^K*aj`5;STC`tPCW!yW4rJ1ZY zT2g$uiZo`UoXxDXoG-i2(Tr7b+K!4HEfya$bCycwJuH?u8F;MxGz^{L7`) zP#jn+0O~U~4NhltOR3bo%BkLv&4m8tepPYwFI^nR#Z@+kJo%<8|?)2&tU;B2!`S64tugzYweYb}_|j70EZeSTWn?h~8bK&l-ggg-1- zXC9p|QS?_%N#yw|`6n2dbUb4=bDcm1h{0v@HH)z1zy7gA3_DG7wOwo_RLRwl^1s(0 zHXwN`1zVNAw;^-c(?57HD`wIN@p|-c$H65$m|ra8nkXlU_0CbbDK)%>fkc4o-+MvRyRM!qHYm*-;X!l$zP~}`)*hVH^`s0_CVU~ zf9ep?M9DuHrK1cBG^u5x)_?bArJXIw>98_M?g13fjg|Kv5R$V{+)p4W>;by0@)*PL z>RE+wc!+gpY|x+nKWX?3M4H`Z+Fnql<#p=B;WR_a%I#;<@VCa%4&iQI z0BU_M)fWO|_S=9pZqP_149Rq|K-I2yj8!j--$+*nOPKT!-$Y$Xi1ByDr>l)u{;Nu)Q!;u*F zYJ30limD{ZV|k_eoq&C!%W!7SIjt&<6`gS$aqHI+(=Y?#HKJAJsnx03~Da+w~hVD~Sfp^7B4^!HL)^H;@xP z>Z0vtZV=|VJ>{mnW@%i-ckEez8OHYoF=-NEsmRj_G%J42&a3?E60-gV=fQ1VZsB7v zPtjY#=}MghxX1(?fz&gk)~d0q+cL^A8+xy4!}?%LyI@TBoaKa>eyaEJo{~%f$K)vi zmCI~!lEs+CZO)PXo^QXbQ`($h=1v8-(!bcxCj7a&5hCzQ(K9;c)M&|0lqX{}53C$B z16`Rno11aLq_;bNg98>$v?qMe@hAZY>nX5W1B=~pm36V|l@sL|`c*QjgFp{&$ef$Y zbl0`Xz8|Uo)UJX{6P1x%*ZUc_G%xbrM_3^Ial7Qk`rM;QW;*-tE)U&;&GCcj0qx71 zWsUm6w~cN%X70b^W$Nmf&qKU{$97|NG!e`r<(GE-n1Tv|U}D$sSs)O;!ONI(8D89Y z6MjF!5EKSGu!^EO9I+IA<_}y#+Q8*qwu(12=Z7a3mWH z4WsJ?VKSf0r@&9*4#={?GXwmTY=RnXp0Ze?g=clYt2i1dan@}WIT~rGT+fckg8#Uu z+U4Grx!Q@M_d+KQjt(c!KO++e7Eo_k^+a;SlKtg_@PQKM96%N zw1i8z?dH5BCe^}2{_+H}KBuZ7x7Mob*V?(>QB8+8MxD9;XyQ^gE?kzepWr?OU(Z$X zZ@hR2wY}uK{)&8r=5KN&Ghq+Rd}34He5+FstC@PXiHA6R$b|4 zo48BJ>3#%E7DH-J{SlZieLDpU!My125Idem9s@#65uRIn1{--2TgGUpU>+%7hwM?X>W;!H;5Fg7Dzar+S%&VcsW6WI zhjt}DVK1sy64`k_^46Pte;!1#*37%C4@I;p_do{2Ns)Peb zP4d{kZdKhL88e-A>sCp0fI_gn3Bo^&jq~rtEsTFha8+;a%0mb#+P0s#GJS&Pd^i7a zhB&Otju8k1=&owkLCv=9&6iuS!v2I8`<<``QpQCEQU?|RV-ANY;S~?HGnLZ?6@v_z z#T&5;rRDJ1qIB`vVWr~jOxV_WrLw{E{5=}Mx7Uz{cYDuPlVs^>hD%~`=z#zm6!!v6 zgTy^{A>}<4SxZ|x8!#NnTBD0l6_QrDYgb(ZN#JMk=I=D5s^Tuj_0XkuHmqVC_Xm3z zmNN7*FDIJOM60;)yJyatun!PNL~dMn3ZgvXqj|AVBsul-#A1%dwwSNDT@E|*0Nr^G z!1;(|x#Y{s#egZi)$m_%hPCJo>>INwCfG6wOn}-MQFp6h66_zfYG8qwfwJOj_#OZS zbv?JTrUc&6f2kV(p?=VF0>5&6nfJ|lT{bs=V?3}{`KEv8%V}pziC)o#&`3VtvHIdgZ6wWVt7@?nz~ZM!;cQa2V?xxzX;TY@8G}3)0(|q8&eW4(Itv6bj@G6LpqV z=hyy-exr0`rH}=T9(d8MCy?pR8piQaeP6zGuJXF!v&_u-MVf!oOE@Dk=Cux$3n$+O6qy7`}j?4gi(<3if*{P(^Vk$!|_B96Vo8a?QH&{J@JObWi!oWPe zEYd_*sV0(HH5G8)rCn_gb477?yhAq7q3>PE$+^+uZ0v7I;{K-x@^=et?r^$Hz6fC^ zy4c^%t;=M7)I6t8aXkCRn{n8Z38M}^T%0_=j9;#C#@k)-?-#n=nOLWhNyHz0`vdRy zeJXFkeHeg}MAs#x_V>DhKI!JLlP2lXE5W9W^Cd9sybylWvaiP;!`I++bnn?n~h5^*>0G7dmJ?w?FCjYo5PkH?soa+c!2EB;;n3p1)=EW3uM3 zZKX(_xM+~cJMT>_w(qOct96{yX0Em6^YyNa%hn#>GP7-mB??aVVIPF8+g^gJDEO%_ zU^do9=m(#}XA)A+_t(k&ajJ|5c11R0tgGyTaRyXQ3&AeC2Wh-DR{irOdulESl7*&Q zEM++ZLsy!4P|X7p3=I6uPyz)Uxs~|bF6tU?PH#~*=NjGA9K<+ZP7ZhQQ*->C;&y|J zU2ln~OKON^qMe+HCA*bWWt-#n89rFOWw_gR}Hi%Og?$XoDA;tSs{oe?~jF~ieQJM4`4*HJSGFLcvL7X@COO~EI5KC zBCF#o2OfhTa{XWbfcxV*zqLBIFpA$L>>JG>X9CX+mMBm|{n}m#3;iMFLd?i%AV2EE z`CKyQL&#@NdqL9D)lKJ0o{d)^3k#DX2QoI&^AYbUWC6D`8H97Oz$1d+?2WPd1ELQg zZwSDKBZ^V)DGloXpF`k(e%$&Of-ZLJP{#nC1W5`Z)UiKCk);mn-)S(@TGX)Ua5$fH z+fRU#td%tEN92QczF^CI1|jSG5n74+$WUELyY&Q|n=i^Q&s1ubf^U`+C9DYR#N3f| z_v{j3EVN2qH?JWhzhmj~!wSZ^+X9=0D-&9jTwt3&+6M%-ABb5Yypx`dowVP|9z|`N zf?vk+8W%|FVQriY&bYw?n~(9l4%&y;7p}AaaXzUQH0Lnoyy^I0Z9rKZwmJJJ*Q%6Gk-Uuz8hciujNy+YIs;z6e_(aw=KLa`E=#wkCzn4J*C_ zt!ve8N|pl#TfE#kT zqSd_~_CR^G=$9O!JZfS`3)M(;HZ<;q&K2Y#<~_S8d5~nmc(n7$TtjlhAOyBR!rO|> zOj>59cR-8QAh#(+&Ze4~7Go6xhJ683#P?6I#!788X>rp{jm8ovDpTr#|IW+Hlit~< zMz-svnzjk{Y9(zJ5G|DWPofXu(^5`DKtLKIyg-O$-Qi{Lu(zP$pwRcGaAViZz-n)# z99eM28`gk?f*rTPK}hp{+zP2M1yv73yTG{98@f1LuDOhR(hIo+tRKO4xG})dJR#OU ze}Dsz+ZuNpGDgViJ6%$784)E%&vAifs*nxFXa-*v#}e0)wm05T!8kocLqD7FpyNxN z`%CeqqFPL!p;h$gAcB9e1{=NQG$2|C%i_9kVL>A|#?YU-XJ)T*rATyg%HcEPB>j)U zl?Ecnx@H5g3*8f?-uul#wqfFP96k*u&nuq+;;WZp{Mh=a$cq-m z-FDTK)lrHnXskS`NobGftZScbu3M}1d#B#@IUsaT2YL9d53;_FW%HWL|7XkavF^*P zPOTa8nA!^JbD0ntG)XM$JS1*OyIkTu2jlDe`G<*79KEYL+5Xi`by?pyex2(FIahLy zgS=P%d%n!#Ult6ugKDAdv6CI7c$P(3j#9tt8E^fJ|G@tS_9G?{U6uTZwb6_I<3@RpnVDHmr;DCf7)X~)|6oG2@QL?hg~43& zsJ%`f31&PgxL}ik&N`1wq+HZe0TjD#LFyqu_@z7qvY0texbXK(4Jkh^IDcTMc$FOb zw%%N`-T5rvw5hrbQ`Bxu2XPx^v0=O$2VysvLdbDY*QAZIuPXL7+B;8mS`>HM{ zV8~^*)M7UFs|O7jvO4A==uZlT+OVn7xTD*)X!DXji4o0>WZ)2suZwk-2oRk2)uP|kWOIgTM6G-pH{iV5w-Lb zWL>U_LHBJVr<&*|G7Aa^#;^5h)!vQ;n_ZlZq4t*tgb7Iw*0F?SIrZYZUqM?bvrPfC zN_z+0#i7+*%-2>!Y1k|>aUWS!$$E7V$0pcTpN*8Z)&`yN;9$P5PixnI#yi^Qfj*$bLEhIjs27vX~S=%8^2kmv|d+^X0Q@3}Out~m_uUFC97 zat-V$ox+o5oJ_bh`ATY7x1$&Hx|Qt@+bq{~c3-5~E>cTGji);)6?d&=bFvxf71h6j z2p4S#pr9E`he>-gSiQkRVPL@I`box;@(l+C1tJk$H^d?3{Td66+nOv%qy!6(A0iPq zK&0bjG$7iXMabfAt$p1BuHCVQ%L@KqR~J8nK|GmZVw$XUb@ge`WAHyx8}8h1@wwg3 zTHL&uK+7}u;A9NeBe!!-bWK8#G$lgV+;@j#4){zzH)o2w-v@|`%82B@*ZKN?0PI0^ Aj{pDw diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step2.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step2.png index f81b8b1104d7d32681e0a6f5f3a0783fe2ff6127..a3fae2f6a7615ff8d7d64ae41b137882a8f3cac1 100644 GIT binary patch literal 35992 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 WFWB(;^wb?7^E_SsT-G@yGywq5N2<>N literal 35819 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 j@LxqepS10%zr?y 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 A{{R30 delta 36176 zcmZ6ybwE_z);N4-$f2d1krbp`I;BGpq@+_qx?zSEk&y0?Zjh1^5Ts)W0SN)=lorWv z@VU=@@Au;`&Yrz`?Y-)p%PMetB{)w1#o3?V$iK7S*XQTwXJ==pr>7?;Cx_=pd#4A- z$HzxUM~8eBYs*w*Fr z*3A0)`sDh|`$hrKulIYDpkE0XAQqD0ZwDh2BmHB$V`F2ZqoX4uBi)0W39=w{^v1r~ zyn%v*6cF3ZHGuZ1wY9a?)zy`i zl@%2gWsU3Q<>h(RKg-I>q8s0RDCsCEDJd>4E-Wl8C@9F!&ri%9PapvcqPtg3yEbGd zsDr6Mz6r0utZe@N{=UAxUS3|V5#OD{mYl*C9D?Uey=R;}V%*%^TwGk7ot;gcJ~%l! zCA5GAv6ZYRrA@{Kbw{~06RyCVuwhf;VE{<*R+5u`?wz^c4v8byX{pH)PkD^>F@)WW zfty55%J@=!Xoil2y_;)VK37_>eG+PqvMBPx^5SiIHz8zvw(FEBuJAz@0V=9oXpss= z(mro)3Fd?dp(1AgXEx{~4us&Qq>8n!u2YiEbF1ts-yF==GTxKtpOe;n(EP{Z(}ELf zQO*)NQP5!qJGcY(%N{rY0A$B8DZOlq0RccK5pB9AVsMun02CePVwMHQ%3k*EVj`bh zo~jVOK?mTc1;zYg-Mi$&wrC7c0AS2QH@f6fNC(hS0jT&kml8KB7?ARvD3PqT;1j@J z%6#HR`ILQIZ{nGcVbi>d#~E6nB~DJ{;Co$h zv!`^ExSz!HAFz6xG3`sRwhPF_dzT(}aqGjP-?>VOaZBAJWNdbtL?siJ-FwHqL ze?33G?%}ofeNyd*^>ns)_0VhBjG8qe=V8nB?e8yZ;*`d=zps|=9%B+HKHR|>+l1AY zbGVrrR?C)bUz~5H4eOeAkHj~1eP2F+S-sw+6kL*Rj3S15+Hes-0mcj-Ei;a4i;|U8 zZ0ETMx}ToEBIp8z|DX&n&LtewfWQys8)u1WnQBGv!3;R;qpyVdB|Bmo{E{c+wIH z1kkWVq%p;k2=#oq%6(C79Au0u4VQY$qe;2qfhoo7z08xAQZt+VLZY4^wC_%4d-l4t z_^^ydUc0|h>}0HqB)PaW;tSfuI+p0%j%o+??031X1{a#$ybdx&y|9?WgDK7uX3*(i zU*}IJRNwFrEi<;zXR-y_GIYWa>b)_o-#$N8>&S=JUql?!$m71eIFd?_Q~E|0B*|Cw z+Lo^%z*S}!0m|Sa?86%-fB3cPnEdeBnLNRvJeO|1Gks@gwm97lRS>^tDUfmH&lPYQ zJSG&i=C^l;-NCYv!DoXPm`17wr`ywno%6EtM&o!12U@0j;{q=42i8(H$A%dvx=VAH z#;CVEEQ7hj=I~hpX++$iyo?l3!=DB2D6EmVZgdGI+{-5qwpX5W6PV(u&T+Qqu43?7 z609+-quhR_p(~DCx(zljq`8oly`GEVxQct1xEE(wEeu*%q!uczJqHVdGx^nE9t+tq z^{Xx#;}-mRJtlK8ZKDv?^aekTvYS}+L#*k&Z<~H;fq2CIMl)SCshnOPI%yf^870`z z?az10^SI)Cv4{^I``T%Vb|*nyc?GdM0+iH-4kI=$8p5DrOhURQDMP4=8#B>XiTiu# z(j{xobBbOHpZ|FH*k}y!xfZR!7OH)OETn-qG(VqMOUlwgJ#zWb1mDzl?O{%wTb*~O znS8>JtIEfFS182YMKH#5MR5s~qG&4z6&zirW&tj)O{@8_o;BH0^fks8dSWJD;$^O# zj(=@`b#1lTXDu_7JLxF_`?H6sNtb@YW5H$X8Z~ZSNq&7N=rhJL&$ zO~xp%NCS%`Lv9!wu;WhAVIthiP&=96;&~6vQ-%E|$E#!xLuKVghwq;QuG9-}s01Jm zIohJN(gUcew>amIpS1!?uT6Kz51G>IJ#fn3sM{p7fCpy+Ym6l)48A%p(A1r8bw-r` zQK7NQYIwsb)f`6Uq64urnYkIl`=kBduY*qUnPqd@u7*x75z6!fI+(J9t#;~s$!()! zBtMSFaw6VJCA)1xfrP5Q)5fJXNvaI`HHJW{F`TYMZ5eQ^#DbaWexbeYS187e$7@Tu zv=Vj$i}#O@G+BsTIjfBVV~t<4N z?5;n9;dd+j)ZgZrv_x+sgVLPB&Z2n<0IME1(&lwOCOe~YK;0TLy>nlqHS#ll#loL+ z{h%4+#nbVFfsyq>sMNA?zxD!Yw5pGxeajlldG?UD?Qatdi&dduN9AOs+>8Xz7f5k) z+8m=JU>9l>QQSnPFC7|aenY1G$LjRCUGZs$fDDa5CC>5d{C@w@=kUSjoA_Vk4}T}{ z#9^%c5frr*T6X%B#_x=OQF`}bH&!6z#KCWpSrIJ~$MJ3aynYev6`^pL??f9(W@7m= zcnUUt_ChA3tBZIG!$EPQx;{=p;H`1`^%rdoaTtmBEzcarC#uH|q-p!d{<0=feZS+< zhE6}jT%%GTnt2D7AI4$)mN^Gk0iro}l)qy!L0BA#(y`*LqF8rjKZ2h&x8VUlzi9A^ zUL8m};-%V&W+N1K5;_r?mt1c_SBkQPMUyUk*itlcY*7!idPXe*!rEWEX;XhKdvl?1Oe;#6 zkc&g1hw(Mlw^v!~%db(X2+yo_SQ*Ivg2~XsCHS|Q>~+!0_quS9AZBov@%*@YiOP*$ zkJxWv)_&E7*1StKOVVZjGw_eARQxO>#Qe`%vh3qhD#5*r>k}HPxr7I}RIpg(>+WS+ znax>PK?8Nk5z50mkzG31F_T4DhS;u$r`r_%(T4%Lj|Xijo^cBfqcJpeYD~$mgrht$ zCk|Q`>23`#q9_k8A_N^X8vObc>gJkHr~oKfa(5`s10wr?B?7%}+e?5W zv4w@3zZujvQfkro0L3#m;Rh}yMI~eD>z^_iGH%UTqBM`Ku^mx&wL1;OeOVG7;8DVU zWp`dd`ysjA=-kpuAckJ)ITbDSpTY4DMWQ%BjM2;Kl6YW%RbC7NeQ%PujfgaTD+VSE zF;67sHm61%5?P5wiD3aT9)}PU0N(V;tne0M#D!I4`>ZPMRP;koVxP3g7J6_-gQ~4j zs9q5e4w2!40*9z)sm*K0eoc;(u+K}VCrJfl2n71U<1=+rTLsTi^eB^niSAH})-x)S>ff_FOwFrZI7F?WB z^!9tvYm^z~UcR>|y0V>jUGd8}ZlbbOk~X92(=+ynblY216R zaf$ZxWXI(KEa$iDjJB>Y>|{HdO4LtkGmu$N#V--?O2ba3$+uf7vUzzv?h;$5sDM)q z@v`3BIfpI0sq{6Qlw^h!5i=jx!nF|R6`?G`FEs}dxDG;@($F)|v!&4MdI%U}QOCW41C3F9cKs5sKo#RX2Ww(Fj6ga z>}azJ1eYt4xL9?zPMcD23Vf#X+62f0=%~}z(5GMDFn4Yw|BeKKz<}f|E*QTPVoK-w zAnlCXnO7E8mxb=gAZ10K8aTiZh6V|gWBKYz$-l}ogc?VpDkBE~Ju!vA)hZ4F3mlEm z2^?EXxSa7Y%xh_uK$+j_OFO2s=vDkk1`#dUje#iWvsCssOfV{NP)iJTTJ(GkJxwkU zT;oxAh9<1RrvAy2kiL`AjHPpcLgr<;%8C>m=!88;4uI$P&t0O$Psx=yn)R!0>*!!c z75ssusD2ke1Ko1nhI_nDVi9BOwceHJTt@lwtKteH51#+#X*ww*pA7lB z5m>U)3K4TMDpf_PSY(Gt59s~C*I5-j3FpQEqW}teUSRXywdgv7!T?_D$+ZO%W@VOK zG*@hIr~O(;fK+jeZA!2nNTU}O$nLLmLYa?0f1+apoWm_= z&>NM2b<#s;rB`tkh&4gycN$?CAKdAflj1+kbt1s%z~?vBxa^NOma`{P69|Y%V0DI_ z5+>Z)F&eqOgcV&j<+8l1N}!t+o@MLEc1UtE-Z2BG#THtkAKS z7Swl3ZJE1~aEvt^l~1Or4(zgM1SYcb6vONHqlh|#LnU%2-3=bL#=T6qXKg1ya=bd4s&?Fk zV3VQib2=IhmmnD5Gy#m37I!!RJX{s8g_#Fn6G_ z_dB8#qZeoc_Ip0h-LzjU|2Qi2XP6zkJj+~%eQMZa`K|1@s%)!{OMafitw*{0HdBAT z^SjiW>Zf|mi;)aw8hS#l{S%n~y^`xx!}5oMpRVv(8R zHw%BrXqZbJ%0w&K^m2A$$-(&_dQsUdwcM}g^QBgt!f_fC%bXi;=RaKF8}i1g1&yly zTr8qbD_`@RR)VVEZFuI+4|^o2l01Yp$wuI<$wshh_bX^ZV+(?S$gAt|^sc~krVXol zrQ=gc8g0GyRP(~leNitq{hvm8b}2^-_?fF)$-oCO^%qm}E;v!TMJV5##PE!K*z+;Ry(S1Lw`)2~C_rf9} z!n2ZuocPr(yGZNFQt_6?42ELN8;`MP80#i#$p3F6MfH-wV)QhqitE;uQWG+xmUcf) zk84z4JmW=~Q~rXt@YxDmcPW`;zG)xl1*5K8uX6rkbaelSL698oXH(qYIg5YjFz=o^ zPN;k|rrOtdf5lFJ1w^8Vss=H_;v^?z;8XtYfjK6>q|7DDBz^HanQ!J=X$&wLV7AJZ zSq}pg!R1O7;@=os-w)N6R<^@`1i6}9W?+58tQdnaKgm(zvh8F(vWm~YoNo-f9;=Z1 zlk=TeUaTC)~>51m)n zF1g{qJV7s$+W8~}g*KstIDm9yN7V07Gfr~YMpa>r=ml>X?ri7jU%S=P;PkU@(@Qnq z?9NE8F(eFV61>_}X%~-FiJR}}{cc`C@s(8Qm0{mm%_D~e?VQcp`OR-@37TZ2Fk}k5 z_U`mS?gZK!zE0J-gOTCW&9IEF==jTmXxo|%E_J|eV)%Ow;&k6f;WU=q;cB9=lk2Q+3CUY9<_N`+X5WWhPMnWVtGDE=oS zFO=wV9XfOm)bHxdvG!3GKHtCwrXu_0^3>>Fuz)D@0^oH1hoF5F)dyD)-Azds!+LB` zKzO<0n|X(7hXSFqH0(vV*!w`RWvEQvVZ`VJY7>T@;~UIqE@3Z(*QII0-3uqu}0#jzaz=F+G%!oaeY1^2M;R2HI>m!0juZX8eNGR zI&>@17r@0p;2!>+rLV1uIOOcwEG9b#YL9%8n}u8XRQ++>ueokA$xYTq5}iGTUIoh=zlYY603I z>?GU4LI?eP%B>DEgQniY#VW?{zUYt-vKVrvHpooPg57zisl!LYNacGx_D@-Ji!Mg9 zT4<#*Z@*RA6D*TDNRp$kM7Wcha=5z4mkSz4d{D4S6FK;i)0i z?)_ta$7R;%4s%Hfp)vC9IABJ6?{GnG$%0y7cb%;9OazCIo@3Ho#*C_(o+pkOJkMc1#sO=RZ-u}cOoGD_;&1_1}IOx{f;uw-Y1vxamVH;&DlMa zTB!J@=Dp3#-v=?Bj1LcYS*`(G>O2odVf}`kaKIkeX6-ZxP!V!5OnTCY)0g)(k^$t| zL)i_1{-~$IFt0g|9s8v0Z@XfVXTZXa)MfJwkL@nn}L?+<_8N@n~LBzAW?bm-Rt z>z0jl26j!T)Am6%D!Y;fNRXVRa;1^Yo_+Eqgez zIloL2$ZHrp@uP?Y#l#w93h$uwl+q2{v_O87$XCH7Iw>{gAT>H>Ad0K?Pi(TboIe%e zOs5Zy5_m&nTGqP`#iWQpq$DsB4N&EG>sb*ycXt8xa_PJOWCKR zk2f+@%&*^d^el=f;bcj{pz-o~H4>_R@+vk}>wzi8#K-7QgawK|gX*S>Z+Pe5uu8+* zkY3^N?X%!0z=ETj<3He{lPr63&Z@TI>_7Fh=chHM@1$9l8V4`u)FMuoC2{nORy*BP8G8Okn3Np`mQE&_KNL96+sEE{0=RPa+VlE{VaK&OOQYAR4tLOC@Z zgz6nd1XKKzw&H|I>c=ox0cm?ecInk4>K9go2JM03_C7Qbkb6DV`g8l95+nAywrD;` zkdbG<9Ux<6?VS6gCF#)hz@j3DsmDbp9AVV+^SaL|%DPiZ>O_ta-7}*S)HI3CZG_%O zRLa~b7&32urZiFWXdcO&td+g6FODMWU*y7f0ZifZG6?}R7}_W#nT4RVyJa7!(R&ea zMT#0H%}@#!uk&sbtnQJa8xr#5!_NF;VTo5R<{q~Sd{BJ~?!=D*%Yu!Bl%4k=)Qlv{ zJ$5zxU&g1YU#x4^^3NsA&@jSkp1(oUD^IHHLWwDNwe5au`=|WHUmILr7r*6uVTu@p z4a0+<1sOVD3Xxs+JuGGDynIqSoVohf%go(wi3a|t;*g)df5N+QYk|&KG~ettf6lQs z_=&^t%}vd%$S~U7k-`opx1e|B;F(`kTR8Kf-_*~(gKL)6PGJZPCv|I#`}RRmw|Y9N z7DgHOP1gkm3=aJHki*zMWM>QRP~ZsM8@mH&4m$C02)EHfq;sUsY?5wy-dq(CV2mVFc~qPe|f{K*wPwY$X)2kCh&L$hrdwuI(~Vk>+-lEIy1YgpY{~6Y>7XO_$*#ix zEM1fidYt0(Zm{s9{IlnxWRN2xoqdggUt1Ut7XUV$pC!#J#}9NbG-HlX|A&$1RvnBD zLY(XL{BHlsu{^#%%+ZhVgdDu zKz4*R?mx1OmAjV9+>k)A{%`45xobW%>Eky1k^gAmhwgeZ{`ZQtS>At`6{{R{WZHhP z+dysjAH2mn&9J&{R9mzd4x|eKfN|7Rs)wG0QTy*MMW^1-w}-R#U#kDVPT z{*f$O$7+=(_w0Y3*A;qWLvaWIKx5_pcp^t~WEy3z2@;Mp4qt1n{*m5WD=9)zD`d;i zNq7yel&h3FMJ=%?>()l z%+*B6RpjQM#OE(n4ist(3gnD3v+MpsM$Rxfou02(jO)XWh*$qL&_c-|Q32%t7Et^@ zOL3F4cj-JK$3%^9DZkaao5i{SGYUSbU+X1(yjSxc5g#~<#DynOAwdH&Irbz&&ThtR zaH7e^Kl$JPAokHL7?cw`Wt=&Q3a;Q~2{fT-#}IsLbtM%S)@z=hhc*j~@986DaH16i zfOyo>zOGyemm{=zt(19XExJuZz8MPFGAUQ{DBKtLQ~;p#FqbX-3>0s`;blEOn7Q1t zU>STu)fq>uf~OY4u`oueDC1DOd~AjSKp_`vz7Bh~7D-QzJemWwi}P47Pte?J(d;Ct z)EdNgoZaqfkY42shPjFhy04et{9&9_ey-yr$=3I$S3({}S_`3l)w|e@Jg-`&4O1Uz z?fDaO%QCr?@N#bR4!(&rN|{?kp{3k2H2_u2h?_pss~TclQtH3GRF*Zz9Qnb61mC|0 zC(PX!_UlV5nP;?&J>#Qx>Ze|fB1{)bcln0_Sa1*ZGn#IGqP7=9{4{(b;oC6K+*eX( z;<@%dQmU%IdXa@cSI3BXR(9Opz~8E|YLTy`h3%BoZPP%)of@s8?4c;pi{{AYt$=MijH#p%;Z79W4MD@uBX(E^+sjDxc ztPWn!Vtx+G*&Bg+a>nkD@+p^d3t|q)^AicYSH&So!({$(TOkt9&s>Cf!($#fvT0zF zkr9EsFDxGzs>JA6nY1;l{vMC1z9li&094kVeZTnEW&;liEL38aqwKX5>MmVEN%Jj{ zE!0KPd))Z(i9N7K6v;z9b9p&T(XR>YZELaP3gH8E4$k}c<`Dz)G_7GCt?@R;CsMfC z*7j|c?8z zCeqv!{_=LlueXOL^Q6u~(y7+9gVDQA9QcOb9YrgJQdAcv5`T^qlK-p-&98;=1x_6< zWr=veF3AX>nnb1^6aCo1noX+~9H@`c&@5irG`=rrLfe)aTQ9wz5$2T(g@N%oVz-SebC0@p2~w__zQ!%7Y{0x z8&2TCP4q%{a+JNVUBBVDw=eseHBY~H+Ni|-8`{=WmfSP5D9%pGACL=n(jO){->?bl zI2NGjAh1Aa3D|)}%=9yTCk{!HZaly60iwb@gB>$gzmJ-Lx|dYw2ph3&wwlz-IBpMn zhjuY=*Y7`!I!liIYt<$v;CyUM@E%K;Ef~jIFS=V~e?(as{f%3RK9l_9u$wlS2xuQo z__6Q^uXyEl7TnO~%WsGhN|J+ycPxZ^f$g?S9sc|7Y*j-duv)TjUW;&GLQfH~`43p5AL&pHJnvjO@>yW?-Pr23}EXtn{fYm3(I zb%}1#q)?hYZjxm|9XQ=Q#QCusGX~lQ&-f2F2XUC0WZyoR5%}j^H(6oP>BWzx9j=`2g zYGf-i61Xd?x-P%!z*SUWSKxzuZt;%7sJMQE9Z2wT)5^{`kz;R`U9U&?6po>?@w7ehYh9OoQ)i_svZjVm-%L%V3A(;rILJ0GLH7KYwHlg2%#2#2iW zx8LTrTmI0m7Xiid#8x&#+qmr}3a&!K6I9n#(^Ch?a`(+1e|&`k!?14z!tVa?9W5?N zFvo$+F0HAa{lGVbEnF_^rsEl49d;;zFGR07iolFNuMCUTvl`j>>;dS&>^X?A$e@t- znMmDJWvzBU{1Gw1k*6I^aqnyb;49?wU)^ReY#!-QueTp+_IK0WDSnjsP(vXI_K&3) zGlEk{+Quul&a(qBsSj@q5?rkIty<_!O%kpY^UYh&qU>x*DWI|hJAy*(%k0bTKvczT z$Ak5nqu6F3EaGlj`h2Ea5WMh;rL(uiNghxXkuJv&CH1h(x=3cIo#yl1t$!VUCm4Nm z&ee->*nD(5T9(1_hbRwu6(}8cY!P?%Rrun)x|Fkh3^Ip_1RUotMB1=+b_~4Ydks!F z&S~pQUFm%dnxGw`Y8Cp*s_LvuAX<`_WL5F%7;5)LT=gyrbL70}q@j%{cik-G9FA~0 zuD6?od5rYMXz9V-*@p3H4w2*E3$qdrI#Y`VRp9^#BR{ErD5-J&B!a3*Ux4?gk_#0;-eb?Di}3S(3mUn zMLWh_MH>2vMe#J<5V&9xxSKYx6iAX=VOnq1kWY(>!dBm`$e|Qs;OK$~`>8XNVo$ zO5KP`=7-odM|EQoSG7;QqiqOY2TY^}v~*|}<4LB!gd97B0#tVd52f-Nb`<8~(cuL| z^{-&V@?CALLPqiFjQsW9<|oaFVbwjea;1JS^`Km#>Wp7%nTlicU^ZXv>>XlXB3U6M zrw~2!$jfS8{TOH05rK-n&_#BJuC6QaeXlp$vF}{P+190pnei^L1R~)e0MUncSPZ16 zuZ|B4MJH+e=A#o7WL?@GyIWl8x_f4QDGs~dgW*TdmYvnz-E89FGe7nQ5ZdOGsdc@x ziS~lf^Ws3cpvEAJ7!K&C@nO{|vvL=lq;F?GSaSTYe>+n(9kJx#d~;|xi_nnx)9OK4 zj70#5F_UX>TJVlrD$*Nvq$A9uqvh6R`1qbhRQ4XV_C~8=JQ7JO^wWg{AmhWY39zAy zcOhxwh1YV!w|t?b_6~cTWssO2`bJdh##2;OOlMi@=69S4c`1RG^~ybK9g5)EVmK!g zJW|-f4hNH986#tNksZOLk5T}MOfeCzPd#Su%0kst>@-ucp!A}=+{_ynLIKDydqfuH zB*!dkp6f|Q=6xlkiY)8NV&Bcihaod4vD|l=A}R0E2d36CPBrJL2LLhg)) zJ|3(fGl5Rr&+&Ry&88&!qn6=H`SCOcIOvH&9(ErV#i@}w&c#ClWCl~BOTVVFx`;WV z@4)ydCn`SjKEvvKP*FXiq{A#|zCR&S$%~q&(^1e6_zjUsiEzC8>NN{PPC)SlH)nTf znc1XsS{y5Rw5p==lEe6Y9!V|xs&tPczzXluR{Xryzc`5z*HxVVJM=TWs+)t{ z^pc_0$2Fg|51IS`*%15i=NnRSCCuc{ak?)r18`9v=6e~dq{!x!liPh!d?gPb_bfwK<c=OpDj5Y6rb{zB5Wek;iF8FuSn{wYhJ7J9e?%omW7`AU)1DdA106?oBHDyHj5JX; zzxF+1HXe$>n!IinGR*}{J$i?dE^QR;RtQmQ*;HXCFaClWkolVr5wXD>of)KUrv%6G{ad~M-IU$iiv?*sb>57dZoRjk81=YQgOi42!vGjJTG+gsTP#(y2`E zzLhTJJ^=V%P36++nwC+)YK%FgOC+Ut1|*Q(uZR3({r#P{_EYuxbrEp>V*NU6HOg<* z2|Hj1uJswBP-e%q9Av8y*--rL^Pknw^41TH_PN&X%VVdwXHlB&AVE7UK#fwMB;`v0{0zHL ztXt;3Q?Y?gF$+K2v7iLDaV0Re$Q6~bYIGQ+OT^W8UhDlWB8`GZLmp0nCMbOI3U=f= zN3}rhtI`|^bUdUoy|7F97=PR4dn#2cD-ACI1@8b_<{*)L?0IaNkOfZC-6u$WAPxQd z>0>2I%cksq%6tMLM}^Q&$L4`n7}$uYVeC7DY;9;~L{W#Fy& z6q6g(C%*r;HINC zoA5;K;p%4?_kO4+`kj2T>qXs~y_Z0txnwXWtrz@Wtv=Cf?D|k8d2hb>P+|6@QfBtv zMh6AokYt<{pR6QQweII8WhE~~7pytU?CaASk=_LE&CakSHkD&#p>Y_j#oRRe9~Q;J z*RW!q;xvp%q$db-6s~b4cN5~`!bbGfsAkKEM`<^=RKlo6tqVo4aL<_B3#soa#P%P_ z{?!%U;k~M2U8YDh`X~9nXL@`cDon(!e6DLbJk0NCTCNof`MphMXHdsn_%@K`l=q5W zjkQnmv39H3|AHThwns5-vR_yipJ7 z%>UqGWH}jplA}J7yhpm;e5)sDg^G1rdJYDKRfQY|IoHd zblR=N73n8`cuC=>B*N*nl0%?wvo<*hqiSAJ z5aAsKy3_|qjpZ@pFm^CP1-4yVl%Oj7kgldA3sGBQsm`_P(GKzzl04DsfyI(MJ1v}& z(fw}yJ|RY!TMyqd^&QwA)%FpI)9_9!NPvwm(Uno^vM!UKnqg!0s|V^!vHy^#EUskh z*m$}-MX0XAI-j2ODlvil2|cW|j%RqT zP+lAN+yY{Xs7hoFlImGB{mCkS^K;J{GhK=Ke_Xw-_t)OB)*hN##^APm=~}kNE7mB_ z(q`aWaWE=P$^`M-I^sV{c-brketOUT@zB3_!Pt>#3tA%avrT=xwTi@+r0O0sgCaXn z-E>8r7VJ_~rqB3oV-O9d<{MSw)hGXVO4W^vLT+6rN~;{T^(D5as}j5G+37(AzXd&> zvwhIaEZmay$iHD1LH!_3{+CC;x$eJLMxS&Yn>LJ!F#WACTjBR!eJt|aZNt4n`W$9z z6V{i%vY!NYYs7Bed(0$ljQqXNh~s5{ctlZ@G;W<6qJ^~HG9wx>J&{yIWd3I)o$DPs zmE(78QGcCmlICwL5KntHA7HusY@(2hQRA&~LZHYzEY|aFnvER$cn!N%b_D7g|5#{l z(%px|k8H#?tkXj_<_|iSF3lH&V{`rb#Iye1xtYs0j-oFY2lBs%uYY}TJ3KtAVs?Z& zLdaJk$?NjfMt^Y1N}7(<(&?kON^Q>ijGD*5aDm823GyRqV+W>KQU6L#s zPCf?sTs?n1XdC-}T(*i1qs;&!_-Hy9S0wiW>3z-t)|KQl$Uw^era<8i12WjzDlj1~8#UFGY z!HUcRGnVMAiZ~|;?I2fgF8x0P?Y7;zuve_QZxXSR*xFB-kuj< zxK=VFMiEQ_#_{>*#8uu}MGJ&P&R9Pyh?JLb$xr14D9&F%kB?!ErtUXiU$TA9Awk|G zC!dNL?i<3Rmh&h8&q8C_?LSWU$HjuWSnZb+*EkS z=Gr5p;olg2-zfj@c;esA`CrRZQULIyOR-bn?-SnXR5ehmrF=uif_yz*6=#6%!~Ng%=QW~4NgJ@8D3KO-kgC>D zdhypaIOEKMNxkuDu*%M*bu02NEVwa-8JlGHM)Du(1MBWUN@Jz@v!X7Y_Gr^b1jk zNG6*nw@E|oG2k~3E^OR_VLn3sxX~Hi$+ouQSg^2O9~uk- zqQkKb;5&C0d`#gL*QgyBq?^_rqe=jlCZ&vu4ktBLX^VNc+nsE>_KG;T=y^2w_B*xo zjth5*hLJxAZ->_{>tQk0Apuoi1V`7Svqw*Jr+u)m>z>e?mXTvs4%1Fs#hdGg_EK+| zIZ)Fzq7vDND|e*#kRfSe!g7je>!b6~(@Ok7huqzBtg~J4?f-4|)&ti2(U~&F^A&5Qd{2~Km z+wj%ysv_>s!SYNoMy8JpCiTGrB2W!;QCwny7 zAErHDa1fdLoykL@SrO~A!V<_jO_-^Z&6U5eKONHYeFCTEnroSzKc~FXH0HiSQ#Xru zSti#_TC9KPb_Z*IE%l$(5R6f_k6KAD)7@B9y3HJpi#Wgb9w7_IP97c|OQu~H9{$bR z+US=%_DIbj$1{oW%&Z>d_MI{FUT4lULczIZEr*5sPCvCQUm7_Z??8?J!5S}naTJqa zPHXMaeVg7{8QPefX_WLbZR)|BN)UU*224Hs>pw&oStARX6b_pw^XM$NGN{uHYhC>Q zf>5WuGi+9+hUCVBTZpJ~?kmT>xJ1V3x9pp|PNAfJ4*Y1UEmr@?9j2=owIj06lY{Jx z%UhS*awe?xQoDue8?_T>3*nCx&JM@URTzKvBvlwmLXI`y7BKL%MOr)W7Ac47i_7?> z)VfR?Ue>k|{z-(<+mX{wvC$ZV?g3+(d#NlI6T1bjC6+n_$c8_%Pp7K5s^J-U)RFul z4{iofIO~Hr@TrpBdVkT`2MMLEkN?$N0jrHKU&4p0P>g=8lSb;&uLHD*0uIv*s!HN- z0%PhS!T6%JY2h10fkGr5r-Y$oVhJnKs8@!Zq-K0{;vYmKtE8IuVFJ#V#kBcF1Y^{&YJ#arcBi}`)kz0EF%`+AW73}1S zp09QJLF$B|#=3dU4>Ejg7xkVmR#5&@lDu~nX4`LRk_rSOf=q^%sX}}%9O^KnU{BM~ zX4U&^4szTd3Z5W>J<#%es+SCz-~*Bl2NTPSUJlcoCi@0ZDTh-B%MJ;z5mPVlQ7Uvl zk=Km!<;x~C!Q4NgcwVTs;^@J@7sq{*uxpX$4=*$6PD>r0H?qc*Pnvc;>C=GacR1S{ zmr@IwuIDnDWHayja@esb3tKy>;rH>(T({k@Y@2u?N0q+uq78lBY_1^OnxQjh`f*4w zRc+d@06eGb9}!Lc-V3~qQ=do~B@?+yz|}j+}#1ALAk|l}fSm3o(U3(e(9Xp8``>CyHP1>8LAwAMp*x<~<;oxm+ zp28Umkc71WMz0}AJ)Wwg;4#7>-t!f9oS3g+ATknU>Qc#K)00lkQ@`r{QJ4T!iq`S2 z@l5xzqbiEj8EaHo!W=Gvs2zimAlCO+Kmu)so$UpTOgl-aC|EsBLdp$P1&JOW9(I^S zMeP^AkV10O4o&fR#+acM<4^h^#lk_|Ty6G~K!VV>0Zf|J* zt|!brd-ns{oUin(rdh|taKirMqTH6!w415X17ySZF=6PExbbuTZ#EueS;T~TKhX=cs9hgSAIw?8;xHEG zl_i(e`r}TRyC{ImNHk?Irx^9(K~0jk-|T{!o~?w>GgM(o zepQ0G&oJ#8_UF@FT&HZRAuCzW@4P|5C++YuGpvqP}rCyJDy{ShVe|O?vz$aqX7}t8Sw-X zcjQZp(IVznL}HYyD60Lyr_&x0b^MISdRR5DOEPiZ@Uu}PUnoodo`(P~nahnFQL$y( zlk$Z6)i^Fm1yvY8y)&t9g{)-n9;3PEqYa;#xuHD>7iD4UI zLSWFbV#0)`?X&RfhpP>mwmj`Zrb91etsJMKCluf=>%5$cv*H8_SX=7gekAb_v&-`Q zNMODr(msK=snKnzYki&eDQ4>AD(vN6$06$0rC!8qOqs0fkDB^kKKhfN1B`K_&zQyV z--xF`KE+!O>`xNX7 zKEI6n*rRb9yWu6yTb=8ptE%(8knwRgu_n~ol}k_pKjZ3@bF>#WKWa~D3|r$O7b=Og z0(J6TJGx`fC4kJ7++I3Y21D}eLQjLl%le*3{N_!A`h9tCv7iDp|Bd+Jo?D{TgY`_C zTFk53nWRy7M(MVFe@G4Y!r*SyCSJP+)j(~38{G^CJA+AC|_DsS2WbLUoH6838VZLo|>MOJWSMl>5YftwUn#d6{gvTc| zl()CRwEyHKP;}duMM(k#n5ar4xaetSdgABYv3Ys5H$%wQ@ziYFL=NR&A>rh?N~%&^ zM0DlfvgHcC$nf=tMtAw{k^hy6r*qClI4SRY(pWLSNV{rnA|lvT(3W42kkXKF4f^%x zeX2u%(tCRi75X+SOh|p|LP#}sKe^X?vo-v)oDzdS03NPe+~@2+i~I~922&B?__G5! zx85eg$HMoDPZ89e=6cyspOA;>ZuQ)6kt|wVSQ5EyKz^Y=u!1<-jo8Z2nW;8;ayt19 zW8ey-+UR9`UR93Wqp9u7vt9h&k11&{s!e!&r@k8i&Wa(8j`DDfxkiWOvw>x}I-kwx zLfFej_l;roFG;&IDMnxK-or@r!e{VDu31(n0~MCyNV2N94?Sn92Y=gU~@qsoRiqRIO~?zx3C0!e`*mHQH!Cp(XiKy~06(WG2P{v?JDkZn(;v&>Q@OON8jCX3bXl*`^33DniLG_;(r zr13?1RxhKuW?bB+wc_2lZ4(U^WJvCd)Z0Ta2@oI%G^hUT64p}_@#rAOk{)M!s`VB% z?LIx=8ktJ;0=hi-); zZ;})3qj49aIRd6V`2X?smSJ%){Rrl&utM>#93_eonE%%YN9TSjN;E;V>@C}%> z>1*o91%kBELAVki_wQC)RbY)`G9bUgksvTD^jAwuykC3fN(J~x35A)J;3R4bzFx`kPN`a zBrCOFMASWeUXt}oNw-<*$~}AqS;VYtprA0X3{HeC~?6W zet}jNRS_PLrdl&o6iU3>Tjx))-HF{He9G2Iy%FnK@e=hj+}97IP3_engoOp05J#E} z=9vC*GkgD!XRj0E7M~c~vAJ2rS`LBrTZX3V-_!AOA_6nV6*|`)6U)3~f81mju>aCV z*7oW65q2$(w5WQ1FV6-A(v|XFulO1loLApX9q41i|DfEtxUS!-v0ZF%+!`*{G8>e* z9acmwl}G1^t;ioX&SBk|Rzmv3#HxlBY*C7M6DS+*{w+jG+Z)ojt!cHoQ#b>ZCJx$B z6)&U_M#Yw8ek@*7?bCCUND;F6(DuXhn$)7t4whfjsq3AuxprHaw9I(p7T)Aw>!uO9 zn0IqMN|wOipxzx8mgbGU)Op$+y|7|6J8b{fRAGgpI`VPBaOiqMKoVmqX1e`h*0(V> z62p|>B$E9&&D3A34J)V-2;>DStQy$cZ4>7Lf2k>0+-c@3Ghw`+DH;43NK2?o`zshQ7JX;;Qyb@<;-{SJ5IHyhNtku4x z>;7jyIB=}D%UKGIQ_-RQffZwHb-@ZFv1sbgfjrw;^p1$y8*D)+G<5@*(ko~!9tr$I z#pF!(eiQ~l5Z2JuSL}rwYhR2qyj6rYR^eQ4Am;td&?XducN2KSp*uBu?kPzWKS-}! zjGw{zC961K=P{K@qfkBUm@OKF?A)8FhxDFh=2_}sQ{Ipp=SAl7_QVG%_Yb+juS5jG3R zUG&*k@??FB7rCKUI{|5_Ev*-k0G2xZ@`_Gv&Xu^^x4EnE@+Ce*3Fk-^PqWb)# z6l0Pk)(ce(yxWyxnT4o*1LaWW9vXJ>iT`Pvmp=cD@C}@@a*=P)!!c7Dak5z09+{oO zMv#Zqr&Hg0q9&jq*(XeTN*CXK+8J-POlN?S+0~r<^ct`QFPGM@guOp}y?MGMkXYQ+ zINK#Ap?>CpviGBjJIXZCY2gNSSiKa8*)W2eq>NN_4tzQW=3m@K;c>2WG3h(OCZ@H! zX(0E8psiFtC*?wGP+hRDzgWPB)Fo%xgAoep(nAk_bRXWj4OHn#!>kh=Rx^GBelH=5 zhun9pPe7j6!Grvu_GuM2=J=oUOEkg6sE|Y+-*@ia=Zx)8CJH80*pyV*cG@0gu#DDm zN>}^3P*89ZV`oa^n&IKLqjHmqlu}acAvAH|`XnR!0d(wNS7^4{;$29uI(HXN_>=Mn zJ0h{qO50a(O(WoZbJ}tVe(A#@?-O^YVL|GA0^GwPnNDzYrTK7cH9pJ-R~)pCqTJkF z#%LC4sxG{K8uH}o*>QFEw&dLW-R&PuM_xU^q=O3L)h}}8+v=m^DKhzSJ#F&c(XA2> z`3-Yv9jpD>^e~LMujOi6U2=zpB}CCd+7oBhn;UFPu54WxK2k8|aC1QASD>d78%I$U z3AAX0k5Ua?7GgCt2@>CZiKknSi#?*JEnD0(^lSM=L=u(%dHO|xP%8s=7pjw4=>dly zY%+nMlRfH3v2PQIBnGU@WxVx1{6VqblG_*Ld5Vd)p0A&3!s5LRX5=42MLP~=Y>5xh zn>L4YA3D0?!CWD4`cSEh(RAP*>)Kpy0CZURwJerps57?B6ku`B1b7vrE(LQ|6chw) z1U}5Fsvt*Hxh{#a;s+UkQ%6Z?`gQ#Z5QBVugtzJE>pEaA4HDcnDsp9qG*!Eka@XJZ zHG|AX5zC67q@>I#W+@Sp!>^)o@X37KwIIYqo9>7+xWd4RkyvW3D@e{Q-T92 zk{UH9Jsi}EJ2>;79wb^1@-MJZmd=q6fiTj8^!8Z=ljmL&wf&Zix(Hn<&eT9PXK1^Z zO==O}o{^0ndkJ569Lll82}LUfI!bAeR^TyPBb`QtppU4Lg%NK^xUl>wLzST#*8oDC z=bAhP)_h?MsPVi@JUi3QH4*%>XF&l$T?|klAilH{H+~7LF>f=HDNIeXFvqg}sw=i_ zc7H0$T-Xsertu5)7;%Sa@+vTa5-R!zA>(@nmh~Sra|Xe|Pkt{4<~cEe6?z{Omm>kQKnE=9U3Qx<)aGkcKqV@;@GSP0z=G- zckOT0YD+#r-#Njg4Q8dFT?OpJTv#i$Jt%dX9y^@ui|DsIS_;4dLCpxl+9?kwBad*6 zfKQn;hIMyR{Vii8!YqNEH@lWs@MeU86XgD!d}*^d_-L3>rx}**P0mizU|2@8=!tB_ zz!;@)k!J96vAV>M@cQCOr+7-_qA!>ofxrY5y zQm7|WR}4JP4wU7CXlZEV*5fFyRq$4}3hKjnu*l%<{=PY-m>gyg1)X(;BHO$QODZ!K zb!86TFb}>|F(+GZt^jqRt6O(;$;UY0ArR|dw0uoOu*TdlYX~;_671Hbt}TinLD**E zel2fX)%yV!!azT7<5l@&ajqG_eUQnTJs5mr`bx76cvmSUB?E81gqUh)UatrvEly4> zdtbe={bTDw*>-Z|H7`ohwn~7}GNp&>$taZP)dpSP-a1L?^J}Xu1IbrF-Zm9J7-qYS zbS4FXJnt2m1#w3Vc*OVpYuu0g+J_89p|!U6VhC<i`vRG zm=po*I04pKgLj~J3z;40{TF-F#hCO6bupAKTIV&5YG6Y?mCLqLx2s@c6ihqy0<0Cw zPBF%^Acnv>jxhw-;TaO9rayw)H`{QVAGVie_~{bF96!|Q3_0*lpD>pc8OVP_c$=Dz z&8j4Mh2hP9-`Rl^99RMYkzFtsdl-NZQ)I7WQSDE5CUOfM zIYrRoaaMF_Dl4(I%7A3A z_fM~Nt}7yuk1yk>e}IrwB5pXcDqFQ_pQR%xGLesAEbn~?-ik-{uI^G%3;hh<$B?h; zC_h8LZA-O!tbiVbOfY}l{q{u)-if!|{Il!&V|ti}5P_e%(XLP6#G)%!2;x;+8$pka~3A@_FpcY$=>#jk@cGR;TJ*% zd-PcS=~NKhnxY4z=LBA5C|z%*hLN`=PyNb}X*gvUKm3mT8Q9m=m3_haDb-BJyUFPY zJeaR%r$=6jw9WUL96sKPp#Hxxg^{ieZ5hWF6Ku+;SO3>0`GA<$?RwV0FYIu!@v2H1 zg6ml_Vx}>b!Y>BCWV=IA_j#)VHIdp?z1)o3I=*9U^-8*6C&`82A}tlsRpRTPNZl6( z1g-(|63xHlGQP?B_6dyK(pX5}rpNPrg#ywD-bT3TY(e@!Bhj<^8|g#=0scxN9V7*D zLL&-ejeUouX;CZ-bX1HnDg}*yyVV=k_q`?pqV0{9GK7O()b*(V($slqKo+_DP0hNU z(b7YDt9p>6epDNp6{FXrx-Tv!u@txv4A2Rd!!%%~a;^`YDLcRQ`m@*jQz}9eH`)K4 z+hER-)Hb!hn4))>d^7D04tgj&ZV_MQFzZ9t#0CG2{PaUUR3PJ3Mj9SCHD9dOBGHZP z-m{Ej%*Jn`Ke*I*z>^Ip{mYbHS6TAWPSQs#&-@?B$n^5QAK<|d!J)P)U^fA+%;_o9 z*)tAkIC+s+%Y_fC7yWm+XrOvSip;CYWrAffXo^E6QSs+mWq8hHc-N(C91pvn+=Z|8 zk3;(>9$?^2z=H^0}#qjZshF$%YUkaKGyHGu< zo%}!}$&?}ulRsv1fqx~8Ql64uIwB5(yYuGDg{38;wKFZ;i3@1i4XAHK1V}}<2Ivv4 zi6!^ROW+f7_6ywoK(!jk$HP{ySkV94+&3uV=?|~=CQI5tqQD``PFG)s4~2ev{Fy}v z(EQDB8f^E5-|JP<&i!h~^4pveC1h`De+zne3A+S)#3LZ@3FZE8Tns15!vWq<*dW4> zYA+!yoA11mgovMD6v&W^5}@lh&g6#&c4cxW*CEdPtII^|F9Xosj=Xzz&9A-m1`H%T zF8i4Ypo=Ur(SG`|J+U`%Zy{`g2EJ&Q_CenoOnr=op0kdPV#*pJ65!Si?(Ku@-ywv$u#zkYB@DuovUQiY z+Yw|iQ$=u#x8Y6oo+$Tib`XvqJ})G{%2|?G+s-_cpl7@x{xil#1ftH|mtnYjIUYB)%F#d~kuCUQuuOeLKq^ zB*9l-B=06`eYwH5yx#D&DQf%ghP4J*CJ>4W74cT|pGVAB7GaVfZ>aRqfb{MhDEDeu zSG}EFuEQ2ILiWBr&j?&*DqN%&>dDU2!}+u|+-br$sZ*A=L&~e38gG4RKUkz4d_5bN zFzz{9MzSh@9nh=w_wvZ@w2ABAiOfM6&uES7c2N3G?AYaYV^CzD-cy^r<-7F1@|>hl zS9UXWEESE8TM{%u1i-Kgkc4;SXNU3!(^*1$9vcufC0ND;_AuQxo8!)mZV#w#ct+aH z<&@js_-9Ds9kKUrX*Ss8=@aA?0_30<;w%Kub{aA>}osT@?HCNtqEE=>GZOr z)^8x}_;!-Xfa;pDSR=;cgZ_8{V+5%xOdGL(dTaYMPYntpkArBVqOVl_-6@Up@J6Ld z1Snx_RKc~jVy(ct8pAuj+87N?d+1EAKMK=h(qFHXFRba2n%^yMIgGj;JKaXcY8bai zxM0gEDkx}z7*pSxm&3@)80Xdb7BQ?Za0H%YV3?&dM&e{>|0hA=EvRz(LTRI_up6W$;!Vb zP+O}or*MXC+s()Rz@E22b8GkxwsAG7FRg=wR4VU6An;P!&+`;s8f-}5bYQuQvWx1d z!t|uU&t=e156+J&ay7}w{^wy-I0*c|o}~q2E67ygBCy7O!kgG+vrDpwIKW3t?v1iB ze1o1*@noHvD)l0d2xW&bD$bA_z;T$y6U9}>QIgKFM3bd1*5Y|$hHD|6Lw2btoK~XH z%K2wNCK2Jyg?)DPFHLn*O?URocjuRaD~#^C$8T1z=5!3{WOgd-zuHQkK#$d4vf*zx z(v8%89`G{+h#fk8p9lRfr1M6#N+wW-DsV7HV%??Tc^6!B-~|BY#uS`Vxyen1(+%ET zc>2lNibR;{2#oTWUEb!ez4d}dt(`@gxznVghc3lTGy$qDF$@%rZmF0#LTr_QG0Ma2zv=X^PNZO!0KO z(!OjOtJ!Pnh}fkyw~GfV1?sk`?ewW7#`KAL{K6NIbG?^n`*ewB@0l<%99HGitTK5z z@V|nbS8yek73mTu56UG)8@?-PSvkHNuQf9VAyEUeVcKOnaS%dRJg+4uwLeXRuk^<@ zbQg8w3)D1>p;Q8e#&WfNx1tS-`Er^lOof79{`{FhwqLU8dPT8AgRJUrH19Wca<_n^8oqn*&ueCMi+xm_rAH@^!K+l1B7_zyr8Cy zbv%UIA?CPkf*ZRmuNxlubTvUJVh&-^JWK8=>>KcnM;X)S`^mG0N~{r2GaVvK3QcQbn!z z9Qz>ev=qD`P~5{e+nChmX2LCv+S~QbsUVpa9^lan@AiT>8|^~{rg!*Lm~OeDC_+Qk zx6wG{V~}R3ZsAfcvi<&hnJ{&S6JSkN*&E9df_A(Rr{|-AHC96}n#aqMc~bac56jR_ zm62T9u76dVHw#Ax+`y(c0)HzSJj$qX>iP{d1aEE*qnXH%S74sIC*+j(YPNC5J*(#E zqbxBkAhOq(@F1Qn>-!%!`KTp&??~fSTLsJyiaLj~Pt=&oYPNm4?RfDEP$J^Af#-a} z7NR!7UvXH7*P$A2@e5PU_-K6NfneRSpp~bt z$6v_XP_WQfoUKJ&-ZeNu9Cz(8tiX?3Y=g!p7*PTXC*dumR5&82xVvV9k1T*VI)z@MvKB|RW zyg2bx%F$!+?FND{2ZSbaeg{b&l#xwEXz+;CJRV z->r;p7V>BIY`0jHbK{RNiN>;)NW6U6)$CB+HwnRZWCYSLH2BoAlDs#` zgFrFNGdv>D8%u~O=E|okOXUAbkxR)O8VhGzb_u~;2mAoYIKB682J#J6}jMG z11hl}z$lbPV?-l9_S+%;g7SA2!Aj~(!iN20t?);ZJ}~v6Lc;#Bo8oiuwB@-mN%rM~!eyNtR>s`+` zN?$`45TSBUt2(K3P!>eqrWN-}MFhGA3t9tXX4iHCuvB2z_tS}=+lrAHrR&#nm^XaE{y%0VRk_?WQPkuy3=`I4a-$p6U#?N~HQ|b_N3I*BB2B>Na zZOe73D*(y}@2T~I#mJQ19}$I!I<>jvS#2QUb7ck{SWehaI+JrpM_)hNwd&ahr;=C3 zqK#T8fl~#SgYL$%iHFD?E{N*8`30xpODOFa`^v}q=DLh=#c?a~Bl716qBXb-wWSuGXY4OY2 zf=k8@Q@elFtpzJv$ou|zz??-3T$A-1g{*C|JqN-~ke)Uy(=EG#zP0>DGKU*OytdEJ zOo4as6@AzdIsQUt@#qqVZCPwCdE1Bw%PFC1u3y zQphXtbOQUF2WWU+Hc|46vb21KLwcmvm{!_>-1pE$(T3Z=4kMU;2ZE%_!g}p37&9`m zKVZ`cCL^Faqc>LItq`YehTs>b0pD@7GPG*LzOAr^_`!6*nAq_~>p_k&VU4|VwY_^1 z_=|4|biD$7Oq-!O6Z&7?Nup*vTpy*QZ%?DQ+nK+ZYZ7RPq7N$7*GWJ=#%+iY_LuZI z#L|roC}_k4tA?9~jCb*pq);BdiR6(k$7*h+1$>pab+n&ZJv0 zirN4c9&~S|!#_bkzD`1YB~7}bF`1-`%CT*a@LB-<3aq-^;9Q6rQ&J)lSI+l$QGv1b z;{jX~?r^IUWI=F?g0TlchwOWQA^|Z7yP{40c$wMnqYR~frR>Uu98u^gNve;~DA_?s zH8hkb!@vPV%0+%CDN!|>YSIZ+=i!0{!M88DsqPzINZ&r5ImaTj9G<&j|Kl8#ZRuoH zv>z1k@Q-T#Jtz=vp1ZPDU<7n4YTqnk5o1tySE_6 zQLOtb2)@28-i{LG_=1FP%eyG+_sY;L+Oa?O`OT-q9XQ6sR1F}ceqS;g!ZaAU*IdSWXlbNZr^neRutle-6=RLoTH7)WH+lJy4Ln19f#F zoXvzh*;;ST4M#wT!wMWlS%^%4(oaw%OdY}ZC1SZ7VLdaSRX%DO)3>>r8*kj=dhqq4 zH@Lz8?nIun05m+cJ_175w**!3s7%4AOwuGPR0VfEox_0JuCK<%x>BQn*Dl7|(_%yc zgzY7ZQz0#~bEulE9}=2Bq4+2Js01vo)Qs0~%=1%cLk@vCPo}JB-Rd+jkhOV$E$g+Z zK%pP%DAN{GXt&_F1~j)kQ%E%_jLdbwsJ27%YeDxb1c@51z)^JN{B2*9vZrs()C7#` zpFNDbz9AT&_JvMts&pL1mJ07tAgFf}W+06r(zQ{X{T=d@W!G}y5(=1lJxYYdEw)u= ztS3S=lUaZ+Ob0)^jy?1q=tKW3Y3=(tCUU8Q%D(k@$fSEwNc>}MVtFcZsDZcFQ@Hc> zfvFA@u6OV7P5vKvb~`#bR`YMBQi+Yf<6R(x>GUgC2QDgXQ~Cn2Ah~Mv(HAyQhgd0R z*h0r8iAi>9k(^q@;fwO^P z+0Tg?FCAF7VSzh(-%uSp=uYBy+3b(n(i-i(Iy1D*`lYnsTd)X};;2mI0DDQa^Po&D zRcPCo;A5Ee0&$DTm-^bV;wAOC**b18jER4*o#05ElBGD%5ZHTs%zhmMqxkK;Nck1x^oQ6{aszXJmr|NH8fp;2LwCsvRZTWEAPq95bkm}I_4fo=|S6_)pe9 zCx32wrIhcFIL;4J=~7GR^&cIU&N25zdhPrDlb~jzWmtw@7ZZ35|90Uv_HvhAldUvl zxTLS4_t5+2M6Fr4`?mkzyKbYSG}0U&&y#)8+G^L3*fF%vUV)N!Jx_OVkE3cN;5oiM z;OWoJ@IRoEs;gh>ZYS=ad9krO-d57h2(t5XiQ(lgA8>Tb!EyDG1^HBJe=3M=aNJsiiQFG<$=5Ytzh7Fs0Jd30B#bzBOnw zBWU*yA&@|HOYL;TU3__oF#xG0wjUBM=ueT%k_{pao7)q&0jJz3RmhT&OP`;ZEoqpV5?rD~+=-X-~t z4w^@}G?&A>E*56#%Yh(PnOx8CmsnjK>?^LcGtD1KO9z2~JT|kpa~dx0ZcD*J;KxU` zRux9_!&dXnd6UhzG9Q*&fRJIKL2g02pL&`Ob%uO%I@5&gf0AWpGyvLVE@Ka~VwNa|(EM1UCYtJ$5B2C;qG63{wb%-VlZ zu>11(u+xg^1{n)(X>b-VLEVMZgX7nfeW})eflPqqe}N-Mu%WDo4SnQ%uvl#Skd`N$ zZ7%vsN}ZCI%)mU-HjB zDh8Bgo?lr19v3e0J!USz6OeerxLYFgKw$Rlg$Dn{>plqPym3^MIk24iZ0yfUV~-~H zv{ZYn7pJB!DZo&4rQU<<_`Z0V6qTP-|3?c2rqM- zKUuhZoT6jyxTUzOh>s=y$K^Ht`!NbZOO*YfKyLZb&Dc08%pqCQKOWr9>8KOScleK1 zvL89h3mw#qZ`v;xUfqp$89waNnv zSNxYGV`=VZGp1_RdNo`c|8&L2|8_+)D1o+&t^xa_(?LJOuOGW8i4QOc^!9V|2|DZo zA@1_D=Eq4LS(Cf=#zcuLylP3pf23|LLK(1t65fnoLJo88cb^1xV_lh|g}xcFS=IRk!}He=x=%@P9ByaR|I3OeE`H z&HD##PDj7V_MJ;||3j2JteOTPzl3Qcb&KqH4FyDG3(qFuDVj|bn^e{A(Xx97^<{2$ z^ANcJvfilLz_O2jwZe}dj@Msq@O6yzh+daZ(eic1KSQ`+`1rq25WSnb(6xVFHu8|F z8gABEK?K7qlFB*v%K^fQE-(>ZFNZP3F9n@?uld`r$ml`$u|>=#)QDxZMjYClZ(4+X z!gjrWo4YCUXsN23DQp_Y@xWy-}s; z`T{9WDr|WtFcLamsV{mHk#zoYQdnvr>^@{!rBr!_K{%$tn0X7LDFYv`r^6+pJ?J6| zklx_qr$71AopP>MVXmxMej$7LNSvcy)$<&%F!d9o#300F#|LUi8YNR1SSwBQK}70s zpM^LaI%==T2F?AtBh(yzR`eynE>gnc7Sa{CGAj4dYyvei1K$#e=WYStGp<}1n(iEz9rL#8ch!E7+UeFod(V<_!KqEq zdSBb9IJ8Qm@XE7nA`aV(c@Eo!?R=b-isfyb*>FqV0vnE`XNQF#GYv@+f&Zo$;I+2G z-31bYFS}x|4Y_KD5N@I8&p6+|V7}MU{{!>AG(OCav;)$^yT0ti2~`~rqBny$;z&he zV3Oq7hH1;AClApm%24rXTqR}(q1Naanw0R(UU=fqSNHdxVi{Y6cmv9Fw_XVq#ns@E+%RgrIY8{b(eR%&(RVGT$iw`yfQF0lBOWdy%Ug zBNw10NPhhpYo$VOw0OL-RxOxzj9#%qGh)PbYb32ys5LcrRF3;ndu5DPwJ1+8P8IVO zyPR0CaLj7z4!1ny&G$a6uH}uRImQyz@0Wyl`uW7|`Qz_A%D3xaX3eo6Ps6oy5$W3NS3nY-pVI5=FsqO_1~<*hu>Jh`XDG^VcHg0*kZNIm8nwreTiWVGJRYCf0aemD9% zIdyB&EN=@v*Qv+u3Ws0=pjYfR$15k+?X9B>-fSEhs}GtBQXj_rQVs&%nc!zU*!`qV z#c9ccYw9r`N@hZ3y0gBv*dkmiX!$+?J8AQlAYGZ)h&z1wJE=rnBW$=>JFtUT!@IF` zwwC4o{49R0DPQw+u*qF~w8cFs57bqz{?K7NCT`FD>|TBedZoZ=!%GNB#l~KOZrZoN z?v|IT>A}x7tM0|E@*d%GJCG%F`rqB59W9Z_U>A)z87hde4YQOJYgH1w(QZ{+M#@7z zK4z5qx?Xj3_=>y2{p@dtGIZ-N>qY{j9fi|bQNKYAQz>L|P#_>^B%{ANr5qGI#$5C5 z68v|4oWr(>8EA#1bRFr2@eOxSk8K{cK0R(}QS%dYHFKir`q6BBd92({ZnaN{eUCKt zY_Xi4Flu}^-OcTu+`sKjRiqA>o!Bg%qE$;x&uWA75!;?lN}7$vb6_-zj`su?kL=bH zF7DG3D0F^V)#`pj9_#hdw*qq|v|xbmbYm3gJ@eEc)rYOSQEi(4E{bUmj|ruzWH?gv zvBf9Ls;Iz~fiN<=tdW$V%i_58SmMbDY$he?3I{zs!g%`ApPbBI)YSOz{>!?Mg#Vm{ zc24N!>Ox?Enon)Dl3Zpv2K|7BQyr?x(ZIo1+j0}GkfJp`tOjp_84tjjriwiFA25yX zf55acW$4|R-cnDpGkz#0Y)j*QzCC8?w7ac9-o`sV#lfrg7f%D4Q6O9S;6(1Uv^Mn% zM42{Y2xX>*isbvsf9(WSE13j2+XpB^j)n81i%n^)!IVcUH zmvi{&ffjI@;D(vP6^x1pzNE}w-dbhk!>`A1gk`6}--v$YD{OxEmAUCp)(D)394;{; z%J;M=btp}%_l*>N%3G`3>@F`x=wUDza?Goc`Vm43kcDrT^J`*7;2Q%U|`sO z29_gbjyRl$az1UQCi>*`f z^X0b}yuqWzxLE0<7JtX1lhD8-n|s-;fKtg*xV{n?X<5)LMW;2b(CLThdB$6yQ!M!K zC(0MS%rp(g^quoaZOKR>bAd-5bGQa)-(wzo(l z1qP7)N7@D^^&*%AQPBE!fYP}gLJG3%Ep~9<_CZPzUc_ppw1#1jBiqaGA9PEM z$my{>8QkJtBcMu2IIEMRj<0_OIBp+wskG7+sk`6ItT8J?J5aJXG~zY+u*E4^6#PNr0{cEWsA#%E^Na62Fi(iQzC z+jZJ6;gLc21}b;=J!7Q^Skkw{1Ld=-lw!RZ5Mr08mxV9_WbE_<3|0cwjJ3mHCE$Bk zAjj*tK=rWXo5y*^D_cPG?6Mz)9fB(!hKtr$O>O8hwK!}EZ~VCYdMKr?VDzfTc$f+7 z(rSNlTED&>!xEi~YEPj=gp>Zn`=+XwAFoD5#({*-^V0fV0Zg_gFmCKLYWqF967DD1 z1yL0EF&KA8rpAv~f8Lx|?i`4sXsE=TF6yHmrPqc$!$b2QJc0kU_uYFS2x2%4VtmP7p}=E8GkwX;QpRBc^#gV{qA0>ZVE zo(3!;BIN%zVFwliLTzj8x#ww z7==J6=aWUY5et+{n2ii~TJ;zEy3p{WNi@p!!4_ppoI1K6?`?0mt8}T`3gnr4+93-v zj2|>|bPp~+Shb6x+HZgo5O&|&k4URfIIzZk4rFc9D<<}fbRH2<&+tZrkv2Xqdo>8-|gS3lM334SqoW87NAp5dB;k&JK z={{>yb0z^Myajdb8~qw!Y^}RKE$yl-2N9I&^b%g~q5}#@`xJNe<+?j?A@p(zSS#e` zTKqiL19PEI&v$&0{&kk85Zv@p&#oQK<~=L!+ix%_05!^}w-mitG^X8P)M!0=DHL$G z8Y4cM66fIIwB_>g4|UjrR$z*MQi*qKUGVVwLfMPrSK;`r!T!Z9H^qctyp@A4-0^#D z2m9rvC?L-gB&TdgF-C;^#Ci!iM<&^RytYtNV@d!_gR+^-j}s`1g7%=RmW zdK@5bPK%;`3{j0XUBtQX(d^GlPhI0Oq(uBx+9A=V(u{iPSEmp#1ll7~8i2}2xt`@` zd^%Rj*FFNTA#ZITUHmDo57#16`Hjg{d;jmyJ>YPS(C;w$l`z9H9}Pz!8bkW7D4gx` zF-CnOd8?Pb%P^u-*l@<9$^=rcTg?COp;U^{ zw@qDU*LzI0FT=XVwS8V^aCFVC<0gPA8OIo;23L5t2|N~X!KRDpt2}k>-TxE{q-|dS zqhPM2UOw=&p1Onp`dq8skyQPKMz?KH+0n`?lldj_^2`d)QU9&~2i!qorR(6o<8-93 zhAK%PUaQ^WF@(x4RH@mr_3iqS>ayWT`TDIB^+>t#(aKJg_`qDsHM_N}s&h3m!??4^@nT}Ea95Zdr#sW~=F?tgyz|R9pW~LxS~l~T$MbkSwsWnXtm<8M zruNiQ18;b;)-LkFpnUmE%RQ?+50i~ZpFaT=fXu!Q8+)Z%;ymaSnN?!b(tKP<;DgsdoH&-0s{(J~rq z-3Wyb8e{fvqx0=v(|Or9P~5w-Ek;WL}?bv9#lHy-~7DF?Z!7u{((a z_tV6b3YXP$`@q|suIxgWxhs@s1~(2d4;hV)Tvn2=)4=f0++RwOcFQwc74p*%g8~hIf#AJ?Aq(?{+FfxG+^=yoaEb`+P_dQ(xBb zCMcDU$X;j_l}Z0wpf1K6R#G!oot1awVE zOZ*1t-vl? zx@G73r3hg*<(H4Zy?0VQNRP4ouc!AjmoJqVPds}trlU!1{+T&Hi@ntN8vb*v0J!0_jpR9AwJ{KlrMaLC6D7ug? zY2+li2cJ_fEpjnd*C$sP3*_5^Qry{5W~IAu!O_cFtd-@2lR*R^{zACU7p679M6@^v zt7W6~5Z7(NXbyf#6{?hdZZC!f+|y*ry-GDcKH1Q69^6#@NGwFz17nl_)4MY`@HDX? z^n={F$M#QF7(IIZ6ITPDy6(7lh`I-wijREGUkx<-q!du2`Mr28%jdxEJjkH1Ym9fA zVD|Nq2HO&B%5_Uz{A53le3yt{rV0%&iR|GkDUDRqM757mg)#=|eFa$&!@Qgt)|76` z8-FBkAJJtC{H+vGWJ$xO*Xh?NH`lKIJ0kH}=G8Q9vfJ@ZY+LvTFPi+sUL%-e<>N=z zAN?d(>+AJm5#JY(st{$k*E`K$ zM6Es+gDQ^!`9nj=H}4do#%=1hZ=%3BL$by{)JjbQ3y`y5JYX;~SzGjTYue+rw*N9| z02n=Ei;B*oTNK+=&GgbPSHwvQE3E>zYV~p9!*_R2srTymWDnO@)Ln;1-iAKDU)z0y zVKywE7qe7mL%bQr^O^b1VK%Tq+;4TS@u7s^lFSr9nhrsN{o!w)c-+sJU*%rgl55h6 z*P`su`;d;t9@sG{2!^z6KDU_(_{-9ul;_pk{Ppm?ZXfrL0@Hw6))b^`$xfyoy^kqA zj0ILZCgkCo`-^VxB#yLx>^r|IAb0iskOJf0DQG}rBg87$c;j9Z9sQ}c`lS=B=TfdR z^HS$6cH?x)0vehyHs5_a?n4ZV#OYE0m3IBO(7p-*Fs60UWpFYur_0FbRmOXp56*U*P;qY0VeI23wB@=gobAQPalN# zC%$R3aQ$Vm$Yl^Gps))td6OS@XkCJKhuPwDaLe(>iqD5!V=)VBy~&R{W`M7E_n4_y zja(Z=5e^Lg=c{a|a%6zhp2|VwnjYrui&{aBC9$d1-!o%fl^6xJNRvXPmk%38?wJF6 z`QRs5JwKoLbj9>>xPUDy``3@I-hp*D=U#sJ!JZf-d6a6I3nD$?Z+Ki1kVjb*DFWE& zS0une(i;Pw7<|I2{DdxvEaxYg$?FOR1H#>Eai(MP#(T7k{mTIEGsRr+2Thx50?M@3 zK`x z^<$br7dn#^P0MT4&3W=Z!A;mUMn#3p@(x5#5gKtgLZ@>ZG9(;H(zU0j?DcTOXvzOW zox8Z4!o1`tB^Y1;d3Jgj(%8Dj-_0r3%`9w`K=l>&k|*$yU-e_0IdSg`~L+@oXlNi3njq*w_08{l{H4w zt5cigu(t%EP2=ORl{cof*jJU+X4X_W|3hB=Hmi*+HvKlJb;XLx=?6U$!q)&TS{YsG zmKM9WSCDFe)*S|XygE!XV+4#Q2<6rP(57lN>169jTJzozw+`?1q>k@0uTX4BG{TP= z7mPkynQigb(x%$y4OAckd@n8fKSN+k?o>HvNxJ;E1y+Rij#O&isDHK$8ISDsU$Qig zB*3iY{(E-u;EXQ_2cru3dIOIw$WYdZUpJ+mt!L+}0PPUQVnai-r*}X5KLP9o6Z(kh zH+CO0n|);|2+%dWuIYd&UY`~KCCbeZ+Rxrhh1J#|!2C!7wh9Z7wwP_e2=33UGkDm|iNfTvI?1;6vs3b-meFw$TXC`dT;;V8Q_d@&@>i7pw%>Y-MOZ z9jVCPtR`&Z$U8EHncU9mA+o%j-W#UXKvjV4<ru&Wl-%Kea6juiu;% zc_qj@M!&V+to_1#OaFlY0RV6dt0r*2cQkraI_$zDzoZ4*H*CPN{(q4I>}m3i?ZY#x z%Wdw41p)*Bz%48XL0T5eH*hX{vx~B<5o_Ou%8KcDM*COGnIIRcH$!0U;xVS**sPdI zb@NKwyGnxq0RV6bn`tnOat4jg9}qcVuT}Tq`Ga#FQa(P?Z$$o}_Uv{EY!tYCUjD#G zEWa|dPkx@*$WDJCKz{%LTqALh#Z>13-Xr%Sz?Q?>=$7;wG-yzRh&MJk*#-cB)FHJ5 z*hbRdWUb%8ky6WuH#Rug1^|H6A=L#a2w95LvK+`wyG=%uhwdR1008)>#t5+U=tktF z>F8X;o3QlSNd6)DW7^|)b^7Oz9Y~wA1_3s~n+&M0`RaND$A69+)3>&En>Km*6C`PT zhH+yY$*6H7d(=_Cr#22`OxDPJxVjwxY8;6Z;EGV$x)tV+Ly8Ft0k)UgWaQ=5YAf|I zylJCu)JBr>dXLY??*>UDhe@L|1fu|JjgV+o;p%b zVay1j--JZ`a{vI~CW#YZqOcHPZK-E_NowC`LLI}KaDRSA`v8f=I!jrN8nu@?3q}F< zl$r`ykX?i}6DSV}LPndcocz(6ZF)jfyJ3eiEgJU=-jWsg58tmHG-z`%>x)^~OkrqYAVFY$N48B1*ZM zja5X}R(}q!0s#U*jiu%YaPY{yfrIl#_cwW?q6*M2Ww*iL9L*rWT&aO3k0bPx{B?v8 zS^)}!u{}pOHQTt2l*QgCt3ZGNP-Ce%0_-t zb5`>vhoo>h+W9hhQhgy~^cc-H^$T-bHpz(GSbyF{11XP{QdWTg0iecGa|GC4lG@_` z+L*i{qZSgGhN23v&gg=EZTpPDja1i-l8R0h#3dXe;CycHW{^rh7pEd)ef=1zO z>P#pYF}OeeF3raBE^yO#M0WRaE!9;ZKme$*)EogelcYv1C8>$Y8*IKpGMJ$Vu$dq< z8GlwN751Z+>sKHZHq*RmlP?vHXr}q*`hyFlvE2)^G}}BfV92ln(%21eEbl_7J#c~~ zV6mN$sY!lyyyON4{xLN4IUg2Kc|);cc?W zKu05KSj5KaE;5wwGkgyK05ytK5ny5&IBTK(Lv8w!VPF6NQkdmEy%wGx9t7AjpG=|| z0tp@fq&D0MuyCB$hlEh;p+{QPkG>fI05zJN6DnJjd&U0h6%dFV9ilWtgGi~s&?Vi?NJ)1H3PX2yNjFF%%{Sn4 z-|zFi*Y_WM2j+t7%vpQy^;>JNz1RBf6QZUfi-Spq2><|aoVry!BeSK_wa&hhN+S=O6>Kft) zaV@W`t*oppuPh_3#g)aSrKQEi#rfqw^S@UX78d5`=SNpZMwaKt=Xd*77W$U@x|h1z z7uw+qNAP(#e7?DPzIkqLZgzHdW@ct|`e=H3dTMHFWOih7a&lr~VtjmjY;1gVbaZ57 zWO#VEZRWgVy0>fS&(P4&z~Jz}z(9Y0e_QWnUteEuZ*NaePj`2BS65d@M@M^mds|yu zYinyuOA8zhZ*Fd`n?CqCu~|00-!#`$JKoeV{iAxKs&eFK!C*mtf7!QwSmx+iM*nVZ zZ((}xc6xVKdQaM~*0Eo|e*OIUv$3(Ure(hv-W=b164S92-8!GrksQ|+`xPD*_A}JK z(a*PW)wjXNyJ6Mw=V9%S_PV;dnwpyG>guYhs)~w=va+(0l9J-$;)2?ZqM{;L*-Bwy zVR-G=Z{Okh`T4oIxj8vG+1c5VSt~FYEHg7RJv}`&H8mwAB{?}cF)=YAAt63KJ}xdU zHa0doIyy2k^6S^HVPRpRp`jrmA)jl0+teR?sLu1Lf_^Uh^r7&BRrRJ$;h1rGt#z&y zICu9;^3bP<1)Fcy`e}Mv$(jmj6FgDFK|w)*fq?-50e*gdK0ZEBDAe2A+tbtY^XJd* z?(QxwE+2ws>;o3<1Lm!u({Ej-?3}}$oSYmS9F!pA2G+TDc6K&4HdaSG&D3YFwoP})6vn<($dn<(0KFajf#p2g?~SxPoJdGh>+e8xB9?K)d6;u z0VO3RMMXsg1qFF|d0AOm85tRAX=y1bDG3P)adB}mF)>k5Q4tXlVPRn!8rfC=AaO_j zwS=a7+Wsv@+_+iOVPyWVw{N1P`AK0Mm1!}~G{bKCUbpHx3Bphp4g=hx2p4dI#cntH zPbDWy$7;b3Rz_FrCIHK55>I3L(IwlpI%_ak`~n|Ct*~C{yN>!IT7|J#2(o$|PK)wx&$^H5uzrqK)8$L!sgeb2`Lad#+>-5Kwzs*14H-5i^7Lt9N+%gmpox~;P;I^Pc5oV8FoyTe=Yv{{1^PUfd))7KthA#B8*H!C^D_g z=-+Yfdko8^IZb+PHCHbiDSj|p^9wDvgbn_ks@X7h>(!Z>xVITCJS28|FDZdXZ2C^j zaIW;iZ=ZTlQ^w$qj}yx~jqgXiDH@;~yRz!G#YinC$7uNAZWYf1t&bkDgTSg%%Z> zSYgu(P}6ir;WJlclIfaVDWSOlrLTD)+xfzYO!2g>lL4Abs_T16R+A>ZDvJ?rF64_l zS91=6?6GdSpw*zjkSRbEUZt_`-Jb1p(KO7fTP0q5Sw{3b8m#aR8L5*h23LitX!U8% zzg(9AATjD_DistY;08Qye-vl7i9-riLQGR^>HT~J-=`i29rhYZ@9$yn4Jyp3qoQN> zKkO2w9%Ogc%ZJwxm*XwvkUkx#&83WN3~e0o$A8sm5HmI76VgGwuTXbC0!ydV7r< zQ*EWa10(nu$r@8g*$5{UTp^)%*y&ISK3-;&*&099kxbP^v~G$d3(P&0i78j&)ZP9( zVJyi+If4tRZ#>++ig}mOY$dvjmI8Vg13`^)e;0#JrIdgsu_|fPQr%Z_CzS1_3fJz} zW~#qG;e6M>NH+c2hHXtu(^G9r;+VzD-!ryfInZAm!k&0{?s|NK8mN>f@4fIoPq_TVUdT+fGI`6Df_4c}aavxa=HvV^Vf7qQ7+J|_5R`?I|Tl&$Wz zAifYlHS(Sw7l;I~w-{LWGFPXeaXNakzy5ySsx1BM)L75;G)uMi4OeQ(4eV1L2@71CY(P{ARfVx&(TD-g zcCIRGUr@6<#2(NYD@Ol!sh8yr^1;-D86B^l*f(^}B%0m9My2ab&#%qO%rm9VCj%Vq zU)g8;pVf7=GC3Hm(|T!iK6eKdhm_RbdikUrpzveK{An>IHCpYd#0}`Amf3WE3uMtq zUyOX#vZ&e#rpl3LyaSVuQr|K%G!u2>-HdxzP`2?BRPQO1vxY0$Ln=}?qK7L7^jnyJ zV7>(35*v6IlTs-7dBKBvZsHS;zjyWzXEL5|jnEywUw}|A$?6*OblWE07w+1~bGO&B z3C9}zWOuW2z%X>?9@#o?*c-bo(Pv3E<(wG`EwzaviE^CA_27vcUle?CJ zE}C7LU22=*3^4;-O?h4!aacLx`^8{H^$#{&tEM7d72e5p`_a>-vX})_6R2;+Jq!OT z)*a*UQB9}bLD*TRZ-1`NJBN^lXT~+xxeSZd=x2r$6Bri%GgI%Be_T{7?(g)Z8Xmw_ z3JrH}-MbLTzA?{GRm5&U>QOC;kwj$-L z$M>zOnh3q$6pbox=?OEcYjq@ z>%z{D22E1ynLeksV!uu&Lw{4*P>?2ZV_vl?ssXdT9{rhEV z=Lqh|GyRrZ1Aqg#l5H+r3Db_#xw**LSbd-1J(4bemY%JAAU)Jo7(iOxviBMS08DpK zzeh?k5n9YCpg&Xj0CDO}uu}pSx$Gq02rr|p*Z?#}&0k^za&TW;9x*`ahq%entoBt` zJn>dk0rAf`S!yR^;u3#mnFSB7C<5f^>USdj0AT%SIglLkDm>2AJB^M;0dh5cs8cQH zY8yfieeD$m0znglEisM!X`1ude-Nj3@Sv!XlSQ!W4~D1E^SzW5(EzwG8;zO*0W=cd zyDk`+w`RV1>^7NRvdX8JLy-O^d}0*lty-%tw+!-PEUNrb!9cvjRl52vZF+FZbtQ}u zmHroW7!?&zw)Bb;L^W7SWh2zt&Yi~Z2;*h!fh99QTLJ|Zs_~8JYpo01Wt`x)=oihp z_-T9?vv9zYr;-6Y+XkbRj-718$1uYOdtd3Rw1Xq&QX0jCCn)VU*o|UVa2$+Z!nai5 zM1It&pKSBkmtshHw)@&74Nv$v(eVI3eF^|rkU6)vls}d2O3iPMdClYZ@||O-QbN*h zZ@b%xG=Ntqp0+)mZ=u}m0mU=(gg|~D#LgAhhy|QxzAmrM0ee>)0zoWFZS>3qL%vmH zNYQL4-O1>&W+s@263ee{2!}Dy0l#VGQY$G?(IqWo0O$7X=-IXy<#oKz3&sF`G3%mN z`xxctS$93nm=Oc!6%DwpW@BPtJQ{#Ing;M3-@oZXHNBN0Wo`z~Xp*kSbI(j2IhaR| ztKbcn3A&@J>DYBU6aa(^>*9d^c3~KCe0Z9C$>~@qRaGxDBngel>O9w7uBR9O7HcAe zlQJ^E3p7K~z(Z`Tk4#zMUIIw%7)t^euY6=vFb>bkTjz3jTYD@@963O7rgQaN+fE~8 zHTX-fB_JXMh)rommnKwob;FbrmQT;e6e$?W4F942W|SfJ889z6oCuVb#xR~{+(7j3 zXiGJ&qkx{l=QMggyh3LNsVl&Ht$=d1l*Erc#lP~!!1!}1S_kx^ES)kZV(?+VR?nM0 z@Rt4-5;9=Ohy`9@_Bxw~5SDJUY+Wt4^NfU{`ZGClh1aKrUq)Q$zPE18KkmU$z!I$z zirm$mb$GVvch4WYI0P__r}`!!O-4ymXQul%a?hNBDqd>t!>!(&Pssox{+GFq0)B=3 z?#M)PE?&e&uc3OBpK@0!R*48;etu}U_AKZZ2M|^u=72%|k_;#ESjaH!8U@xzufT!6MXS6zBD_jZWoUJCdTS&~k|L%`#Iu2r6_UZw|rsLrfmpeqkUN zUFHTqmtF$l4<@g+@p(c<8Kx{|ULdwMhnzV+$*#Tt&r(kkV2QzZ!)}QrLEec~qp8Fh zR8c|Xh{PQKR|-A3#>W&BPan}5B}CN#1k(H?ID5LiChnw8t`7n|)3v3{v`;DQ)@3rf z!42@chJm16QN^?HyzlHwv@x1YS}=x5)N`yGrb&jx82?%LFbEak5UoqDOKG{!7Opg+ z8T)z;KEq6n#7IAhN>u2IHNA<&FnWZcsVAv*VOt~b`kXmSoEvri#gA7l-2OxkwzkJc z?*e>Adq<^x83F?`ySls8-?i@fY)^|ANr{yD585mbq+)~(tzzxSd)dbm@_|qVB-53V+aNkR2azHdjuU~^}kG6?3pwM3c`-SE@GTu$%59HC? zJL!+*EluVSKf(33Vr$3|NfaN{;IFciNpIFF&AF_vr-+IxTXMDYOino#$Jc|!c18{~?K-*l;?_(+`dDQ7An=Q4!K-eJ+Jysgg3cRz z(_EH=am*Tfi6DH2xIdt3(M^FQc863t!n_qH8w=PB7tIs))N@j8hm6o`g5xY_W7{<- zZRSrqLWaCX&!(+Gwa)|)0@exCB2_E_&UG`mVLxGA$04-~Hl@aq)p7Bdxw=Noor)g+Y5=qgx;9 zgWpCWL5>&`%S7OGWW8!z9CH?2QzQQVz%DT<1%rkBET)tG_NkmJBDo6>&+$IiMp5_4 zuIQ0!+`z=f(DEiqpSV2Gc%8R9KquS&bMr-odd_0xY#GizQcgM)q_LES>_udhsDwvD z82kg|R~!~DV1ehMn>Pm2n@-+|Y?pb5mGgA4Q)bPg6s+Fk31j&qUUVXkcNspLlW6vf zXjb*RCb^z>g9>;B9D`iDoCt~m%b=@Gd|jFflhMLnjS#TixYOcZK#Ny}K#=u-{uP0O^ zi!@D=TMAkUDv-VL@{an>NP=C7qUr4glOeFQNIH}<9V=U(hCr-sTgK-T7l|}|#+`h? zVEd7PX^?(Tk?R$cZrZ)3wn(&I0~<`e-|@A#!7JJLX;f4t!Q|)QAJN-Wee|h4YIudj za-xPIifWQPZ+#^P*xo0r9~_ZI1W6myC0&U`E{K(}M0#~6rQZWReCsfPcP=>?@z!lO zLFRP>YQD^lnAN@-G8^b>+m>y5L^cK%mVMzWDJB!nU%ts}LL>xv$;dIn*)e*xi}@AE z*0gPlFT;4i9@;@1aPG9~`hd`$%L7)f&tjGFefX@oW*!DVq-%Rnm3qq1xD}v3M<%mo z;r*23?Gw}33$Y)VXmVv>yyL%yzXU2!Dqvk>s2PH7a2L0@|3Q_@4gXvs0?D8etpoadJPzB_wt>& zRAnRFl>}!lv&8r-jI0f|dXGcx%7L(_Y53f#(65dH6qmyiWV@$;B9u2U4=miE1e%+Z z%p7Yjr9i_xZ){D;TnN&1uXjJxF6(I;85o-MMP6aqk8!mFlC1y4FpVM>`>7F)g+>D2 zD1$Rbd`c@BT>Fldc_x$`?rcOazyJkson5(n)d!!hzm}V__ z?^@Pfd~?WaXV&8OSfRiDwxxcI7v!qS@o}5KK%fCT2g*!0hLSYVa?nkAz5+K&mWkn= zPFFiM3j`o_=GhWAd~4)NKGBP3v1dhRKLdSb;genjytF8?R*7J#3eSTMVKT2oEiQdVhb-AyI4K?2kR@oYn7y$MAK6f7bL_WbyPEYm79UCkAX`CsgbAvfZ1?%1 z5JQjWTdyqxGYvL!K2(W#$uwr|V#0yzu-sgPLf`jr(EF!Ser2a*pI*DZP-;MR2TpEz zpY`M#x|%^K4$vX2IBh0j%?rl19Pphx)ve!$-%+9445&>cOqndM7^jEr_y3^)S|h@ao}nggmXaY%@f2h$4nfNI#U?T; z@onu|c;Y8pZI0L}pGJJ+c@4cHI(#jWq{kg!JXYsJ=QjQ-fra@c^D-uRwM*9NLkHqbsHBApo{~ilTygutN^n3*gvrcs>tDonhqhYh{{WrF zH!>*ZN&~DYyNEh7KQ&5ha939B2Bg#Spj;%;v!B>%P3q^t>KK_V`~gSL(<>SKN63>-K6wqt(rf5_wR$SDUN+Ya7hnHAqlZfQWvCvU4XgN_xrqE^_$c_odkmu4MdV(?=UjQZTDzfh9VYt4pTK0USmY!*H*6PrU3Pw8QVDc)VOQlxD z-9g4GW5(Ud*L*&9Se%6z{e(;2u}+rh02oFZCbtTdl7U(F@T1nG|KzDvljOC(Py^Yc~Y>1sy`((5xvt-xW5_5^_97TpRH zsqltmv3MKp#?Ot$O5m&vNx6s*@8AUG*bEx58o)_4PGA5*=c%?PO9To>hIjjrV(?p zYZZ%_tBGekWtP^jvHMnr>;dC?cjwrs*T8MyrsN|G%JW48gt5s9CsYB~sH-(a#JB`` z-7-hpyV_*gC6w#~vtCi!r!@(T)vLMjAg`jn{bnC%M1higX;M*vjSWHsI6R|Yk_B$3 z_>UUROHef^^R+$5x^Iemi}?BFp`;lx|51WG83w5kZgaqeCXit;`gK{3e=z#H-JQ(B zD^QZum{rJ=`kvq!h01*fZphO)?$&w8E-2@Uyp6YlM7mqwW%>q1BBn74geN)dQ_~xh z+-ZWv+Kv~JRN)xxOL0+?AbL?R3HcRKwb3@MWdBJ?meaS_I)|qSTw;Ts&nRqs!-pdy z;AEz8cv(#(2hflq!zv%_9?^Y1BPDdA{i&WMcKGIZ;~Tz~hr#z#g;~)h)73RM{8eW| zskTQRqXHvjBtK!6pPNo>rJvUS$##Dbu|C^>JFqVx;C}I)A$Z$w#FWYTCt7yb`_MB` z=ckvPpTBTMeHm4UPRPo8R-gn$@Omdi1r>4oZ_qGqiq~qgC8B^*n4T|46$n;f*N5{% zm$~c5qwGPpVp~qdP171%2<_X}i$qUJqF#u68OLv5yZIaM=x|73$GtD*a{!CGff(^1 zao9?=E~lDEfGaXJO6rxq~H0d)8M`COFCAh9_ES8QK&)k z{gQ_q^K(yR0X4E9f_#ZlH3Ngs^(;YQIZy4oj2^*G%D4wACSKOxDVC2vn}JfGtei%Q z;9v+Lz`H_sjM5B7(Jd+X)q;epvwql6se4&u@Cd`@rK)*HqF#5uH%5XfC>*Q8x)PrOs=D}rm| z+o$&u*RNa<%B{8)Y5j0j9Vvog{1&wiF?G3%eQKCCh$8Tu=d0Pg4Rg$fF^W1`A?Iz& zg#!x^_$jO@=CoE;is0wxar~~U8zv$wywrf;CP`S7YSwce#rr?7XKxmtjpAi+TRw4G zq_7qLCN6icj)gvKaFOezwd%xRC0Tru$@sws8o6dKme9HU@#SP4qh_duw{xD7m0x_& z`m2Cx+)wxFI0z9lK8LM|VdMj!-dodZLoS}?Ny7JhhtR-v4M#qJvDA?70H8ebVIH9Zz}81fT3%)l?*-E|5rUMbxIw4@sHccV{0T#W$0`1hzeRf+3r~ZRrza<9{^v(kh*Tn+06M zk`ZQmP`FX+M-LqltEer)MIMxVThhx;zs+@0Lsk1VND2u67c13Xe=?6TjQPKB?4)}T zWD$z|N9fT^0DyX!jh5hN&0#Z8wQmsn{~&6kHRFy35&b{XTI*e%*nZdu##ra*zxrsd zqyD0*tBC)v7^{{?IsHV)um64LM;R}p%sq8WTf)&lWaA6pmITb;;8nX%bN@p@;9YzX zUx~f5BCY|#i62bVRdh^al{CQqUkxeBdQnCN!gjrD{$ z!Q`^!#bT5ivpM!|N7&vMUtsu@8BfDG%)Sn6x~c&H?Na27&4L=U)wH8+1xs%+2)5Ya-|1fKC(BCm)5m0f=h*=_|_!u|*pm1_n%9 zTKQjl4g+s3y9<&aZ_lwu-go1r4q-i5gkVL`LVOZU&g{ispgJ0(o)1pvY%>sBz9Pw3 zSC;%~#ORO=<<>V#P+{`=@bikxw-2)_wL1E2DlfbVH%gH660>+=cq6dz?hDXR)*$%2 zYDBXy_sOfwVsX=ZdS{v!cz{BHhS}|#YrBP7M9TTr`IW=(TDu}{Y{^eZvF7l}wv#=F zJ&jXK5(~BKnYUv~;K@vRh*(0FFAxYH9s2HwZqkyeVAfY$9|D!XR&_+Obt9O(&lvJVVzl+~mtj@zZ-AT(|4r}Z!- zXT5z|J4)|3_-g}-BO4KHdi5UaT7hD68ENiKYl$Q0MyxTw#{W1yUup!8l0 zxI5e;wx9)m`{78u_f^Z{lPa#&gcLL?RfJ?bG^a=)C|a`Q)xGV7D!)<`+5h=AqyWPkRUn$L*b1pc}VC*okaxsrEJLFV@)>=OF1zrz(G zz>;aBK?nqJN)PVrAzE9C^GB1+ND%6%^7wKWTO}QIHM>^)GGZFUi3b9_GsUzTo;{=H zT1sng1lq`rb_?)Zb_Ppv+p2`pu@3-dlto|xS>%Y)HJS~;p~f(}&IGAeo)_gbvfT5m z49^>+`#iFjk;vdn`xL;ULh#uGn8}C~^L+QnViaA)?4?rntP>G>`@Z<5IvkvaV?;#W z9{>b6NPPIgTuTo3w_`*3>PA5?OQylpgnz^YRlrQTYC(mVgl1R7Hy1AewW;|Edb zNUN}+^e5)*)nn4f0D75?dQXbM^AD}%AnLLV!To!YP|jM0aja=0Bc?{3X0Gr3D+$=j zKn;6Re1mydt}KVqt=qkB=Fi&9yQ40mROL*uU&&HWf#7dykxm3~QjY4g8c!eZWL8Ds zew|O1(3Rcdm2^NuYjLWbOp$z*vi8U`&JG-9GIEE_js-%CBU42W2=gY#qUT@sH**?@ zKMN4Z7){7cmA^XY@NeB2Msuj1^z)W8^DAqIZ(Tx zkNE|~F3-;B8f5!Yo_*yBd%I?*`G%jQBEh}jD5?d^>cLMf1I$+vID#W0s_fqFp{XjD z7mWvEFo%p$j6;GIF+3VI6iyr9(0L6@Cr9kTYFOYI#jFF;t8j-4KNCKTD-?+&2qSpX zIcYX9PY)|;z_k{hcs#6*GxD3dIc&ucHgLK<{b`Y#s}=|ZX(3k;m1{Hd2!_?o{y{D# zq9E`-mMymi4%xGfubo#gbLH3P4}8HEs09?cGcBFyx_f)P;{f+h%K4EXqia4j!7PtI zq$y*s3s0zW7JREAPZp;J(FUclp)d5CKIsn7kX->`=Ll6lJ9#00x?>9TI=(j(vj7!G z2K+rb84|zm+T8U6_!LUA0Rt;9R?E+Yff_Nut8NmhBkWju&a-rA0x0b*#itQl|At;S zkbMirA`?B1W~Jz|AtPL_=)!;%D0Y|_DSmmeU{Mddk@ewC>*+%pn_%WqwQDI_H#P&v z2|7bGCfE3fVe*E52zC(B<$*a_JzBV735~jJVJtK8GPC(+-J^D6wZx!qluE)GXf2~E0J;fl zIOZ6<=cggyN=H>boM<-?>3&7SUe9hj&^J0yVxU{`hLhAP{W5Eqq>jtmlo2fS>E=#! zZ${hp#&F0B*0q*g#V8Ir_m05#_}CbF%tc^CzYrTPm+&6_IY8Ej@ zL~kdEjK~RqG5voQ@~26hK05=&7>ew%bfDhX5jDjj=J#8zkx1OQD_moY8XVxhmft2-VHc8G2GG{~Yr3O_MKQ)G zpz)Oj>zm(o22FFv!$c`hQZNs_IMXM24ElYl$>3GhKPKtIw>@LDA;I;7>JMzU# z9;)|Hy+!L7g`zn&0Jt)k8T?kS(V560+wDya9)cft|5E40W%Lr>i7oMcrkQgN7bL7fF|#jX|X5WJr8t~TFmc7 zkQ8^nX4v_W$qOs$sQh}FJQI!k+BmJ%KU8X3!e#XrzF8LUIaS_$0rFbcO^W(}C@|$W z?tKSZKtil#Km4w!XFo&95;$7Gxfs(&Cw_T8m*0O4*ez0C-tG^Iv<{T1-3bGLF|FF{ z?W~Kx$6EIq@NTI1Tl^i_#5%MpIHYR4e<61H=R9xTL2Nk1y6WSgC1$7@NXAE#ZspS6giir~o)zP0nuMOVuk!Y#S z?nel=Cokhc!tlhA_t_1`{8a~fqg$o4YHBiIo5s;vR^Q5Ye%RtKz;a1ey=R zL=M!lOpfy&(9G93&LU;or=LR&EpO7lBzGe*-;n~qwCT{F{G2XE!HZutI>BE-{qeqk z1x{hK7EDznt!AbsHn?o2_uXYAUu%(gy8CYI)!rD={#-1n zUni?XMkM}H_M!}i8YJ)P$e^Br#L-{S!p=ysUmq?-Um!6miPd3^l)B`cl}yTQgVdGP zTL&csigmosRhly0Q8y?()*sv-y`x_EW9q?s;b9HmHi)yE>*Fb|lO!NdH2ecf~m^KI(E3LhY@NV79}o;<$zah&+1Nynl>>+BlV3;G$!U}GI2%fvCIBPI&} zqMNDFbW44oKOl9ln!NqjVd#EHoC9L&&UqmS}6J1ki09T z8i&FygAgwbVv(R*?Nee>w8L)n99&rHCVsiL${x*cf2%4sQmbG0<+_K-pnpt23$fgC zJFln$<#DrMC?W#MCGTZkL_dq-<)nmI1R@AG4RLX%vw59nF*oQpQH}*3BxH2=0R9h{ z5GTH1s@aPPT%V5#G7P5YnM9w4n%z&>T!|;>Wliu6ellm3^+p1jFz{%WNY|c4iR1N~ z7Ks6K61~j$lsng&A)upt=o1DgMlN(a3c!elc#IMvY1#brXE+Yf1|NPmI=$8xiSLd1 zLLe5vQqf@!?vgwaIhzwdlTF$Jx%)BGqqK(`eMX&^@g$u<5|CplPEQ%u#Uu#=%6n<8 zC?yaEyCp;rj5z}U!NlC(ZKj}euH~rZX@E(Hk8`uoU6(qczMTD7=dyTLWpRuyF)O)= zA2MQBBug$>P-P6B@csZIi3`l<<$W(Nf*SYA1@bMuj6OqAE9ssFh~SvHI!b|c%st;m z0WYIEbNG2@ENgkC_EwzLxP1h$NgVkf@?EJ$U@;X zHuEZL>`tTM#Xd>YjX&N6F5o9dIu>1ZvS~Cj{_TKOw!MK}PTYYU#8&8|?Eqfa1w{gO z*udT-2Mg`{H8%iYN!0AeGX3ytpZc>Rg_vjGY319}FxcrWT@o;JB97t(*hxLQCSA4Z zw{0IXV#|p63R%MMZZti2Nwjl#IND`Fi#1f!&S621v%r@TgCF>*LoECx_b7le zskKfSw|q4;>!h*3oiZFnf>ec3u%#5;2V>MDl#i75Fu)kKm1)C=Z06^$^oBm61%44@ z;60=UxKn%+HTUX6(2X1Yv^%LhmZ4u3#lJOE+U=lAY7ZF^1W9F|gcF7!gM9E@6<+wS zGYLluFs_Y;pMyGwb#0@E3ok?gKpLJb%(eM0ov5={xmJjSHdGf+#Wi^tJ>pWY=!T~+ zuJf<_PH_Q+sMSX{jz;7OIGBl&*ui(ZOJ+>1sTM2Y$y`fTB%<4N&7?kgUvv8l}yl?QH!hevUQE02i2Uuh8_WL!H5Hu<^=r!A)jXv$C1bl2M5)A-R;ON*$* z?EIi4WB|*O{r0{;fT_WAHV63DhJQ~zL1d0BD(YwHym^=Ah88d!C0BhQ02r2o|# zjJ1AT3FMc43PbvDGOQh66dr@xNErhB&#lbEyeZTP0{>5uOxHdRe}k6gt3gnp*XM*;TQRzr)1HrUY|L-XQOT0IUPOH1t2pZ^y}Q_w`^pF0@z~( z6#b&O3>ENI>5b9u?=xiD&k$7(9dq;njPkoeow7Gr0PBhGZzx%Z_jyJ!$mB->=YtRF zxie_5nXG1a90~gAY-hX`Q^^f!vXBwIrb{7xh6z!DMjrrHR+iuI@Y#-UJ*8>08vp*r z?^BIUP9wlT5v2whCgFT(i753-L7qTSbckQrwWv6Y2MHR1sxU zT3)m)kS+A2S?BaG8i@OAK9xs~v0wEdz~I#W1-f$JnvM5AEs*sl z>zYuAV$CVBmfkT^dl?trcWpP(fvmvA5b)(#YImkB*VLN1LLE30m-CGIS)~?B3*FY5 zlPbBsB0lM9`AHJ)V?$C))=88Li7S!m5mDA8hUinjlU%rb)HTg$Gqdda)l>Bz+xQWs zY6rsNS72~QP8a!O^;$#z)BHx>Bi5GP7KAJY=%`h>S)<>3Cv|x2X+4>DB^etlU#@3g zjnpWH46xP2sWDdyx>$T{)H_7kIu`KO{`xo;4l*$lw+C(neSmd|_caY4dR?<_wgQc( z;##^{hIaR^K<-UUM=69^g*HrmT=dFbaFPutsS!bUixvI=)Twp1reaV^FhzduTzSOS zpQhx^6;_X4vwE$bJ}nc)je6bymv-p;?&4=7gsNtfFBQLQLSuPmk1Ql*hkI5tejvC8 zDM$uQ>Lgjn81y){FYKn1+;-UIV}%E^*KKaD64sHT@&3h^w+wIClXaP4>Oehb#(;k8 zr0EBbJ3^ZgmVWP^<3zcDU9j`5FQ zk#6xjI&~};4VQuIt(x4AS`!Y=I&bEdzOZVu$TF60#r*JBh*qt@!npEe`1s%&q!Eu( zOo%?8voSWOAzX~GhjDCRFD_I;T8>#b;F|)9$t!cKcSOMo8~7}Q!3%)A0ROFaF4%)R z41IhoqE6B3>Gi8PuPbON(|*qVX8mo!&`NRHRxvS-P<7|G{YqHpPo>lZQpNbV{y*Fv zwJyw~b@_8flkN8VpZre)zG=YyBeG(IQF(E+ z@u?rh4S#n;C0dPfzXJ)#<5_GaO2@CzLp7-LY#6sOm!EMy|DSeN|Fwh4MB-|pyo8!+ z0p_0Dc#AbVlnF28&6O02Hx8e$n>v?}*n+8Ud?5qwC_dH4WXHJ+V|?$;Ofwq-IHRx6ybLGP+qaH%NLsIHid zV^K|r>=~57G5T^n-kNos?;}tqp1T%mx#(bPRVA6i|Ig4*9_{?nw1_nWZ=82#&!wX; z7m>cyVig#qV3emiHovn>nPkh?Jo1!u`%NsZK#HQPl+wZTj`x$s9IDErHo!+^%x_!| zzR3$^$F2EAa5Jj+y3*EYe)sn_B~l5>kb$PDF9Z~?;4eD7C|=-FQK(F z?XCKU<~InAypt=+-dD}}c#qUB{KV3~y9r;&SB1(A{85LQk*T>qTp> zQ3|lEc~1f>lBZJlSgaQ$@ zgddmTAK?qy@#iwT)yfuinrk~{S+|lqfq~ch(#YT4^vvG+etyNq2yVMIdY=0wtN!4N}j93w~#p>*YN)d zlz%Hmibo^*Dp5{NaD;QK=Z2rKlLvg`KaQW?9>RLfWR5^S8C1E9Z`Y6U0PW|ze+xon zc>W88Kr8bKYSlgk>8Z;k)z;jAkGZyIo7*v!$ciX?IZ&~-f3x8)cGu%{$lQ`ZqcU51 zGn&g$o&VB;+3;*&(#_uqYg@sXuETaP<~mcx8*y?#!9<)S)*jE0-Ff z68i3IR@s}q?RYK)(mdPthFm7Ye2(?(p@VSqN@$e7dQ%c=PLXHB|JWe;-$o5ZuF2?k zDdw^8@0sGaed=jS(x0=Dyl7Plz}Sf>Ut|!(HVa-G6zH=$iyZk7^0Oa9wTQ&92v^_W zh6RW37gNR}^?8>Tl7M=^j@DRK7`EdR)V~|E=NOd3?%?^3v!rVoc)A z@*Vg%W9p0^=!UlX-8pdq36f$2Oboicl~Kv}_@cf~sQzMiKHzeK&TG>>x%osQ#SVGE zI!;_zcto8sKuIy#ig}H$%J2fw)wADX?d*hja?GChnO9Z#f(ZBg+u!jhj9Dyn>15I} zYgo@kXttnC#Lgn#$l{~X>%jG-N5KhGFCMcT6#{1BZkX?v$4L10p?%K(V?g(D)aC!! z=Ig&^uQN{GE zObq%8FX4q$N4C1dv zSS&F02V$QNLF_|kk)O0z6upkjaz-rgk756T2!1f&BTe|w$^*~%xTZx!qX0gvNJhZP?}lZ@bZJPSWaVrb#J7If!@^*Q zN|aWK&^9viV;)ut^n_*r5y_blR-Ozy;Jfrjt69?h&xbTh7OFQ4_V3>TJQFc|I3M76 zG|LJ%t@nH>^tb_g>s`&lj4$MIT<^1z+lZwmgcqEDc;6{z*tKY)j93Kv}yMqZ8_FUNH9t;1pB0 zmG0FS7JfAJB_XF9jk<|7 zSFvaiYy{&uzPz#AmH?88L}+LE{TOLusHy!^7pow3QC# zqgCFiC?t(JsK-l*HyzjP!x?bDD9?R1iy!C#)xt?ag9Oe;@RW5a7&2-t%nX|dcZxnf zKv9pM!!n9oioE>v+eW#oQi%Q>WsMSae}b5fHxC?SdU9xtIL7c2s2y!8C^MIL%MWAX&#bEOIC@RIldg?Wvk)j>7O1CBf^oFUn%MS@N)Gv z8P7JaHp6X2Pt(DV89h1O{2U*ooL}(&@!4*P&|m1Wr+m=M z^mkkv-;LM%#?DqOMn1vy{r)HfsZdcyh~mKGNA2Eg$|Gv4JE&LEP}833=nO`CLJk1b z(kcu78Bhv6Af}>c4HYcu$Dd77JcBaY0S)FM<`&AZTzN=Ddne8S)BNA(UfVCx2@Hj7 zAKps)$!w_|K*uNA@k`G~H#X}%p1(XJOc0;kZLu;g31%hBJU@ygm&oETlJ8^N)q~BR2VR3dm97Z5NNtxG$2-|%4Yae^jmYkE%j%d9C z8Icq=Z5y*4^QR~tpL(TW zR|O~c=+e>|eDWx9SQ{xYCDLcfvySimI@p#GHeh6sbiuKYO!8aqU1ec(k2s}vVfki9 z32q|^nUTb|NXousAJ26MantU*U={n)6u;i{eGX+BkTO9EaoRaz^}g5-8KjDJi~I9 zV}~i;<}Bm?hq$-wigW3L3jaJN8k0tAN+PH+hB z-nct7PiNm}-{*|+{(zScFh-GOU#`V^YO=aL%x zsh8T-jW8H1hCBnI*6l`wtYmoEW(=BQoss*k7Vz2sN+@)-LauaKs0|enYMxPrRb5ql zXH;&|K6yHIxyt!ozX=JoMlT&{s@F=fdI)rA!-vvm3{*`d>nvi6=T{JJN0QG;TGLVEJ#C&u8xm`w2wD15j#$c(ODJjQb4~eP z>Q$o$7PQd%J%lX`S1(^ZZ*T7lWNPuTDK7HSiJ)T&lT;Ph(GPL(*YIt|Z(~JhhsV?d z7@x+whl8E5KGka?&WX|?rByyY(_kP%z0kYXXB%>Nhn~IZB)~sz?X)>Zc}Nh^iu`4( zlL5B;gk>YV1ZLFRc=;;Wi}d=#MO^Wj0ws?%f-(}m>YYJP$e&k#1wV|WBIyyEwA)P- zOrE+A07S>!*;`i=&KPcM6`Qb=)==osNhywt8Z%f`~8n;X}iO8?{6>< zaqzeBNA$xiVbJW0(oy@K;o2idAh@eZM*sgV?^*7VgV;5b~gF|HN zLL?00R8C25_Dn7o{>?H`?|-NTMd5r&c_cFzWE8*X=KG$}reFypmR~@vDU|jVB>z^e zA@{>k-!(meW_;mZ}2m8>x)z)9LVRdgnuX+Vpu*hYd`F4CCm8 z^9kkLJ57F9gu3MB=Q$@WP0GwcbBwzI^MIyG1q@MR zM3(Ir*MPZtmUrv$&{-{r?Lo{v!pwXr{nQZ!xXAJ0d0DZBgq$a2FFMhu%-TjzPx}}p zuNrKVu5c@^73@EkfkS>{e-j&o9gSvSd`e^H_*By-{}(-Jp?Pl%kGt z@T9<%b)NySe0vuVJ~GcW1eS6;2L0rm5HTbxlh-xeHKSKP$MVR7Bj4F%eDC-M$$|GT2dzPIFKq4=U&;gL zwJK_*Lh*B?tc2dM|Fk-~ObkSYhkHAT&wO$$x6bnfIa15R^= z{)d|$oJnZ4Oyu)@&4}Yu|LhgxSb-1P=|8u~e_MTsn%X$amBKsv&t9&U*K^5Y+ZJ`` zQA3NOXdyzbx+~Ui3AZAA2Y3s7(9K5L^8W6TKhKxf4ZFDf=hL6ntyhDKLgX3Qa}m$v zDKX*L@XhX;=EjW{RwKL8H$N_UeGd%eefH4ffqPwliJ@^elFkCM?~t+CEir1ne{9zJ z{o{?~re!2hY)Ze>m3QEZfrS6`*(eI`62hHbfjqBtof&az9NIVh_!eR2 zS9850VPSpOT>Y|AnwB0)!48fqBJjHP097nN{^_@RmEH`r1cVt9jE*m6toz~q7!ZJi zQb7@}Ns?iF_d&66Y6M>i9_WJyoapjv8ECMJ^!}+!&&OIZv8{9mM{+c*JCT=}sef&8 zhBKYMUFkqRehDNs$mZN!hdUepzy7361`VbL&Se${Qoe*$wzt)H{0Q2MDn2SiXV>Sh zOn>)0PcYSF+GsI|;C2N2XcJit7a(im$1-lceiK-?vCvQ$9`p#KIfvyJu5t}(%*uVQ z8k>GUtAnakWo&7q(&Z)d;QcPb%bYx0T9}+x1#}>|m5U`5rA` ze>wN=-37LFzZb?c95Ua#3GXm^*?%o=ppJ65%aFnA_7EC@c9u09^%nm6Kzt_G@PR1X z$eo}j!d}%tToRS8#x2(6_*ByK?`qd)V?8tOdZfG8;zAQWN2J)$(>7oOsOJQ`A^3V> zc4{Fhs4-mU(bsDMo49R%ANwnTuUpDQFfQEkgvR7q|N)Myy z3y;wx3}=wEBv1v$N)f>)sb^uWbYwv0jR3UaTodEkxQc^RoK!!>PaiHca5W6BsahYU zE=ZrC9ClX6-mSjzi!XqoPd+|%w4dT|c-a|z2>Hba0D=gcjHiK|&bfr#&=Bn_NaFk1 zlzOInA!%6=*xgvMfR zUp1Qd<3q*m`M8*_a)8#df$@XO)HmE(%2-Djq(0m9*~6Zyw{GlMq}~G!^_AsE#PQ5} z*N2{(Fy`ajragZs^T9~BOQiZhOqy-oLgUF)c*Q|CwI+h@Bc4kW$PiWOf)x*cVo9U< z>9P9;Uq5#B08{>@yilJc=@1*D#L8)DTT4fx8LZ|jB5uP^wVo!&Uxjk>B~p$|xNkxL zuM>ovbv+@7YW$xb9*L8OE7QV?rEGf03vw@;DOK9B_EKReCQZ_v@h@_SQTPXJbZcw& zO|8=lRly0N7xBq}@9VUcXVrsg7jNj*jc+OSfKS8wd`ohDLs5>n3j9gP>t z={_paKht`sWKb9^#Gr5QPZnQZjZYTWhhVeWGCALJG9Yxs?4C}Br;yr+i8(+)R!(aK z!zMo{OJoq|Oy+M2_j^c37NEFs?1|<-Z6nud1jP=!JBSg}A|d#8)f@Ie^rmJ*s$Esd zzy*NuJ-IzdOzxr@1tya-6O$yeK)gH{7J#W@HvbO$GBPXxY4PPwxzy~RUzV{OlxD4l z`7HLV;_R6M#;>%db5(YV4GYtlm%hSyk|+a^sKRpZ$jZZ=e{5 zoM#k{y9NMg*hs@LykGN1W{xNDgM&|+YEz(tUVi%Sx!NP_fU7pI<5A=I;NcvH1iBoF zqVZRN8fYvM|fI2UC~Exw}(G97BW@>mNK4H)YtP9!NT<(y-@^u zVAIXiY6TO%qj-?QAAGwmSwwlhk`FG7;`?uZlw4;Zm2HHgd<#?w_o#l`qhH=YMk3qX zqWMj<)hFbi_UHzGhy9EpYEUuT7k`&0y7cx9yS}@pEfr6Yzg-Cq2ZVqZ^8sdn$g|AA zdKR^igZ_@<`gTDXT!g8-Ltds6twG)#bgWJ)M>V=o{9_ySIc)X$*5%W+VaM1fiTGg# z>uDbm?d4l2<1066=5a>nT+);eksjQKSnL&Vi?C0Dhu^{}A&h>P;qS%x@InhoM-sAP zt--h)K~&kmKEgcev7hQC19k+Bm&|wHZ1u}$YEpu3&*o7wIPQo(%3Qy}`cBd=2BJX9 zVSJQp^Z5dt{H!&-vR8kkblK>2u`|NJz>vxBviLg#GW84m(-m&O0vLP+OjI{x&xT6G z7oQtzEK)JxnFr0?Id1)4c`IC925M{3r1;Um02f%|FcK zpI9CGkn>?g6-Ieb*UWkOBsFojEjEoU#>rhpKr6*3r+{s~wSo7e6Jk7y7?6co!i&!}K7MydDPG&;xX?E?jL4!7@Ww|-={#o7^eeEx#A0?Ybg@MC#R8R3kI=dIkB=rK?n-6% ztHG5k({L$8Beceg+^N#w8bI~r@Ik)4@Vs%x-Y|qcovYepd2dM#01hp;UC$9MSJu&g z_(B>_AF(;o`C$M~9lbX^hD}dSuFL?j{Dql2hn^kPxxCKW0v}8YT%z7ST{0Y9yKoLS zz$ArZ7V2yh2Ft8vC{9<`hWxxchv3cT#Gd9aGEpD9j%exk(0RIVK?!~wD*V!S_KF@L z&)Vld>sK}WBg6nXy1a@xt3NZD#xvB^tz>hjGWj_T*myW+VRA!69U3O{Hg3KsAI#bE z@m)gk+qdP?Ok0g)IAtHS^*hk=lP^aMLiy}|ntmQnzO(o>gzFw-dOv!6?v@f@95Wu& zvhJ3S@H^up0W|efE_`AGsGqoJTCL@GgeGYtxAz}13z7johY+m#b5n)E z84APO*fm_!4`=qO(qQ1u6;(K5az?&g&2i=Xh|P=~2rf`f3D}GPmNE5mRG5642E3=zm!( zK?W3w_4(VMYnFS_bqKF3z^mig3 z#|7_g=wfr+)$bB(RKYH0&&HI@q=*9KogM60Z{JCD<`Kc_i96w%L?(C*po*o~NYt7W zr_k#OJ?ESHIK$o}O$5Lsm1TRt-s!q!lMt0)n-EbQO5=;c_f_(*A%W1fu^AHT(L+zn zwe+Nxh5#B~!&%f7+H(!@4uG7~+$pAHr(<4B4Gjbdu6+97y8hy84R5Urbtm4P}Q z4Bm3E3YSxrrB4WUUBE&~khaqUNR!>%HR zgK($;O)nbv@6y8vHwd8wp+Q|-ruel&ACR)8$^g|#9TI`LX*9qry`N@xNpznP93E_NXULEr<| zauaEAsv2I924d4Q`~CKsZ3?J}!>n?j(TlD*SFMy}8TH#@?Ci}7c%qqygkrMUT8o*tuU$#>MTdoK#snbDdQn4!bnW99AXzRZR zKjT45xG4rgA=-N261|VFR;EqPzIl&Xq36;ytH1 zXHOoYJb7~dcs+Ipe)p2q5$)eH^m^cMC5&K6vYt9=Fj0?2BJjA-FjhDwD7h!^{t1J9 zgXzEa!37=%MY^V;yPl=Lwq0WM zR$>p2aN4xGS~>b%`qq1&9MN3)2@_<&D06nza~@ohg>IyJu$N9>M^j%z+S<49RxDsV zzr8}=n*LOtM2~+b>r;({amtxIFX&fb&T@A;ss`PFWlDn^Z*u8DusF);K-E zYmkq$Lf`x^Vt+SA%y7<;A~BX#KnZZE`3wa0$weE<6eQp{RY?N7czU#>PF*S9nuOl~ zJ%|KRUmWEt8^1SBZ|p9Vh+_5z7)AEUXOJ58BkJjqcBr1{N4Wb1h=;kBQ+A@Yov!@~ zX^M?_4x-EjxM2x2CsPkca6p#NUzO8}yYC^5W}J`ZoeTSp@k5ymL#TCe3@XrF@nIPW zR^M46c+msO>FpsnLb1We>BOL6Lj}^`MQkpXmnKl=n&)gq3rOv`$iZ*CXz!EmEZFw7 z^?A#Q{SWJ}0COC8ZWpj|Uk1_ljI7Ix7P2&%T)x^fKMF$#|FRhs?09p$YSG<3dHWw{q zS`bkP^IHfbRgcr8wQuW{EYKZA0##qKaV`*S1L}G4cI>c#XzjNW)aV`WDKeG@!J4(- zTkJay-(KX$f^UtUCegf(KvOW?SJTI^xzw2WHiC8{Yf7^c1W(T<=*S!T9=8e1qd+U| zuYfm09B>~L0KN=2yt-9cQ@lPN9rGEbjFSR$jTQwXnNNzMy*t$Xcq2;QDX6PX^BpwI z6oQjW8Z3z`DaHa4F^qJc;&n6Kx-oMpSVS#JPTkr59k7M=u6h5)?9~a`y^Yr&6RiF4 zu07r~N%;1nh1sP2g$p7RKvXqve7|>JXLl_70LuER?Q?#ZNEA$m`nnLYDOQ>I&nnTX zB$#60YZ8x_k_=c%-jyguEPq$%dq@WG+Nddp^A9RcXC?W)$^?O@#|g6E7jodWRUs*p zY;^O(_9yFw_EV%ZQ=Ok#1ky}!O>^kAPVP5gYLh>4cAOgoxFLUZ{cFU+$C?( zrA_G55=QY4(2<-Ng%lCrchFK1n@|qD_X3*)<1Bt?1q+h#qIgyMVjAjl{O;{ zzDz;0J&U`~?r{k+iAx$c-L?1bA)=l+SCFYk*;1H%g$e>t_UN75Q;4`G3KgHUWTGw` zi;_OKw+p2%@#LLTFL;tA)3__8DfNG$>a-dL^pnX-L)u;;Vb)c8nQYc<^^IB$y?ewi4YH6922vnHAIn zf_>+eJ8ZhQZF@T6_GDZ;T2G)LLA(_rGz zh+u2wj}>g}bKHKMC+JYAMM12va@BC?EbgsgglH^h0vX0901y)5%1YU64LK^nwHm*m zzY>q6Za4ayWX&X$mH+$7V7_FF@?!hb zjZQ(P)Rifo5_rxsbc+hWdq%Yw1X#zN~uQbUxOu@)+Xiyvh(bJS}d6Nu}e~ zh|eH~{E8(YAiFA7AoEpPwRGqS}8?>cxEajrc-xYC(O@zOrgALfu!A5!L>ux z9b(-3Gm-Bj(dyUW#ez(JdpB+HUFrFCF+vO5<8ON^fcdHQk>=|40b&zu76dwcGFk!=0Ohe!mrR6gZFp zkPmj$?rkDg%k{HgMqQE3%}S4H-;Pu5YxI5jpMPt-bF=3%tJnoad%uJX!w+O|7dRJR z%gC{FF9n_tLk3Y$08EjAD^YuT^Cs_5Odepl zcK!XA?SgKajrcbS*nCNI;CV6ltJdy^L*ElW=J>hsi|xo?UM%N ztF|evSOr`#I+aacy$OE{9E@2912!!mFF7Vu z%*JyA;Vl&a174Hkm_6EMKsGfy8+rd$2Lbg}H#|2s?r+Kec?Q`3x5aRT#Z?>(hVx(? zTme8E0cvpw_kUkOy+#aQA;}L>Yu?X(*DOi-`c*kw$o$h&#`3yW+zszvI~gYY?)ovKX7+i5UFPy;<@HETK8M)?V&9NS zWIp_%wvt>1{w)1gL2s5Z1P~&5H{3uW$$-|$h06EWxcYk2{yzkhqpP%L(UhY<$Zy_= z2I3J5pQh`U5+;$Dy$qhwdVG^2R*nw%_tDP)`{|h*|5}|@L``ka?L9S}VXY~Ru~N8v zoqosk!q3VIBxQpxMg=oT;L6Zg286>3R#yi4*VJhk@pIr^G$n22HG17zrFGsDf`ZP< z%tCZWOUyN0l>kIg7!1@O2X=r(`>l|CskYl=+&b+}P^JIJ9^!Yzu zy*aHD*vmC4RV2efL=_18JA_^XU#h3+_-P!py0f-7Fb^Y2J%&9m{^qD183v;vrDf!5 z7h}Tx!2g&5P9A=x-}~-!)kWuf_UBrz>16+~JC{rav|eyaLVPGld3vm%yc{Zz`fqg@ zK`|`oDGFZGL{aNvI;{S>Gq6JB4`IZw(170#Z6`2ao_{%jOSAqn+8{)0h(^Vh5uo=L z4ue{OG={|m2GP}Ph-1Hle*jmboe`Pv%{Ih_+GgLe{Bd+3a6$|La1b}x;RL+qFV$xy zD0Kti}h zL*t98m?eqMzupi{l($$=nE2~URm}yrcPaTgaY|DBQPC|3v=OEXg#1xJ7_XkdNXZZR zy%^MK#4U7%C{%IxbyiqX?I-lpPJc1s-!3x(szxkp(67yG{3(^>yDS*1G0DeVBbL!a zzg-bUPMge?fm2mI>!JXlttp~xbtL9x$z38YleQQ?+Ff3Qa>oYJY#SH29wPsUZNWC<{g4fkWVlm{l#4lS?H`JRW0r|mo~P99d)Fw`Rl4jFi6 z@@h7^I=pt8krMj#!X!<^Eip*lGpxZfyaPz?4?HOoC>!82Mz?!Wws5Y<=!{ppljP=DkIux2WX3q&6?oFf(u`Ch73!H7_VDz>vG|Rg0n|ziZC42el1i z3Wgs6N}0wTc^y$c-PV#^`xQ7C7?h3fY< z3qSf^!!Os&E+~{b;?ROetm-A-gBgy{<0aZGeBEGDL?G!a8^zcAiB4p4?^%S>H?0+W zosja2SGbD4I-pB|^bQNnr?belt=Lq6x!jnplTYnHi$3i07O9$dU2KdBw?7ayDZb?3qQcRD5?qWNa!L z9Hj0_Zi87y%~g0B<#s>9ow`SK=TfMC?vo>ZAr40Vwy(lnUiGe0sgXUumea6na7jyr zCY!~k^PT1z+B?I2QCf&oM)JQ>g6bv<%9@ayVNefg`C`>k2%K!raqr3@IUo7->Wmr|;8-fyL}Bt7u% z&B{5o=IFv z)9vMmj{&-*r-^Li0Vzun+h=2)I!3iu85;FS6~_E^9P@I_O1?B@sOd;}_6P?E?9THq z59}CiZ5QAf6iDPe^zOC6Iz;PlpUllZXJ`-dx%Q#Du2_ev_Hsb*<~)abQaKAP3GCkJ zcjy2YUp*7DPU4$`K1k6Oa7%+-R_8*lSJO*S<6q*dm6I9wgO*foh^Lzy(X`{%kiH!t z7;%KxxvzfL6w4nfVMdXrgIyybO(tztr0Z zs`M&IE~YR0fnvTEaG0$yPRw;iI1O;VE({c)++=2SBwso4ZTF z5EFL^wl@#a+DVB8j2?EaM&-B)yLrauf{GAyKA1UhSqF08-QI|Kz4}`J*C`0$0M6jI zB!7(`ZSHGPq_SssZv`kRHo=?cFS82LQAF?RDMeCuGJ6g5#yg%pP@c-z{>s{+1|5B% zEzkWdg^@h$I{_VGUHIF=>*YVuxBVRemLb<1AJXil@bS!Z^m#@-^3Ogl*e`os#%<3@ zWxzjJdOeiE{kkWzC^N@=*TA5#l`fcM>Me+#rGT;1=<)L~&{Nm%p_jI8Lzi?^%_=iw z0UjKjb7=sLT44`uipfOb1P^i(t>t=~zrBB6DdFnu?Ru~yvVJ((+yCBb_4C;@vp;DA z?&Ex274lcNTas#8{e!P*k8DL925{53S&18InXZdsdP7JVcWe>;GLJ@_ zy(B7ivOHeI$oq&BI(1{0(4Jh;LvpO0FOS+{`6 z)bo{GD0&t)8cE~k@$C4Aqq=_00Fxj#QB~si;zDV4!B4m?v7graLDP2EL784d7D`16=_`xecB9Y>B@&uFzeY#H&#y8hw)J3E@@;_ z0Ul>tGm``N7L^P$DQ7XG)*WU_>L@>g4plcM6$azr**`6D-HF7YEMwi%gc3dQ0H1}znH87)0%=~hj49t;7ZGIDK!W` z9Fy!PT431oHGvmML^-TTE+2kJ1g9K}!9?Dt55hEmrcP293rYqnw%wpFbiqs$ z=5AaqSta`PRqP}D*T5f)rz+>yKgh|lvy7!>-K4o~Y0@(S)zg#dyanh?1>EC!YdDZ4 z^saAUtC8n0Y`+JTlsl*X1Nk9eVHmqAbdbe9?yo~849bdpEuIBPd2Doxry&6K^gW%h z2Yw>Z1lJj$PscFU;hQNmX>hSaz!gO3>gZj|lM1gizNu`9FNnP>iU4JZ zZj48;UZs*~O~N{=4l38V1IM)jaD^mN#$=fKYtB{!tt?*n)xBiO--eDVG4(}mxN5C` z;ecQV3tP@seczyx@4Ik+-lvc1)rzAUy=`v~`Tlq2{fYzFT2ibd;w)A;lYh&j zhhM5QTV!+jNe`5D^g4UO;=0b&g0232xTc`#jX>L5g}4~37cxX}RvIW8-Odzzr`T`o zSz>tUMUQb3kHK|an5)M{?L(^EL9bw5PxMUDgtgoPhiqf%GjF7P+-2M-X9(oLB@2{`@*`~HP4VfL!ku5 z>k)h0Q|lypZd2+G9f%*O!rsu#`=^5f!3zOG#1K-7+ zWI|deRlaDmUVt4gTOsOcjEL$v#u38hF3QkEf_3?flOEF-`do7mdqK8m^f+!D;4C#| zJ@s*MALq3VH^mHb-u@w65}&iuJb`!lL`U-hbHKRMxjT|E({j9}djN$5 zR33@;raqDeg1vpyYXD4iTNP{L3ciJ6U&k^1bIjoYdgBg!Xx?D&E=qvYTnXQQx%YhS zY=IhoJN63jvYk!!`(V;5Jf!@GB7r{dEfS%m7aX=Yd2;Yosm6ZHm51fL|M;J4Gwm zc+Hy5w#Kdy-V-DNBA;6b@H`o(4u3oTlaV)mZrebx-=U|mqyeXERilkCYV{g|Y<>U& z#ztN*<7cvcL4V~N62(d@p4eC^7p+H}mLDJtcasz`oAiK&tEmH{q%#f%hs=2f z!z7UeHW>ZsG#na5`cLUe!Xr5#t3x5wtX7Acjd*V-=_CI#0@fh7X1e~}gvP}s#GD@^ z(hAsGsiFuQBERRprC|A-)M8sug_th$%}^}Oniy%Nj3AE&B5$d)idl+Fy=#kGfi!TZ z-@Apr%TA*dEJ}_#P6yw`?0_BKC{MgSj#F7tndi%9=qEUudq_>L)H-s<8R(&Z77OA1 z*xL&a`BHimt?e{pO@PQhu?{|&@R{GizlS}66k4F@X>jcO0aIJ6;PVdXL$s`Hm0JEz ztLlv^JUA4%dm*1+fG+g;9lmhl$qxFfaP(JllxvJ-i*NJ0U7k;a;9f}hm$$dwF1^on zqQ*#e#8zp`NVE4DedUa_%P`~EZltEc;Zl2peUeS)0gPC;$neFzNwy>62yRFO;EHo9 zM(Ol8Oj{Dku8AsU8-7YrrggL@cKe=TNuACPd99~zUZ)bC*t%W2Xr7!Ol^_dDbW)}9 zq*&Iv`~~+VU>TaxyJM!FMUJo!iOj}g7plGSt(h}<4HF=C+t_ggI|{tGZwA{#XF5N!&S3K4nw1Rk7Si*JGt^>A6Dax*Wk3Sy_)|#&F({^% z9Qr=c^6ntrC&YgGaEW^WDzc=ea#EXReAQSh5D<3uQ=MLOa*6NrBHDn2VH7_)&xOpB zQ{xulX@Cx}Z%NytxJj(sw=C!_y%M0@jL2*UwPtNJTUfwU%I7#MH8md1olNB?p>9F@ zKBoGY>=zD*zDSMEU(5$DIr>SqK+kBNavf-U7OdjW_ls7@E8Lz3m^{0F)C(7+q&Fkm zOVOQ<(zyu%+Oe(DhysULt*$pbD>8qMYQnN*p;~fp;*6HaJCxm<`6nuKHi9gS;A48- zH>f4u2b5i+G1UBV;PjN#Q*k~N?N!&0OsJ&oh%Ff?#^^ydqxboS?rQ3~i4oKS2a?t> z;urO{G9;ZY-AJSP6iF5!AH3}hA!x{H8@bvthLChR2(Cl-WmKEh1c&FHeO-%U^`|7H zIXB0>AMTzZmGPZcM>)a*>Ic!floCEBguQe=&bkGn8#T-PxC@Jh_yNIgM8@&*1-g95 z96@AAx+?+|vad9TMPo;|V}+Y;$lPtyw4vu`oBe9<>MHw811eG(al}$gWP;BcTCE}q zyE6=%ZkzE?ysLxXFSlGBJXzs{x*ohbnl@~5br#GvPV$IcexR=Q*;VzJ@EW;^{k77W z_m-i@^m4LmaY0yi=+QJA(EDB4fARUz@G-wp1av+T^K7{-jPQ4L8a_sKV$+>m0hGOu zT*iO5s6~I{7sS;^Cjqrg;N@6DL{L5(D=Xkw8^)y$SJjA{F9TgFl?=R=n0eVhaAPB( zJAl6@Y6T?I9ubaozVDqDXcQ5IAF|kYH8(j6et&*)F}=a=Fx08Bf9Jd+ z#8yg$4|Gd9#V9BCgZ}DbX@LmO_3QYh)tW8~cKPCND#jfVHQ`H`MS2?DL-8T|)ZVdW zh)k^~MNs31kupEu?b5~w#S6mt>}}_$;Q)2w@XqJy?tPh_CqmBPy2tESHn=MtS)-D} z^KvfnolwXxg!hBT?mBhcUtp!tn)&;9mgs6lt!3-ur#Rk_m5%R%EPP z1ewzMb!9QIu@?C>u2eD-DeZPF>dZ{JMM4thM)5C#c?&AS6gyBQjyZ)@o@F_3 zv-W8qY5iyV*LROMG3KUcC~0N6GP=6I7T59q1#VyAQddssBnL_A7Mf(JL=>ave2rKh zhDX<~SJ|=xd#TJEf@VT(+Te2!PH+7O0{*28u2;>}y{|HA@6nLa?O?V-aEBw|Vp;cR zkEv$h@3;Ee3&H<3B@KPNY)0)3ce)Ytu}1ZPeU9qKOt<@+9C&K)i&M&=6#abGBQbaj z$p4uDNOlGXCEg543d&_7D?w#4EJ<-ZhfOzjFaIx49s$eo8ykQ2Q3EpG*{aytoc$j> zR1YeP@2`VCynyKUGkWkg9VRZ)wRHZ$tMY_pLX%9|B@tzro*V>;dzPCuu{9hzC z8DOo8qYo!y1@CJ$_ZjN?HOJR}wH8ijIw4rX3EFPIiFjC{TcEq&b3~krvs;d&O@H4ySu^1|{ANnu@cCeX*ufGbioH(595~7O2h;v9f)00gH(}7_uCsJuAbQ4k?NW ztx8u$X>5JH1%4UW-GrDnF29SgmMX358xPn>yB00Xzn_hU!Dj!IK(3D8>yd?&3WR_C z-3Vp%b<+Ezb0O4wQ~9^g#K9z3|Dd0;&JiuB_Q#~Ap`4|%Eq1=cHsPrzGx2QKrq!p3 z@>Gfi>dTCGKd%sQNQs{~1nGv8(P(3aXtL; z=28`Ya~Sm|Lt}n@IqSJ=Io}$KU0@nYXsukCfqkLj`)}#-YNqFA*!ti}4$q*ojozU& zL=V-v-IJF(g;R$r)pfhXCGjaa8^l+l&D{?5daAVE9@EBQE3l82@nhQ?Klf28@~axj9(wf#J5n$nIO@L~-J@}67R&k;9yao08!-Qk2U{CxR( zc--lq;K(2~@Y?irryN0Lc7Ghz_1LKwvjWJRPu8@)_!rldEF3HscsIXwxSQ6FN&vp^VOGV zhyA>i(?2u){*BL&&_UMpbYI#3wdq7;``216u$&H&Iya}ZSSpuB&cY?u1{mS| z3#r%jXn~TQ;DVTg7L4b7YeWfJ9090aZI3=?Wyjf!dwsGqlIf$41Y3Nq2yQm-p+q}5 zA)%R(@Ph9Xf5S>VGGH10iR`2R*B1AQ93TOZ^MPd9!1MT8(T$-+Mp1|LT+n^J>ofZ0 z5EA-Pk>wZ?rMixeH^7*a?vl}BK3pe%mi30&f`vG45Uf_O0HsXUujjXc5+Bk8pW0@Nf6y135ba6Hv{#6LVE5G4#PqHG3(MT*k8fta{69p?f;uTxQL$dfmbTiWQBww{r3E!!hUS${;ajjr6?-IY(g zee}usab?~nv8&WsMIY6%vN|*I_3yS@vr+!mSyuugbN`_M4&1$(Pt)qiKQwPG8OJsB zYT#<=2zt`5ckDK*_}n(SJ8fHv68`S-_Q=E&C)lJkW`fm1unFv@PdJn?HgOk{NSjg@ z`hgu{Dxdz@&V|KqLvS6HVoj9u{Z5fOxOtaWO?bAZ?3_@QiOu_lHW2KxW7Hu`>|*fK z9Z#s!odL^3Z~JJ);v_S{?XYR1E#Kh$aH&~tJg1p#;0s|dr~^q79nmMq zn6g>!Q;6{1=imWA0HlQJv$%c|+7}S|;kMZqq6OaF<=#r?a-sFy%=#_y^A(&uO6)~R zkS)i*3WY1Fg~rtp!0+6{=L~%E-)lpFk_X+mKe|!A{ap3oVuW98S?I2r`M6L2RFeKg z?=n|v_v!OceUCut-*spq7>UIUxo)exdZ9HCossN7$k!m7+(M;ayF7(UOhNAB!*l3( z<3)_ZspDXt>twH9LA4AK8A!k9v_J(;M1#ODD1F|(O3^oPP7lHd{)n*ABQM z;(e&cAQX5=jB6I}d4)Ncn$Cpr%BWW29DeQJuikR_9l{twdK|w&Mo%O=v_elL#UdXC zdNu7L(r$)E;<9IUC?Jt1AWtwwID%)(h#?B`?8H0*%5|SW4&0(f5kMNWVd?t{dAVnO zjMLXz+yb&3(={l`#^(+XG$)GZYdfr>mbS z9$~7eSCGf?GJ8IY!j^Hzil^yJg>=FwGijhi-L0H zIxc-L-`>Ip?ddP%(Au>Zp^tSX`OoY~0{6P!$CB0UlT@vv ztken6EE+X$kQ!e&-@SpUv3J!WN$UZllIbH zi<&TDVo?}nsG!?6^+ylEE-E=XiDgx3T4r$6uvV7R17b1yW#7FgE;XPCcjv15LeO)0 zr@;c@tKx8SWGg&y;k*W`cRbK=)fj@=Xl4P;Gi0E z3jLoB%VA#U^5-NWfZ7AruzP*F2cFhADf(IC_`800!n|h@e-F3b zF$^ru&U2*+c~;2soQ#C$1-&Zu(_fxcEazrtQ?LL1?HOEjoh32s&A}2|7p;-rfNX-I zk_?=f=8Ns|Jut+XAgyZJ1M8|NwF^^3zWO%m5~#C5=zwHUkKU-@Hsy0nv8@Vx>}VKD z5E+sL3)-@p1dtjty1395C!JGg`&V896KCFkuEjnD2tldBudAgmw%&@Xv(t?{rV0)4 zOA%}8bALL95-|kEa;b9DLYC>vjlxt1w*S&{M28)6pAqk^js7IAcw8v|B#6X4F9n3~ z+f@fkgLmzgO+C?%y7>&={i=#!V73sv6WT<_9ZINMC12?b=-%hojcdTk6L3t^ldlrR z^pen&@r@jU8q+@t-mLy*%W1#LX|Y%=+RX}rxHUkj-z=X)&tlaG8w9%^!q1iD%M zaKOO_Z@DMWHFqSAd^Z1mOF&X>eq_4D;p?XF4=u2j!|8T;m%v~WpwD?dd;aS;%q$_DR_A>gw=m`+-CGZ-% zs#3b&jrO)LIcj<+HQ#GHciE!OAq_yZ$&<>D_3&a@!?_&CG%JBkf-_d8@$pU$xp1i2 zai9M$oeHJ%*h?tVInI39R)Z%h$2%G%h?Dn&pS3!-1ll7tGid`FFnEM9$l zQ$jeF+X7pJxrvI}#`nGn&TxG6FL>8i;HE>(3W5S2L>Kifl{iP}HICTKZ; zBk_be8u50-jF`?P2dzJ(zByyYLPO+g^iyd~=s6cl{ z+;W9%KZGS6U?R2I(VP`n>)%9Rl`6Ul0?xf5u1>ir&1av*Z@_10eTE8|)+4 z5;;(#C=H%enj9k9Yj68I8F*?B@+FxDZ<%S*{|lCo4cy_kNPd$~D%vM*CDNgEHhSot zMqL&ZOf>2UP$rydiY|3Ge_ot@3OPw3a3uYj*@%@bCVwk4g)-oqydP#%%BR*W3(zQSH5yU<+$%fj_*+*3}fS4Ab-yA!dCk(aq zU&06O7?rFqHg)|EX>IOm9NCX-KomG*Vk9nxxzcKTc9(J4&M1wt8%FN;ed~s?IybiCQ`nn(r|hixh${|@{sZ+o@13oxvzXPPLqB$ zs=>gsCG~vzK|eEi+p8JD{Adub|7JlRAOU9-|G(C*`>lzsTTcSPNR9MPXdUnpa7*dflcX5e}j`A$lsp{IeW|uj5I;&?}t@1X9l>D z0|6HC-)ltA{kJxy&ifMP3Ai@`YGeFHf+)NoBmz?WepJlj(6mfKuIQkvO3$n=o&jhe4@f#yP^}d)4vVe zl#*I9|6@bokQ0jKh0#LNYuOgR@y58mF{kHY2HGxZ+>j^S5f(+K4wQ^?gyf#+$O}z+ ze-v6W&`u(B-htWuP<<=2*8S%G>_}i_cGBwDzn(}a7)Q_O#3&?gvyGg_cOnw|7Kh+g zS{AQvTZrr2Yq7tz_{9SmQJ_^C+7etiOqUD!Avsv185mw~$k-k!I^9~mbdDJmtlX_! z#bw;niuGe3I;)AwNwF|Z08l#ZFAU|nKHi19AeBf7(km_Q%x;XS?%D90FNi0oH$ zvsLnpZ(^&*l?P;?P_ql0S5fWa?%N)9T*luBg=ovJrlh{n*RtLS4bzK^tTf=&-o(E} zEhbui|78XdR7?)0{uWBU+3ejo@s1|H68Wh5V|c!%R5t?E@W+ z5$MS-raDXU6rH2W>ErZ`h+k74g=Orv)2Sx2)KBS0RwFUM8+ZZRSgk8>T#=tdvWj%b zbuHtb~yV9LG!=wKf~n01R{hS;4qCN`97iQNwKlStW? z`tu~d>IkLA3=zkGr{?|3^yQaYVATs#8?yhzSdYNu{msT5B^3_(%Rpig&8Y;?w1K$l zZ>D}>>x0pE;ph%NrWXy-$_}N3Mgy?UO7nOBb=QiNh*AktmOdlv0KkH z6X-u(oTtS~xCcIMlY=Xqk?+bdhUXZ-O>g82m1i7`TJVoPWKCWGX}BfWa5w9LkS9 z%~#hV^zcnIomE3L8g{=YpKINefxKexh;y3NLtInKWqJZ=Iv0CNxJw=+Jlz;KWa5CT zBwc4(e5-lTGVFzh%q5@oFxVsc=v4zG*VK7ny1ar=TiqCcf9JQT8pw!sPz4}=UjqMq zG2?N4b=r5!*%!K@0wt$4MD^4cd>w-rVGkgOgx;XY>8M%PR}ae;z|%(m)3GTt~%UYJy>~G5PD-G&hq_UJ^}Imru#4cBYq! zF5{Ikqm*Sq-dIA1XLj+Nj8JzyKCs0v6~U3u8l;|K1o9Ox#}7N12!9^va=zo!ED^aE zUF}UeTyH1(P`Uo%BxvD3rAIdaqI)6kR&@23oUh-Ti6=}mfeh8{EO$+RXCxl23}JL+iaF(X&(4W>3y z?_VxeOFS*{EOb8U=DDP^f?pYRNmo+@nP30^_ z9}KQcvjq#ADKCUEtH-k0k*$r5HSNeo`63ON$3}(Y9iVywQN}#F<-4QyFfn^jHmqP? z(P?Zkhq<05>ia=BQg=R}DgBL%HO}*oHWKLo2jMy6qFFq_$cW~<7O~-GxyeC7`!hk! z6u|I~50NYW$INpAn86^gR*sJ&1Y*8M_le0jG?DOVK&)dGT>*s-fdT{wd=9!|#1QCM zL!aRU#f-yq)6Pf^It^1C#rfnP4eNX-De%FcvY5Xy*D@yW7Nx? zC`bxzI^?Wrfff}))vL@<<#Mmo#X!x-e227yS#0U z|LVPW-{$B_Mc!;>jAKwU#s7&%|Cp=eRTW2YJdK7_iW^P@7 z#8!wyb%}_$4+4{{IFZ|TPKpxTlkL%IBr4jxyM}`K ztd->E3|9r4Qu$o?I>CG|xO{_64_5(U*%qGEAz@BZj8C_3Ej*uf{>Jk6)`4+qD0V|c zie%EY8M@Hop2cYe8%0}iTpGl5`rS(YIMtS|23FlJJbtPVRgHsSzF?#%EFZfb8+rEE zD=(3Qmf8-h1=egmziPhRC^p(2oYrG{h#$4~$bxtGXOy;6_ue3X&!+l95x*y}; z2i=~RHDk_@7;_av326V_o9LLJQ*#PmHj%;eP`1m7f265}9n{EDL^4#Pf43I(f42&A zzeOXm$8A3otZa6x1~jvOm-nJTcm!yUUPN9=&F854;kx$v%$pD2>ZUfO!kdW0B)=Om z&bj04(KU%C=so-xcjrZOP@Mtb1|7^|ONi+&k-=vYuw?fj33F*ZbQw zs8-}+4bEG)dMm91f;EBbmr~>?RRQ~1Rf1fX>tYkYf+wHf=0rB4*-D60=7kfa1{qky zGoiQ%j_2{Pq7#lW);MasDdXU+tui%!K2%(>X4q%2url{>0LA;_pMA#2VxmlXRAIrn_w)<7ja@+l!B z@8x?9u~pU#StG(t8~anxahBe-8>v+30I0{0`fztW4#_vxvuxi|QHy%ZWlMrd|ERM2OYIA-GRbf+BWH)+jG&j0g0N9XuTvPk5Z)|&k(LzP z@iTUl)!3tUQC^krk>pINk(!-n=>sb}YVzizsn|GI@C$hzbX^F-3S-j1pIOkle`-GI zi2|jSyC@aIJE>a|k5qXc&c+dO&5NzZ_-b7H2T$0jbNIn|>z)yxGO4QCpj&((ic@;V z)&v(D4?D&l9&V`9E5c`sik!U1Ib}Flt;G@+``I7!Kb2gk2 z1!YhOR5z_?30^svasIHk;KOX-I9$JA%Am`tT!F%0y@TqO{OtHSTPvk))- z4X})Y?ALEVtjFqhi3Ze1#&jp^iVah*h)=7&az->bM8hiyNEJB$)wqWxvj@*oSw%d@ zRU~BjIDHHE=f1_V7D1!jpWVs+aKOd+Ogd?-t8-KF(GpYV)qz0{sx39J>e9X3KCGG7 zVKkWhS`6&J;i1!3A%-2s5>o|`>C)N-CFTY|2`J;Q#$_oj>9-?}|OhEq%!N)3~XTg<*w0Cg#5Y*8Bk^ literal 39540 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 literal 42542 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 F{{pIbxdH$H diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step6.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step6.png index ee4ab15fd6d6f5c533665cebd7d02cfc5a33d7ab..c1168aa102f61876a1b58dd5fe7024c0315591a7 100644 GIT binary patch literal 42901 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

r|^H!nZu7 zsF_M9jEUokyP7hM9&4W1vFyn!_t$8khp){pZ$7=z?Ir*n0Qr059ZuC2o_dp0qOsUr znpaQ?GepeOWXbptXV3QG_=Wrce z#EP|4zvIKN`Nh9H-^9U2D1ChQpUJQzuND)Yd~a-FnAf@Y;zd{FPJL3ljrtmI8v*nU zJLu}cmbsAJx0+dIuri(_Vj%_1G2uLrx{U0>Gxju(p zNx7p~YGTcxFV4~f|2~S!vI<&zH%c6H6VORi1-YcR+IgIF=mTVo9*%3h+4K4qdmEeP z%uEie>Eg`HOz&~EAv{k0=OXsN)`VRmaox}$uaP#T!*HwBl)h7&^Sy0IfPL1WIl2zrESph7r1b={CyVTv%>w^DC9F+jYJeS3Y+C{+Rt zDj~293R;}`&fmKvfIqarC$u(Z)w^}b2tsd2p%hyTv?+-FIKXn#X_#nfqQ$&t*kt3igfh zeWS{*#8}jX4atHEDSdKS47j9=TiC05w<|P=rIb%GBm45}=h7HPf%A3Pk(7c*A)zE^ zXKxfhl+IN{>Ik zAotLY=tc=c%yg=)wMPDQ?Tc;RCI~C2 z+ynZ$%&DJzf0<|5L+rv-D_A<$yZ;r>sNZakh*mV%j_AEW=rMF%S}ORFahT)pcplpE z=Qj`jX~z~kV4>0tnMwhJPFt{T-2iMt21$|oHeUhWbpS|`1Z#OUkmcxZ(}-Br%}DGf_{0I;iLi+L}^N#|fJ&?(P`O|sraO6XpToe9x`!!x+9 z2z%OeQzgBt(UCNpe1uV*B-GpV8(nY3rm+V@ZZ}Mbl0)%Zk(L02!)1ML*AXy%;=F| zN0lt3sBnz%4C5w!wR8uHWj+V1X<@JwC?81@eq-!x((24r+dt=o0L+HpG=Y_f1Yn9P zU^U8O7^y}mLN|6A*8m}f4N!T$7aM{dVu4a|lK1#<=4QO@yIMwgiYm=NUxK_d&+}Nr zm-lL#o*%8^7#>i8!>*R6zHdSe%GU24~<{~xkR-w zaz3A8eH8#>s$>O`uPhxH$cb)GC|vl}7Xd_t9{Qvjgp5#qPb@u65 TOFY+)+rHJ5H6B(dn!o&Cb5Gq> diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step7.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step7.png index 879dfb18ba19681ca1cc73d5318cecbd0724fc64..ce29224abaab5b9cbcf4ef333422d150fe224004 100644 GIT binary patch literal 42818 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 ri5+x_rPG&BX_!@zdfreK2fNZvkLnk(lGa| diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step8.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step8.png index 35c15686c13df037d730d41056d11f394ddf4c8a..231bc4acc35406884fcba10b5b3416fbe846586b 100644 GIT binary patch literal 44446 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 literal 44265 zcmd>l1zTH9(CA5Uch}Px{{40186#@QnTg+(<00@AVny&ow z^Yhcw)8o_Q{!P~~>_U7j1 z#^wgRt!=KYudlDIt*vaHPHn7AZ%zIBwYIvty7=pKWo2b_b7^#aWN3Y`Z?zY;dJbEG z!B%>DR(h6~mzS2778e(17S9(J7JmNxIkhx3H@`49H#a*wJ2NvgJv}`&H8nXo`Qyir zZ_E3GbITJG6XWCKV`F2zBm1MHqa!0D!^6WvLqmgug98JD{r&xYeSN*Xz2Coo|Mu-0 z31kOw?VQ{DGW)xGxx0C`yKSMhX|AzxvNM1B>hq6|((#g_vBJ`ks@#!-+@XTp z;oPooKf1cQIy*Z%Iy%07`&|v|P96D^)W4tjeJQg)Bc(4n;d^{sPi#zQbZAFNaK~0~ zdl0mJ)3x)gr4827((?7|*QTbX#>U3_`uZ$EiElIH8mwAB{?}cF)=YdK0Y=! zHYO$}IyyQkD$4)sFUQtX_olL-MyUT6Kldtk`^H_ps#%M=W`|OHsnR3=%vIk{EB1v> zMmdIhnYt=DbNmUD5fKsL;o)InVId(QK|w)KC^RrIFd!h{!-o%ketzEG-tG~LE@5jf zVJl9-OXfa5UEY84@bGYRb8~fdHFqg;adB~Wc6M}hw70jnv$M0Yv9YqUvaqmt`}VD= zsj0ECv7w>in>TOt^z>f8eyy#ot)Zbo89GK3G^%VnBmH(tP=A73Yn)SKTun_)RaI44 zSy@q0Q9(gLUS3{SR#sYCT2fL{LPA1ZTwF{{OjK0#!gq%e04htA<)n3ea(+KzxDwiQ zpT&D$Z?{%UqbdREV;g3LIxwYQ1a~_&=-&%lw{viZyI;U&-FuQR+tDNVIGzMjsB5#+ z!EM_=dV<}xQ&OSYx-L3J`weWZ>|wKDu)89jG;ZYWL!Ro5n&!>S&o)oH-M^K5{4=XR zF1@opN_@;$^~M0hm*xMbjm4hVPpxd37ykIIGI=c59-_$buWukipXru&aE(&Z1Uy6# z0bo=4=egNczqqe43J_RXyl`Z3$ zHyCwLfdIgbaVGhR9oNpLoeFOKpzJBpMawlmnwk%|6ahfWVY+?xsy-9nEr~hV%GmR5 zvy$Cl<+Eyu|XvF@5bEvJW#Itby(21^B58UU-^wT<%SogS?NrMSc`0A zuznY-N8OL`x|Y@bi(P*lN>WGbm3s}m}&I$ggt(+qE^Z^tLA9nb8jxJq<< z1L__fpW`ClS>v?GLJqenwfN&}VBy9r&LNH8aGp}ToNE^;8B>pK&8qiaSBNhOcK}Jx#7`pgiB4aizc{q6oBa4kLe(Rxxq8Bw%P^lzd9m-QLRO-@xHMfLi zUb$}}A&gaZ3wbG$Vsxmods@`alAilBDA>nTDhG^cJVk@2Fv@#%S=oF^9^7@Oi_+Cl z7mT&lzu2bB{^uS3YsPf(%@2-KIu~wcH=$Gj?aQ+}@HcZU!hUleT+{_FiI;f+&fP#v zT(~WBb5ojIjPm#I7NeIhca)(azNUWG6EU-wx$!MzMH#rg1nW-ibUAF@jP6ne3zRRYFa3JcmSQBEzJFO=Z15gd8aAuEiXOj__FpL(SYqeHUC*)mp7opY zvS|31d6t$JL8#02d&8+?c^b<7QdTrT!~D0<`^`-ZAE}_R_gOh?<|55O1RZ@ZIHKX) z+T8VLs1XLl>RKH%gvL{8b@&u)!4gy|qh}G9+^JrIx>GEV*G$oG(jCxKk( zH!Vn!DwT^Mw($`!efC4wS%lV=xF2-Q8ugzhj2~$xLwP|@rUCGf+|!Iwa%}a$`{Yj{` zf?h6uG~-sbi_gH&a@bHX(UV#FIled43yZ?R&WhGzp_y#M8f|EW6nRnUU=Rr=0;B5h-N%`Y+cbTT&%L z=LmcsJ8nX7kPYzGHxV|L$8f1>8=seEhy_jLz;Z~AgJiE1N>1qQ4J>7?K22#pGkjq3 zy1t5(RZOhu)qkN86@VCJ%R71>Ue!?R?b^{Qj%WVKy13t|_LqNQN52-x>kWh}1~X?2 zEg&Qjm|2iqrCbVHP=`qFiM!*}Huckt*>iIufxuI^DeRSG686Rc_v-P##nTb0W5&gr zpyuSp)%D&BY)R{U=9@yk9Kp=6-314K8r+JzJnKgD5^AwDP;)->ofhQT%vxfQs6cG) zF4qmxV8$v3YTWJikY);#1~WIYq*m!N_Ce(&rK>ynCh^fj>9%W>scCInR7n<)kQ<8 zwL*}e>GWl#O$bUfGL$gavDwxAEgqD<}x@$FbcQ!sIb8mk} zI-^nob*;gC803YAvIW|eWhc4xqIlSz%$W?Y@q640ybh*#0ccAzTD8$7+rFjMMtI?_ zZ#N3fae=KU*9Vg3jQ29>dnqkg#85o9yMCGd^YdZKHzutiySO`sWZd5y&Gg~YEGe6F zx#LE>szpBr5<%M)`8&j$1}jkebC*9+eyBXnalkvgm05Jx5a6hw!A5G;1%}N_YG!Xa#(B%IMRB`f!5SX!%TGzAaKX}d0RUW)m@_de`_YDM zz=DcW+mo~P8($*twxHr4;GK1`xou7s!4D_Z3uaEXcIX9s0+hxjHcMWS_9pI5yrNEU z9}1x+;bG}jO{-%13SQ$ayK+{k{a9*be?7K3_h=QziE&lq$Y302^FB@Ud4HQ}J2v?j z0%NcYTtGh1YW{2w_1-%x!Q#z2I4p)S95B)rSv%nmoeS+KUi*2e{D)D zxf0dF_1o`9-hu(^M3=@eLzyMd#Os3{_n&_^SF=mkz)Y;aN~rI_vB!wVuU_rS!jL1J zHwEsebs&W#6rNx(^vz_=@N4_!7CM4=GfBqD2-5;PxZS+Iyg2HEd|{>5mNB&eLh!3* zgJNzew1=K}6~_oH0Qd<Gl!8%w zs}fSUw15xFYL=J@uEM%xW~#41OQTlu%u@e#eKIc|t;Wm)ZyXzCb`Ze6jQZW+A23z1 z^g3S-fXz&jcz}a2C@K&VGmeSKf?l}rN>9J<7B9DO;Zm01k0$}__Md(^ij9+1-H;;* zVCZ~}&e3M-A1kGIx!)U8SdKf&2!K;8m%GJx-IVJOBJ?>>GiNTX5I|t4;v~^JsWi(N zVYGZbzwcP0hB`KeYnTBQ&afOeOxS_}b|Fwm*78$I!U^tRo*}pA8YT}dr4bb^C_n~k zhD!K93o?YxZH_FcGF3@P;V*yA{uS%13ztiVBAKfsZW@c?9st2a_t9O6$)-r<rDCFBWM!b`6QNcGx~3VsNW|3z?vB z@DsK8D`VWVH8KS-Vf*&Lf%0~H1XfF6*ow}G^*{Ae(sU>?$9Fr$T=G2~x~gAC@dgmK z^9kfGG{{i6aS}eOZg}EkTYlkUoPe+P0Xv@JngqBfwe!lcw>Z-ua2>*2sby;?O&~URoZ&2esFcyexJ@kk?TCCd|QI|AWgr%W1R<40Rx6ylmhS zl$*0a8EShbr40c1np!VcMLf|geqHnLdFEy#l7rvZ}{m8P2KC%1CwT{m<=S}0OTACi2mQD40Z&9 z{*l`jD3W3XC!R%rNEUeuJ+MO0d_eIHG%sy~MB|u_9qs@8mPKF`Ipu*l7QdWHZUP(I zn4n(;ti*(tWEiZcCogz`6j2%tVbvM(s|-cnuh9L`Hk!`8*7EM|qRnH^h&vUiN-~9} z?NOoxOgH;l+K5rNl#yf+jjvCB(B&I%@7sC`ZLePxaZ)Fo5!BMq*v7PXB!Ez*>8KAh zmt_1$P_tTs(ahakqu~aeMEzJ0M#e0CNV=4K8nd-pMu%o}h{CY(che66k-8bjc&4ue zX^icI9(FEcMzSn(eCA&4gbERF>7-7HR%)tF6y~I1Wm})`=-&15BEjdny_L4v@H}mE zbX2YBShu2nF+#PYoXp9|l5YsT3nd)9EY??}e1E$QEVt?y`Kn2+IABHO9-1Vze(p0TkElD2<852RT*yZmZBOm>yxulj*l!ytC zxPEe`Xz55po6-({?$91t(i8a-`Wo04$?{KP&e250b!reXGm8m2M%18Lxjw1BiL8JV z{`!MAL+p2ju7(m@q>p1vpz!=)cV#5b_2Rw%fxe$&X^Fs(kCk#r`_+W1 ze=455PFLCp-gSEH<*mAttedTs638^9O4A383es3mbJ9aIFq&V zO(CSf;v_VllpmC%Zg$J*o$s3xf3~mLo%88cIjulfl&A-M$P&xUcpLw*lV)+=F7Vh1!nbn zqYk5dLk1A5AU?SDQ44J+qIJ?sX+$@ zWM03V7sb)sXOQ9y`hKw4ly2t7S|RMD3_L$D&n>o&B*!WS5JeU12(&founm^NCnnu+ zZqRcD$R8h}eHB$h9K=UXPX3+dKDrTK9OfV;2l@5lHQ}JYKoiS){xd^4Z{yvc1)t{o6A;Bjrx_uB?w$@6YA2$f0~!90ewY|#7| zUT9c2=tAYHjJ*LaXhP$C~!rg0-Nd3tGtqqb@R7cV}^EN@Hd5?!qz=i!-55 z<^${Qh%M->hMNzMeKN@@?o5v?n{8mu#-Ic#q)az)*R%LxjVqH(&zk9^Mzb_kchP#% zoS|Ot;y=pd#jFl+K292xkN9sv~(?c5~`%oV>VSw^5^ z3eA<{-FVZJxh_9y9l1&PExS-2<@8~2RF}<>TdbjJ*IwE=hRw!Jy;8A0ARRSw7e zU13Y}kOqfj%QCEz1Lo=OChuj}BCB28pr&AXs#z>6(nZI}h-e^p)R0tO$*hE+IX9py z@VBXS7qyE7X9HDBJ9;8-YpA3wl?T?E;=uTFnoga5RT!3)WhTR(H;Sn$&Wal2^MYMv zyx%fL4Y&hWzqs&d!^-&%cH*sRh*-8bi)>PxuU64y$&z5?mPf2`xf~}BWqkQ(_?2FF z3PE?VM0rqKqyUKs7&CpE!osw~-ubhNTZBzI>i57y;>}c}2lhDLan&ngcZW1xdjXEJ*c)dNjIg8mP zY_K5_o-U+9|IgQ5x*e9z>pO1uEnnr(F?hP1Iy*>u4sh)=V-u}R@=I3Vmv|m1s-WVw zZ0i!3`C^XkF|ux=6UP{}h~6 zxUhZ#_Asf9zSb#;vtWZgqcn;Pjuxw`o7B>nnOHSa_Fj~Q0_SvkbJQG7f#H}W4=SWp zMg&}6IOW&Tc}$`^-RHRHX=0k4qwD3{8B zzq3}f_#w)6Rrq}9nCN5 zuOFaM-l6E~M+eZX>s;5THwW1-phQ02p#BI92Tf#$ ze9K%(5K(nbIUL``ZvMGKw^WDYinofS;Y44J766T6?q~>(ee`Q(^XF({y(GsCAC!p! zr6DRY-RjScDbHO0jbI*gLpDt3Fq}5_u^z^MUq;APinpHRB6BMLQZ)h+Zme56%jPfT zvz{qW`V|oi!PvecN^tM7{H=2$~ zMlr=mrMA=uH@|dM;Lb#jb*|QZ%)9@uAz~g7r;26kDDbnFh?QC9Gh*Z%^TQ#C^6j=f zga5v1qZAa)GN(v!9L^1We7szMb@-5^o8)Ume3q>6ULbbYiC|KdBI1jh?A-xY`Hk## zdsWV~e7*|mAE@bcaSD2s%*$IlhFxE`$nZ*a!~7zwTJUIX(Dpv^43wr_4@g$u6=$LL zmb!j!Es%c^A)(AMrQKP?DWbmv3Sz-p0pyVGy0D){bS434k7QaM%ZitXk%_j6^*T)GXruW(F(Xg88BmAV|wgj91UnFO9 z>c3LZ^Kz-2*yIeZM_r-R3s=3e!moe&9(pd(`*G{m58y-A4RG3usJjppjUhl zaHT`=)OVm!2F1~!$d)E_u=~GWDb-kk?d|{`=W~s*p|O zuo1`0OzPE)ri!;H zcA>oS75;x3`w^&Wh;xdzd97-Aghc2t8~<9<0Pg2bnMpP7fg1-=I#hMg>lQuT5S!O; zS?_<~!#qAUpVqMk!|W2#N**pM6X*j-c}7(E-X)13M*Za#3Y7>6dKGzpE^}D*N86*Jcq`*-ap0 zWYKod;`fi#>4VVcOKTf#CzYKHvV`(u|EQJRx8u1l*GSORgK_5;(m@M7qKuB>7?;Bs#^Y=tKGa^LddWF^nQSKR+PNA-9w>X#%k>ZEbW`{4^I$oTZ_s5q`sEU)CV zp0`}>2=7(smd;_Kz6T?tFdSD`-FzDP8k<(?$Hqs9I9vHyxn&29QFXoN6MJ^)e9w}0 zC7nJx30w3{Exw@xmm|U!)0qkP;y)3iZ0QFR9dA}}YIF%j-QKjqu`2matPql@a0|Tm z*^*Q<;B2o;+@G9OZe(L#(!ypH{C7N}*ZZq-M7kP2ua8eMh*4(Ay6b!e11WTWEXua~ zlJ!KoD#hTju_4|}J1~P#0Oc|!indEb+Ye&Fg+GH6!XKf6BVn}?onn!$@M50R$MOnT3s|GJ@+7>#j3C2}{v za9E*xRqjtI9}aT&WH7ciCUcTU=4exS+izqqwl=CT3mHl8_)KWuo3~^tZJcv!>h0LJ zQ4!{^VAlAwZ}jeqy`Qy=JjYrK+GZ$y&flx7GGWuV4wq~rH3}!aqxF25_sW4+{(T~Q z!uCSP12@{at{ydObWJZD-??Pr2jpw{CvpJLfZui@+b_D^c7P1v5T4Cy!{fxP)U_kH z@Xqsoe!aHUTRy${9eqeMGi5FOi+%ixSO64qrlB{X6))<;EPzFg4G+B@`4qExufK0^BgiV< z8}{F-00Fp+c@-n#a#QS@G&qs;oK8DY|5!Eo6tSVmC3@^+vKOio_1o?m`)>XN=7a;2 z^`f{N<<*An=1UBH*UuAn006m|h|heXaJ&z0U2H-W+EpG~JAD!JvCo9&oV7GB0l+fo zNN=DolxjMk6;WJjufvvaI+MMTR7?}%W*ZfPz(`X{=<`bRyNRRufw z@3M~ig7e38=4dzZaOLpAR;yON?Pu}h7!ULof&g=>H=o_#XdjpK2-X*tew_(GEhC0U z9T|{n^>?~g&?fn!uxbo)91hro(NS@MBrqJhQM&WL`_9!Ywno255m5o77?fz;m-plDf9Rf3qxxfLY4!(-A)==g@I{7e+9Pnxn| znIkRM``i?GU|UKjVW=vHGkQl*P*V=#9PlYR2msNtDp~7ku;->YTY3DyVZwQ{;}aq1 znpM2Z{jC>1!oU$j6`P%AKE%88LWeb6H0Wc!8 zgw}#=9rKF~R2aq61pogInTf39*2>4=^8W@*Sx#>vJ7=%NKune$w|prpr3U;DPMWUj zg2OE>+43CIxrwDYu1FaEh*^RXZ)r&}qg&Zf5Q3yky!9OZL{S8DOIaq%#HczgN-L(r z&}4q(!EN)~PqN0{a1+~BkA)6EL)Uu`U*oxYsfRKiV+P)SSeo2CvOBso>Hd%(-6p<@ z4X+Cn{hx{hI`JHIWU!h*{n{I&b0y;zV{Al22!|lK5tK8^Ld(>D!5^Kcm^pdvqD|Z% z|6oJc^~7WsMjHNa3B8C$L!P_KlVS}X^@Iw7aTBYo4G#|1EN^!QtszpOAd7u~>) zsQZ-TMS8|Sb9e?sP)Epe zLZxZB+;>CN2j-JVaHAo!oH6hTPjnrceziKiuVYxHqQH<9rle^r?&jO42 zIziKd4_`7E^c6f-sQ^HmfMJ*CJ?4xW&k`k%odc_m_=DcnEYCkwY}@=%}NU@L0`g`d;M%+UePp-e`9XdIcDJsGUI+?Gtb z=HJQTD`5@&Mp63_j))7agsKc=Jx7`seN~%ps&sY=vwhiIfw`ZrXWQ6kGW~4#Eieh> z|6K_c@WFlMV?GxsrzElGadIsF@a7_OX93*6OU0v2$nQ*4Als4lpoq1QOseJK>}o5} zk_!T8{Yt7Q!a)e1P-F%c{O4Q6pOqJj8eOE8$qG{D4A1keVQpDK3C%VUnFc{qzkJrOxxP42>nDQ|5fYcBgqqbnNTb$1ORa~y5Tlt^8tTigyzRR9wZJTc0Om~%u#Y!+T)wXWP#wT-R}Ufj?M74ft4%`yhP`nIfoIgT&cKsaUjpjS^t| zL~wYIbpwmwH|0s3o~yx#VaI$DuRuuMA_jNoB(F3c2>QBWu$3-TccEDI=lA+oSua=% zu0C+pyoFuVyrq-7^Xz0%^7!%`~c~+3Q@CJpxeO`aM zT=ibV|BChZq~r97mXo4c^&3z7{_>d-aK`4xxjynSi3t4?2_il|^4>MuW{cRhmNxdM zq0Jxn9X@9Mazl)aWI%#y$-2;M$3>4qm~*t-&vfst#QlkA+TDgwM`;-Mhw^pJfcwik z5?tCzLUXnmJ|*0&_gBfIgtzGEOAdBkc>UDPvKV}+ZkbbRL(}K^tAeiaBg5Crg&gTy z7(OfMn5{2N?b+yrL5Hfae4pK?ER)al>i|Lc~DO^1!)vv0EtQ zG=5F~EN${n7)jk#w~gg78W=GPwaf|zuMrCWWK;dVsT9S|>pf+bnNw;_SgfG}xM>M( zp)I#~!P6MV1YW7xM?9vD{-`MGoi3R`c#7iyvh<3e=%bY?h%#q`ITac*ddow}MpB%# zDR+bgx)v0Y48z(H5o7An?usDK__*KNfSXD8WB1nDqOQ@Ru5a&@i*9&`*A<`NY|1jh zBI?g19(rk>&ITpLFyVrs+k!F6&~iQJ4UQo(s>u8Fua(L)vMNck<}_eI0{vg(>j4ry z@!kV~fkhNFb5GRb+VIYMF^r%)UWuH=&i}iy8gxVdyhQ>0FrF{*u;1JAYBT(T25H)r ziMz-5g@BFi0#~OIxdJk@m0*?(p)i&#F`LO+&7BLDCSH`WOFSE>Ff11YX(LcxFCs7> zDEOfGM=NcnjN?>ra+<}}=-mWI1_LQlVF;B8=mZ<>OqL#WV)>~gd+J>;H%_vAZ^>!V zgNTJBs**D%k`nhSRcYgNFfdaVX;qA&&fIJwO{z@(rELm*lC=y>7Up-yQfN_aVJ? z;Mo;%3mYa@=w#aO6QnmCswV8`5C=_9Sv4+@AO5Uf-4Jf}%avZwveCrOZL~hfK|!*> ze)p0>eBhi&qvc5#z&U?GU@p9x9IKS};jgi@531v7{5_a~Dr_y_@1E%g&^5!Cjwh+c zF$tH4SF}4kgas_0a7r)^UQ=P5U9}5QvJXf>5$Yx7k_r?UVd?U2jav(zNG!aHxX7ev zJT*Ew8`nKu1b&C83D#cku&k{50xpq+)pS<5YT+3RDn~WuqYe; z;0`(nN9NBr@7$e8(CDOGoHB!XDw>)EOd*D^(zwLp~q^Gdm9 zzUjpnIS|Po9smt>3)aZ9nMM)TCM>4hn*EJXt?QIhLodZ10OiaD$F zO2C+W@OW%U^(c30&a{*UaeCDrbtkij2f$l|$SP49@5OQ)QP0b2bGbk`=@%bi+O zQdQelVb&40T5i}prt}bGHH;>!5@;;)Cr+#cNY1li@GzHdy5iS&=^GeYx4-ivl%EbE zv@lZz@CSpr8dSiIx#C7_%wBxtz|ro4lD^yKl8M4@8^1#?AUAOG*f+!8F95nrP#93O zz?ij=Hp5JLz6;WSB*_H}XGo&bsfW6lIz5j-z7)_)spZFaC%-!PM7p(8c79;uVSS!5 zjwQiAH-@Gto_@Sd&1^jowH+}y?jiR2g2+l@*T2c-4LacMX)h5aDOj5*UKFYOyWx?C zaxoSn(;|XFV)^{?Z8bMc`}&>KZ?a1yrSk6|RBQkI-Cuqeac~2Ypmad*fql3&?w=fT zd5;G~(o1+bzUHLQQZ}|eR12L?A0w^jBTg5-E$LWZCMkfM5ZhkWB6m+sIF!arOLmj| zA2zemj8(e^6nuw>04CFti`JZT1z$G)l^NRNEZw#7m z9Hg`_ZapJ{n7!%H$Bqm6(U@3PYvhqwXWDs~T0{y9$=+)nq9tI1MFU*wU+zC@wdF!b z!vTru;-^B}{=KLyFH|dRGZU;XIZPuG^{8;gY(#T_au$)%%#G2YY|hJt$-(ptj^Xici?@p1{k-RhT5mUrM)CN8w^u!y250f$ zrCria!RL=!%X-2c2x^F)To^ZLlgP(~KZB0(*&B<0_4q4+ABa@vWkjfRJ0I#E4ur-c za6CqC?zZy%BrXGYGCw|FM@VADEL3gPNj}!^$)2NA1GACH&gKD4oa@at*ZKDrU}uEo zPn@)_#(Ne<1D1$hH1OZ5pqnY;GviBJZ1psYr1oF;`^7lkVau&JftQI5bL~gV@e)g= z`2%6_vji7`XA;<*DJ%Aq&Cwe?cBYyZ zv)&a@v_z+;CJrv`I?)FW9jSb;e-$F)^FLZk3m4$tob>9`ykjz;S{P~N!w+A&c_>Pd&i&^e8`^#Ejo&umB1X%riR3LbD6t^z!gnIidRKpq%?Te21i}{yc z%@foq4Lk89xDrd&wzRqAKf07{B%p{=d6yNFJouKJC%pvPisv*A^{?RGJHhXt&QJgW zQYn$PZ&n=`2vi#Q+Ba9Y8|z+o%3!EC8&N#Xr~)3jV!$dYUxniw)c?93`K&vNU$kEU z6#$C*n3vjigYPs|8U~`1H>t9)5LB`+_JFixyAK0Nc^s9Emav590u)?8Oc4fmVqdW1 zl|}Ir;AMSXP|}iEJretnJZkxYV7g5ot5s2h_*)>bE^Y8On`ji5qTb71LGW7nI#R<8 zXS@m&_eg>R5u)WS*f2PoSk+DWei86|T2batfCwmAF63C{FB-T`k}L@Zs06qFSv(oT z+P9K~9`zh+KehHL?0rWSPp4oAk_&_=kOu#yK@-V+DQ3 z7z-#Uu;QG`JxHqYHn)XMKQ@~jE)=8diY8bGjwOg!A{$F#kOE@S)nqhp`Ckkoh7!;8 zWvt!8bRe(1YztWj%3hYdhmY%V0{7OFj z!mLi(Eo2$Q`P?M*D3251l`=(wg5+6r&9s3}Yui3I zdicMG?^aj-i(VeW56HEiqFO~g0pi2lq=ak2@VE|kl~lK4#S?fjHI>(QJt6=C@q7Jn zdBu#%-)HZJp%ToN;PKZ=dYWd+3I$%J=}ifbA)z=wI8g3eEz)-7r#Q}Kgq69`W_J`z z{^jlv1|6{d>s&~-3DKbxw-m#n0H6!K_s_2U$%5Pg5^X=7oh*!{hgc{MHW8@)U+u)~ z+}lkT@ew!}LB{pptK&tFlZ${2ZCn7zLSJ%Qr*$z;i*DQ$%`!*(t(#Gx*`l2%s4%8! z0ui6HqWzl|ah$%2G%X1~V%G(Qr<+w_#R;UuSaML8;faIDDKON_dv)mGl?%*lY{*oI zi;Z?TREY4z4wYQ}J4*!kfy@D3<}jpMZn<(lPD%PXn{^P8RlrI??FjE#NdO{y!~oCp zq9VdWbmn?(hVn(VevLtlpmqf2rcRj*xT#Uc(odZ!k11aLBo~qi%&01M%vs*lWrKh^ zjowd7+6MGB{yyA+yp3u&+8i2MEDp1UUmcHhXyICv?X~^kWtNFnH_kB?_aqt2)YaUWlqNLOt-Nzv-A zBKv;TD1@;!#cqV)3(<&Pmw=$5%X^kGXwjBw5%BPg3_C%;7aFE~96T51d}f%B4aDkd zo4Y7GN}t7XU%TrGqB|FKkkqiqsvfO(ozqj8KfZKKn*swy*46^O=$?OL)exQK-5C6T z%E5~zhUXmhQwp*0%lm(uRigoaxr=RV9RbMdt41V!^9G7K`F7f-9LBZwS~PSX(e-;I z|B=Z7pB=D_Vo9mR^VbQ7E=`-^aZA>aJNZ_fcqp-Bpz5Bjgc&yGj`~Dy)O`{!HwgyRM z&u4Nbwc^y-Fz#h0sjERH-l;8NhY9L)cnBp`DEA^eP2ne_l?dKa7Ff|Lv%-$&gD0KB z4XO;Mnh+O;>C;Vy3QOM%Ji9TRhfjpOum&nI#Zi*p)0w}m4_-Mh_laUrf&NU zVQE?^D0eB`NA*L3E)%$da1v5}2A3o%JJ5UPRV>dUW~8nCAo!W{FG2LZ-|-88vvKW9 zio(bAW>dk+)?PCA3Ld9CoNO@tV33SXY!t&J_KXAQ1UqSS2pO$;A_^3l0Mpb1zjEsYrLPL0bD7kp#lHzpt`!co}PAMoQ`}G zA**$l9E;BX4R}0tm9tCKn|vRqTiP+GkZN0(Sj2hBsFQ* zl`x~D0an}p(a`mo^01pnPhNx=eMgSCN|_g>42NTww&j4*@z>`?0mO{m``JAuu@AGG z;W$4pp;9yjDxd31{WKZyQqU92S5P?g{L4!z5i=I@ZT#P;S?h_2^!bU1$ji^#+LlH$ zyiWR8jaRCpELY2tB#pyvY71Az#^m%sl;9J0Hb74P>-d9)B&{*Mk_okn^i+uAn|rXuV%_~t2+qlzj>MfZjS9V3O)I$v$0 z#$&A&1j{FMQ%6`WjnuFjIM%q@lu@-vg@-B9VZ#Cf)%fh<{7h8dt`~F(Y@dvstLK;# zCb%yqX!+CU-Bgg|LQJRNB@P3nIf$g=KQ54hH<(aXK^{K$ z$&?1ED#`_Vo!l^D>dsY&Y;W`QY$lkXu_X_&FxtI&dhcnGpH%MozJ`Kxn4!i-CM{@A`$18M!yl3 zD4ZtWd)9ws{a908>WOiX;!bQ%D9H{RUMd-T=>@Vh+}U=OAD9-Y9nE+?PE)amXIc#* zy)`#>Oqgrzzr-DQBdobWxdLIcekTS@qkk|}+#Ca7)^8qkK7nHo?c6Z#;F6rbO{^VO zavyRtOibAg0@ZB!f^6fc4!#PyqG*3uY=p~`z(gZSg`a^bj3qfgWn&OckC=Z@+xlCc z8Km&1@iP0g9-}UDc%%SF{IU4s9=ktCm`_U2eShL?kt-|UMv z*pVeG1^q%LlV~%=9sl3MK(yFM8v*slLHs_-_b&*Z>vityOK8oA*R$ET6@`3bSK{9J zU03uI>+oMSlC+0u(jyt=j;mI(b$x|Tg3@MvLdj9ct{JU9h}a@EGXt}ux~fdYbV!F4 zg2;Z>036BRcw=;v-OeYZ#vVXdp-u z0=T8wri~;Xa3!+R-dXqPR>2cnE0c9@p3TeBkRgss-}{Pw!ldr~Rb{@WxK}~viFdC0 zD)QSZB`K*gRqzEEyK9$8h;M~&p6H8^!Q>%7LRdE>gJ7Tn`YiCGge$LRqz zRG@zl3+L8BHHaHzk2+8|&7Ul`c_z^p^@FL^g9jJ zGe_e@Cn-{e3rKbBMOuv96!LsC6b02j#?gTo{ks;N5Xoov4r&4K8#72|@#rEIZYPP6 z7_D;DFi_T1Sd=xRHsDaHHE(72W<{3^zitzC=?nWjCCGFK2nzX#^k0snlUA6)io3?~TosBfehrl%M zL*PAPWOj{*z^F`(;U@qEW84k7Rajli8!SU%5QOsCT{KY~w(4Ja$7WamH`bTC$p^R2 zHCq$?;Cm7Q)vNZSl9U}8xLoCX{Wo?~^G>=T{W;fnd(*0ruWE0h43)1_{fuz4NXG5C zo8E%Kvx6~uBHpxJ%MB>9jxSabCPNDQLBA0##R=zx+;L$gx)4>-4tISv4%qDz$J<%Z z1yU=E`b@eVoz%2_q_5U*N!$Ybc)cCsJ1Ut|ablyaP2>t{3{H)8ugp~HhariF0^6l} z=}N8AmKM0`w{gxN4e?m3icQZ4rI0atjH*r9hTdGe+k&_#VER~-44=RzIF#S5^x90S zQN^EDj0<08bL@so_^>zmyfDh_RnQ*uB7j$qSChacYO=`*Omm0(TJSPEWsgE3#TW(f z7#?*_qtgU^@FWIeMf_mZ1pQ*Q8Jv8-k)QRYC?zy?O2c5?EfYqYy!+8Gk3t$ND3u57x$eR;Q0r8(K;p)@ z#KFM(a}B){jw$#Jm#BGV1pldCN8-w}FKr|M%_A6;zK1Dh0k^9<|nd4)W{Rcb4 z|HIi=21FHg?amA#2uOo;cXvujcc;<_NO!{kN=gezNk~W|E#ZtJAUz=6-Q7L+_`dgk z_xHX0g2OrctiAWz`|P#Wv!0cMSdIVJP&=kccHsx|z^U;fZMt+&rVwfUCg*F(_U{Pu z7NX_Cf3d(21`;6PY}Fwuw%QOa7tav>N6q0vM~ZZw1!Gv%gqw(agB8vinvwq4Au|r% zL{Kz;Z4f)`rn5>q~BSu`G#KAVpo#|AX2QKmP^MtiFfhZ+ie~q*c}YCS9bp zEThhpJvhJ=5lFYuiB5_7Pd-A+aq!#2sP|^@AsWQsCc`@=0Z-8`_*q+t&4bSr_GkF> z7>JwxMnr5b3oL*^P&In>k3>TtYokBCsngG!i2lvOnMi?;CBMAnBPOxfRK=eD8$I5q z1o0p-mu0)%@K<8#dh`L}d<{f%Jk>)X%swK1mKM zp$Ex&{LGxFeAAa#M6YVXNu<-S0v!&^*bG-P)lU-jY^-E=q4<4C7#eYcEgq_HwU+14tWv4Ms|E??@)OmQTXu-Cm(Zc0h}_uY9z+T6_y&n17vvC?ObSKr_) zg(`?8gV+H$KoVj1h;!WLOvtK!x zx(0#yZDomO%6h;+>)dm8IVYwSiq9EnCIm2inimo}jaSxnfa%Ary)n=nIC$GQi;}^H zXYY=)9gZMCb;%+hw-Dbg&wvC4mZ-1|o#QnGC64)I|69l-BTwD!L1ME8&q8)T{lt$Tk2v^K1Fs zsqZ>?{#-TL^}tp?uASRKSGnxte@0rIAFD?g$N|Z-XVCHVe-se1e0HrBnPVXKf@jL1 zDVhrav{)x5O=|h@kkctkbYGL<54`hM+c}RL?QVPTtty5MDE3o#XA+EU3)BN=BXs`C zF(EQD*A{*DHC-TRPn~DioG_5l$B9$CQ?14XR-K90dc7AZh(FdTO22$2##N&Cr{JF? zHzwc-ebW3SRnBJcE?FIW^kB*;AKBuM{sN+NWVuH<`&}^$jBKUePF4O}+G5){L4m#x zifF7=wa~mfR=um#7do&n8fuw7+>$jteU*rx6WA3TLNjn-%5lBnXlsPDqt7!;QdDid zzt{AArSxhn`E$yCoR6Ma;kk*ugV~PW>YNq)P0kA~Mm-KQ`Geb7V4Of6lyy~lpPEH> z4bxSse1ggyw(B(xgqadDn8C!U_u7j&hulwA7Vsw;AU0koYIk7W>0EIL2t>uOpm6b5Nj-^J9X zO_0t#Lr95_Z84dCAHd{`+)gtMfefc`&TDmh0PBGH6o4kD7uUMmOzKJ)zJR_;N2#`u zimmN;ED~K9i{dsdjTZgO`%*&%oEmt9wM_B~WE9}!nWBmoQWS$_DyU0Tl8gSSE`P(> zD6XfGfUFwdZVLI*u>8F@*n>})X1DcE)w z{xp+QK#^!J+a*mOQd|})o_tzdj6!IbE-`}f){XORj9Nw?DN7D|wmRhZsgq(KNS7?| z86H+!h#YgqJA;jsqW95V^2-@^rsRoX+NsLW=`b=bQ)~Y4arAr?F8=J2Y%tJP`yl1s z19qKHc$3bqErDgA;=tgfOFgJSV{edT8tR&#iphizxKu2h2$A}&mRTpO>SyO#0OGK; zM93*+rqrd~cjO2~H^=H=)~?Ah3k>-n_P*H+MnuXfpqZNz2N`@jSAzm-bedxp_+s+5 zDV$Iz{VvwJIntWjn7N^L2gJ)%j{0e|-p9}^7X?zTG1u%e*BFJ(+f$s@`+3XPQ&;e3 zhRR>qO?=ckenE1^;s+p0R%Q?I2M844@|N0;WLpJp*}oug&f?o_allDYhcGr+@|%KW zu=q)tyYESlDk$-~CClsxowB@ja^D23F%lGj8VbUB%O}9BzdPAms7al78l5A!(nNkl zZ@8qXK;7vm@p=xt_*Q<`vX?zUpUu54`_+|k;{GpnnkCdg%!uet@d7QjLA|Hd@iMAh z_8&e7xYdt9Vb4XC8n_Oyr&v{j{sa5D*54qpRaJSyl7=K=9Oma@9%>ZPqxg?HysGfb zG0|ZTBl+b`Ow1H!++3|SSNjs2Kk56;WiKp`OQj^X|SF0eBh(lcWtu& zG*DIPc^ktw$z3MI!k5uUTxJ%g9;^Nqqs~(CbvVFL)9fhnh2(K&@Z>){BfkyAo?{pX z)ie-`&rxY_q`ahdG=2ZFlKq!F%}2Vd<~JOh>wgLjx}^n;*uHkb>W2?lK{-TK0S$## z4RbpFR5SpRDSv%Gp}Nd)FHP*FxAz$gPfW~U?C-vZ!@kD6{NIxC#iZf#3f=dHX;rv+ zrMFHFpH_S+p;Y|6E~Q9ko;IqOvJ<`=G!&^@@4$aBp26_Z5I55$xmhcd z?*MUC;SNa@S1h+Mw_}6zt49uH>l*9AZ_}Sp*6_01l`oy3B<^WNPChRl?9D8)1C1JI zpxZpp^~yv1>Ssoje^ap5IjY@PK*((}((N61yPKQ@{4np~oOHt3k*|Y;1HqslSbqpw*iZi#w za*$EhQbj%l-pe6x60Rh}fuIR2E|#9c0EkJrYcF^jtQekvQSU_UeNIY_Lg!eNSL?Ds zAi{cf_T@HTGyR*5T)82(P})LYptD$1;lw{JU=?(eG5f`fTUQP~16?F%!)|ZWh?TJ& zADr6bh$pF;U7_D?tShoK?S#cSN;Ye)90Y|4LdFXNuv!U<*~Y*%s4Muz0eP~wy~&J@ zFP?BVE@q5>i4kM&Mex-_DvLw_mtg6J%go`2iC2WFww@cn0s@>*NcD3TmT=j<2Pl_P zV$9+26=UT9ezBFg7s{sm(o<@V#0F}!bW7PGU1x*730w?NpB(fOiN<-IM2@g`WGwzW zsB(G4Q1G)2X>A98<6DZ{FvdDZaz6s)jD&&)l3~syr zQkIJ4dBN!k-;J>~_$^b-DX>8r&&?jw(iHx>4Sg0CX4pkI-)JpPdsvu-S8ox`o#y9q zisJxa%4@vjRB;J(!9(p<4koN3K#d;v3*WM(=c6?l#k;xu{dpDFx&}& ziikq~fyRyia2?WaR+<3DpPu3rsdO2A9-r--zIjx>CC|x2R1`f0S_TZoDNqKsgD5Gp zRxU}%o>6itrvxT#&XaA{k$wvMBhOCyARJ3J;ZIm7pv8!FPhWC4YW|_9@+B+(5s$zN z=E9kMyD#ga6wb=Ejb2yM2W-1c6LB9BOW0eu*+TZIot!|!un?y>NQ z`(Mr+oFTpJQz{3X){BLq)A^Ozy$DBh;V4Pn&jiB^K~m}!u3CcP!JkhojOJ|BKv=zuZ+*(ZqK%By7K&p~}CPP8?qn9jCq6Kywxg<=_} zp3=*1R}=o1?12`t-U5}t9C|~B#f#TQ$?X+r_YwDD*;07a)+7TFCxEWYkU(XYgO%sB zx4RTGeO#x1cP}I?4*q+0;l=NyWC2BS*B^MBaWU!CK`P4va0x^eEI$9kDZ8Dm(yYv}fyMg= zRh0GCOlnWtjvuQoC%Grz=@)mKP>cE@MsHq*L0bc;G8;?oj&9+CK!(y#7nAplrXrE{&}P^t=Ji_g^4^quEM zCUxpgI+Roz&fl@@Dk4X&3G zH8Cl2=#%dMQlV1E8u@0^r)F{G`JjH{h`VmoN}AGB)Ibjp+NrHdRijAd`+L(!wE%!* zN?K3uK#TM)tgx{9epLsJa7Uc=Sw|IU8hORZ(&{lvlTmYyDFkxP{bJGKT8(8RLSrSY zeSfUngpEn2W~m25PC^`GEPT*?lkNjycc4;IPRk$PpO$$3I@t&fKPI;8#1+3IIC26; zV&FXgf@hBzBQleVGPhLZ>8rHg5F*o-!@0T=p+Y;?E^@qr=)T4II+GcXr6QlbwkW>y zCGP6xLJkb~rw5CKj<`#Y0mB& zEZ-JO!I7|0BWVspB`OM$M)2uGK&KCCo?r+x80_l$Y5VM^tq}|k{5%#F6+>ppgku)6 zzQm1#s@z8;j+oMv!#cbz*fec@ZX=3uT1<;QahCsHHW^@9(CO{Lsczwf)3LG1~5D@|_fglxaYI+Y!e}RZUGvs3R7c@q-n!uHNb_TgYjb+&l^!an|v{ zuIxFQv)K|9xijhP#;VQ+-qm_X&4j_#UzXsQ;AP{7>L7?8n0WX+vK+(`M?AVzr{+h0 zZY_H~flyG}wDI$*)zf4KE6Siv2PmO@r~le0iwX|RYsSH;Bsa$~dY_Kt)HlF^lLhDi zjZ4303Xki+R&8QC$g8*v<7B%BhMz$UPQ))$3hSMuoc*{_Ve)u-dC!+zjBhC&NFq6f zfNMsF+M2k$&QG_C71ZM zI0#2jDtVsgw}n%DTDW-Vb^X$Rr|P-2^o;4g&`*hirbwkz)@LUdQB z>BTy8Wj-*uH-x;XgXV26?=Gq!z0y(XmpqpA-@9!u9yDcaQa3}tz5)|43kxQj(E@2g z>a(*^)m(jhn^6}liaM8@QBksTahTe8IJ0m?$a!}=nscB8YDk|$PF5DvsK)(YZJTj) z;TSFzQ}``})6qW-JEpOQ5)*RHIU+3haa1J0EsFeS1j5?pB~>4uD*Ie%GAIwQSrCwn zS$Ojqrz=*gK2gK>yBKESJ2uO)MyLq-7~iss?f)euFn2vGwV}-lt|ye;7}@P zV3)%1od^URm?G>%PHs35BJ0?MgX82lv8_F)y~Nb0vx|YydAhA84`IdGoE>Zs#Iy`_ zmAF6JZ@8NG@&eja@s_^-wp;ln7UX5|t4Zav*<6e5cp{Z+6oxz5HR(R=7plc0{u35z9@XO2!$rvOl%B} zqi4D1d`|Ug_V0xZrU?`Gg`k80EE!j+#Y)Bi@+m9P>;BiY^tZ%cpWSWqav4>DG>3p= z{4x^}S{D!ttL$(&Un^6@XQUkA!PDP;-`dV2Y0MIFP{z>RQ<-n1Dt;56Twf>rqJ|nCh1-}wt%VUk3NgzFa!m!rla~M&+-<`hDEr|7l`)0xv}n~ zFBiiFL9Z}Og$lH0g*^~E2t&b__oS)nNo-wu$$n}1*ce8W z!Q?I2%i)nl?M(-3&rU!${xa1j-T^s-OB&Q4;L<|9oc&P4tYVq`>=UCPl0iB0Nz~IS z>w|Ue)CnW(p1tsHeB*Ck2Jf=Lpkvxdd5<>B@n=0d7LeYs^grn17ucf~4#^YJDf4r} zw|9$k@k8oE2;>tGHB+^d@S_0E0M6V{uMzDijpJh*zijTdf`x#7SaCw%CQLu3fq>Es ze^C@6g5r zJ}33@{`^*6aAT07$n1=r!9DEBrAU$^J~Cj%@6ALH0;xN)#ii-T8=sNdLyKoPu7iKb z@Q!0{^H<%(H*jX(Y^<*nePc36CH~72k5Beq0wtxGki&iJyizyhzaH6*Zg(JoOyNxJlLdFNA#=itEZ&=2$qG?rf{ zW?mA-zfOq5AAN!W+`%)}<|H1V>Z(AnP*XiLsCwZ7@GpTHZ3l_ePSkwqYlziARLn_^ zQDOR6Eo&f90b4R#+?S!2xBSb^!A31Mz?D9Pjeoshs971N+*VvU*FqwoMYN+IW4|0P zoxhvE1X_dZ4dQXghJrxFlm~&uSaOH{usILlI%9T~>Nmu}bKuukg^^!_liB_e#v+PZ zc^-4jFbI(#kg^zhthN2W*MO7-9c_PE{4kywK9B+aBp7-g*c++o^1ojvNZ4KO+6!Dy zcE~2aR3m&Bnikkf1%S?Eigq~SW+hr6!0RMz*BPdcFROvu`c%j|g9>@(4gio6h+w$t zx70R(J%UTDYeYy;1DF1ve`FX#CPPkI&o@t^--YclaD^C~!(6-Cq_X8;A;^cTFdHWk z*v@t^7a&ovXy96p&h4A71d6G|$K!{W>kludepn=vn8IZAzK$eNh)~xzWTGuCwU%Cd zZE6BprVQ4+et?p0&(i%pNc#y1A>lMWmhzoxL&Lhom^$9Ox|Xho3>^22q9JKt^&V|g z6#bN%dhXv&v7~myVmv+SrW}5iSG`epI6KPIXo#+xt6rC%xsCXFK=_MjRV)@KX{q(3 z%WZ0fGr7v2a_+e2f&zcPcL2E-MZ&=x_$hcwIv03&c=J+*9e9Qu_v>*7I34o)DCsiG zeQf|OL^*8!B}HiKkL4h2^NX&lk2rFoD2$;UZx~P*gKlNRx?-BBSgPhM=?(B`3&8hV zFFIV|y&gGNvu!?8wFed=bh$?dWqZt3gw(xU>tV^wybA1cSx^z1BWk2bWjjClmUc~( zr3mmW`u&yyKADQ#7jsayzr&x_>ZN7F@4a zx21(Suel!ZzFjVnaMI3pk}Td&VO`QZ^tSbeaS`X$A-5mVXk}#37@>>Bm2)gne6|?Z zG`95EJLByqqFHBh>XCncIuVZDo(J4})N8)ot1k~9H2f{IzW^CNPyZrPTrRXegf4si zx%@P{@pgsBuB?W^3zK0|idvY%?0C*;|F4cPA7Ad*2v9h0maCDsOtgB777hb7l8!!W zu5Ow9#FU1;hJwQN>nGat0E>wAsMEVEp}Zih<5`-zI%;N%B_#&9yLG_FX+tgOxH~Qt zj?104Eu2<{7Ml@j&h+;{uM2~}FKZhk=*VGO66;-U9R_g95P5H+XEKHiphmLKx$%n95|CCM~>Anz( zM~jDvfvEIv!|7O#{_@N1a!K@d&WYlYDK``U%v-XphJknpcW-iZ>dW4wPb0g`irQu+ z&i?yDfb&G^R4SB${i`vB*sl~{DkVfTQ_ zjDWfn=dTZ;dsLGpWN0Atf#(-QTtKnyaIGh_up zPY2#r9uu)^KDnZ^rCwg2`qsl8aU|_0G>RCzk4BOAaBjmdq_M$BQQuLYT!PTBwL8q& zBc|$k8fxY+yJ|M#7TMchUkZ1I+aRwB1_hCk8TYy%Fy!s3S#*BEAy&iQdzRJqF56$g ze8gOJ`QAJsSsvx7JNj{L4KeXK?;%xkdu35)DNVB8^ng_tShLn_Kl?5$nYzP?>b->x z?xDri%hnVMup^3=ae;BU{=D0y3PXD#n;`JEGNNTv@!(TjFe=8^SbLn%h*`HOLM=&I zDan&xSnCYM;f5Y}J%s`Hc@h;ZvA|#^XF!m2KuLmtF zf*zQgD9bM^ua1KD>yfk}P}tAmz-^IfURY=7T6AKBy9S+1>c9){^PbH0A}daKBGzQe z<4+uMKeUgV;?dc?s@>J?im2kUTF~__T*A-=j|CV8X9Ukljl|d;gXHl39gXi1H43A| zNku0QqM2uO=`c^iZ*qKmfBw6@h!X?`LT`LGR~ChjYXS2}_yDo_)-H7H zlv6PB5!KP5Sc_(b&N=@|WO>6vyx%F^0%NlZQUKg@Tea@?`|zQq_#kZ)fWr)hrR^!)Jgn#^`$)fX&`>g$B7q2SxS!# z=PS`@vrTgT4x8kC++AI?cWA8ys0cbKA5xA(%rW#uy)RMhc-RhT|Ms09zjqeUi|TzS zZdtjt8B*IX_m)CsozJ@3mYfUNG6k_VtsJcfFL+4nP<1@6o--jaTA*QHT9*@9T_b`6 zj>3*7S6@3@GB8#JbSC=9tF~;Htqo5p>s`l-(ohtz;b&H;-A5zmsz>vS;iR8IDA{Y5 zfC0n$xLAayLmjLAj#>P_5rKQ+@v?3^OE=IwYUm zPMT^vovx)K@Om~AYh4NUFc)=H5=4Fe{l|)jLd#MuDXS_NDj{0)IX(KB%b1DXzVus} zR9dM*+#RRb}9zZ zI%WdjC7y8{VzmZ1txLawzrOR`nR+n5D2!c667XaFq)56T_jOjACVyV3thi+kug!vk zXDJ+^c)Ka|u9>ZQ=^bK%^g%BlE3NEdOayn*==q@!mt6i|94%GKl&Oy*Mfrwz4@!v6 z$fzYCWTb}zN~Lk>tW+QnNg)`upa~3{b7O>u+|{8Z+#BgN1TArgGWee^Jzjd48$-kH z=9UbXGl%+R-lBv<(ZDs#Ib(h(C(WcLiv}$|dmA%IQsnQR zo*w&?J&a}phK8-U0ZGG~E{J5cr2fZ9457sHOyq}T^VO>VkwXA)Iqx7Ek#$g(fOZXW z0a4u6mPQFjh_NlJc9ccbfldZUV5U&g*gJK!ZRz)jfZI0`37Ced$HeA1X%+mo=0iwMboou&< z-R`2+4EMrjbCbm0nMJJ&EolkBM-VAyJ!G`Q`}7oWHG4JAcn8#@(=%O}AD}X~xl18A zX_qhR&9ra>A0MCmm0z{1Q<+CAsCX~}=^YGS_jl`WZKHd&qUlr^h%KofEq+eOUjLQ< zeObW*4`sUkO3B7nOtvgK*qIF4+u_-b?s~jw{cQ!L^S5HR?4o^&GF&6sHh35Mn?xUErLaOuC#3kE51W8Kf^LptiE;LX)1+vI@Yn^NL9k zZJ@K0&$vUmVrMfuqZsZNg)gJs3H-@nuTn_Uz*PGs4R)(Mu-x2!(t>>3n2E;lc>12t zC#PYGq2u_=M(0?nAGw_Wb^BS%?t3)<4bBxM6KM2EVSZwWHLJ`lq$ZYVnckI$wic&~ z1-_ds%nk6J88S195XxT ztxjMZuyRPe56zv)RL7Wqhvpwe>;P}S9S<}6zSZ?u2YRw7uDf|<0ryRu#&J1Ybixpc zw*xPJzY!o_*0@g)z?z<#w8AmR!~;*lG@sk!N&o!s&fz+-b_I@WRfwkeSPP75Agl)D zm-5@SOclB?+p=rk$oUj({bGSS#^U7A$c%t?(LF&9YI_|1!Q7Jg^~u(fT;~0r^bK~Q zDJT4|_npWIdJFn47D9{CNRyM~8%6owqf6!+dICUm77yQ;l&i;g`@-|*t!2w+pWiP)Z zVT`l{yKY(U6w~d*nreetF08teFdf2JHPvW-a`h-@=WCwrV5}t7al_Dde&a$9Z_m$X zhH$zup1Cn^g+0d60D*7nU-HnhMaEY}kYFx-pITSk&JaBVeIQcOV0*kQhLwNFjBy6= zYgLRj<%cN3w5d_qB!jQrg{bs8ANn7rVkfyx$?3jHwLqZ^V3 zTSvTgb~&e)klaMro2Mp#vX=|lmJXJE!4r=UI}`yrJgrRLU(Deav~Ir5>b{b56$`dk zIjcI#H}yIe7@WyJG^eZ0PoOhX#K1!b;(8SBmB0rj^9S=hBV@34t~CH_*!LNYl<(q@`}L zM^7L6n9|}pwTD%AYj@&>?S6+gvc3_$I#A| z=l!vO0{|XYasO>StztU|nWnipTI#l@lMD+OB z>QuLL!+^kA!S-d&tCs|9GToji|Ffh+39qGs{Ej9&y)0(%mifgo-{`a*+v-EkGlf?} zw0^k_iwMWjfiqHNW0IPr3&{&w)IBeEP7AZPgt1tuHv>TGA%2zN3BsI}8*-R=YC9#EmEFMgxrC;K%H zZ<(6kN;||N7zKRUJ>=Rb)mXv__h4*|pUv0qFxaQ)2gMsT%y2vfueMzEhP@6UUU>A* zX;exC#m{{0DJOfp@6!Ew(cgKDX51F~Fi=G+-WmE37}(_f4m6TSC*P(I*y8_Pphhtq zj?%EO{?hhsZI=U%?L&^Hw7yR5Ly@Ac?Owv|)x>0w-`6-PSptcTbXqlc^zbZ}l1|v&tdK0Y# zUQ7D!=f{-qamrbwSea6R$IO^>yCm3|NUs(H$yf@dYxVbIcx0+J5KVBUVwEw#3ItKh zn;oepQA%m#@mue?ybGO?L_v18i{;PrFF*1%u5p_t{o%6W&X){0trtcKmJ@hd@9fUe zk*@?C5bpW#=w)#9p-#s&h#SxxI}gHd`E@{GKU{prQy7gx%z~lC+@jF$=Pl~D0RQM? zo)W#{mk>%Z*YoqadeAp$Sk=JU)tvgFwYwj49;UyauD=pF_{Tf6X}=32>9vDHTJJll z#rxXxI3SA@AO>;i9Du1hdpP#v^BY}f!bq+{4yZ%D-grL-c)Lp6o;x+}eE7xw7VN1c zOEO|nL`_)8WjQ42Km~qQ9MmCdIIC*QQCx`2DRZH*c>@VfulWLDZ1EA3bq&z^5cOwc zkPb|3Ljjl~-ly(-t{8u_LKD^($88@+xaLs^ z0GT}QuX6wO46t7%OPcJ+-*FV#v4YCpqL~h2syUCEn!urF4F8H11Ye$*!XGn7DbGvDRVF`?g=F#!>T*7= zFIKDNCziT-{F=PZZ8Kg`r&gDsa3u6UaM@|8{vMJ;f{R&4v;Ygb`P2A^r>ZOj^lsGX zqgIGS6~Qva5@oN;*2R<9Gjpq~o%pIsenz+sEkI|3jZUn6qu(gAje92=+rq^%*R-QlhJ3#1>gTXUFVmZb%N z-L2IU>Eb_s(2vmyU&BfrgPxSP^VBgWeUZt1JP3l^+y65#sapvo4}CRIU(vJSJTL24 z%V{-5JN&(~RKrs6;Dia>@GQig*u9+`Qgd>>g#7IN00qo(I+Vk?PJ5Q`{H|M?*3wll z7T<6r=gMXIPb=^>PsvPjFq`Fk1y2f%A;8@h^I8kBq4nFP_Mh#C9*u(lX*yCP@6cPc zei{?@K2-hL_S@(e+{a0dHj_+6;=19-& zss0H?3nzMl>X5`@K21D>ivD2Id!QGIg2CGj2G1&uqK48x2C2~lBOnR|=~3d*CiDLP z{BDeIiF`cU8mTQW&yq%#msL$wJ!*{t*=ikXV%WSM(oWNLElZ(6OFu%~U=R0a)L3|^ z7>wBeq$`E&YwcNny3x95(Z;+}BB}VMPfC>mq$kmbP4WV{bZ*kpgD=5=hw>goi}negFZ5yd=)kHg<{}Cw=rQ1QR1in~ z6%_C(S^k))+P2c z^ZFDNLI?xqWuY>^{tdJxBmA-P^sA{su_2iOd%ajSkcIP*Z$0t%>qlQB=6`8xUHL*w zoNz0BpDy|w`0wzjr|Qcd0NonqZ(zhD!$JA0qOlX~^{QpemsVlsp8m1pl4?ZOr8HmkaC`T^~xy^?HgBm9bjiHg4ay zMtBfe28WVJ%dAS@FS)v=ykHbtC*uw8%>x56M*WkK3Y@JHJ0Wkd6d2YJ_~*w*z5Zft zB^Ll8+_PtY0tx=i6o9Uk%7m^zf&p|b6L2$PcKsWjM3BZFotpk_C05q>OT+%h8gX&< zlIru5TN5ou6v0axAzBqYgMXv(KaZeTK($ub?R3Am=Ve<6SO95fynOh>+@HNFVj9_`KLI`Sa|kWZ`jbXeDSm5l(VuQbV;82jDPg3 zh~}Yf!DHRcI5Zg~ntR zH&YZJM?-4yZ*jV#U4IOC`2jj4BwdvJKJcriW!2%oe&d6CF6_&JF&2hu^dl6H=P;jY z=io+y5}t?uz{J$SX079zERMVF|+h++f_mVaMhIjo-rFd2vTJR6`G0zpu*v4-Gwc_l=2~ zJ?`O)#(q|r+?jH6xYo!U*7$>;mwKhpY!Ip1`!~`qJa7f1kR^OyVK;vwKL=9!5p>2b zUs?U)J;-Q2J%KN!hG3K{*Pb}j1}MptY!nut%pTSq9Eb2Yy`2J)EcZ_E6t$)A;h>5h z+V!Xv8sr>)8F-6QUpDcvQ?F?O<5ypj7MK4qvlj!ig101J#ZGO@2 zv#^`BZ?rNvv+}l99Q7_iK6$###2xas9z3%C#fmuG6Bd3(@tzLGLtEuoK7#B*TVT@) z5qqOEoKO;ORt&5FFuWtbf#&TrmNx@cYA(}L;fNKYAYADykhtP6;B1_BO zk!kR*l*9{0@Z`jToZnpmNr#u5r+EO zM2nRUa*ypI*K~#32gw!3)LWMJygB9aM)Ge8k}SU;kw)Gt%g_1Z$Vt#MWPeXNC70VD z>Y1?J;bO}j*wQbmlrb`_$Wnkg2(_iNgs@;Fv&d-Zc|05PYr~8X=h18IZshu=-89W%qlnKXaZhJX5kQ)tyt63BjbsLVL5aq5 zW;vfHlg(x9C_WL=f@wkwg625kg293$Z;^h8lqqygGH^{t1cGc1BKe-8q3O}Swtz6f zLBQn4h7hK6*Ohlz)mtrA+c@2VA*2jPx zu|!V^0QPG~3ja^CP*lx~xBm0(Sk-^jGI))FRGg>Bdft^awN&86;I#y=udZ`(FSp%) z7GPnx*mFdzvA#d&NLm@Gyi-xI1yh@Kx6)%C=Z7hfCdL4sDty%kn=;J@id*m9@$_wW z3uu_^HYyMA1uX_v^sx60b|XZm;?Fi+&X|*-C&`@Fcw__R;SbFJZDsR0CGDv^gQsMs^8vpifE93)f zclB93s_a5!i38Aaa!$#D$*iK8Ubd!dqhEN7q+}0O3XC*n*B>Tx;z0RR01^rHIglfJ zW75GnaombalD&rQ?vZ_ocRCAaV}RpJL=hs5NompC%mYdC9h!hv9LDv?f#Ma@IbZ>#h8`%5>cP>hD`m>d{1Miu%CQuLbqum`I+e7$-$ zZD0#HAAdP8Le8~vMLnL}q9UnQj4+Qm_!(bNW@B3izYr6Nf~_YfC7I%LAht7J=ww(0h1H29>NkUHHFqwdjaN z7>1R9Ec3{L>ovPB1XAYx3^TgIK}Dz6rv%viMjLD=J<)EXIN*P`Ign-Bs^QitVK%SJ zn{ktc!rjtZjEbkX*Z1G@$E{s$RWs`~@boo!-iN?axUt2w$fwaGX*utL>}SGJ)b5cv z9aMw-(z&>|Dg*vU+V`8~)|x6I|5@Vr%hsGSxuD7WOy6WWYRK=Nhgw062s>tYNfO46 zX&TwnItonJEZ+|k$M!gOb3CJ$gJe&W!w<;VeD%QGj>89%g5rl_zaqUdh63bsz5um6 zv4FBi%=wBwW;~B}^jW)-&lZ>nKR-O$eCT`3dblTUK|BjP8Oo{JV8c32ll_1t5A`X$ z++C?IY+2j6Y#9}WA;r9-Sm1A~jFAqG>n1>L;_?ZIq+A!>Sw7b2NC^`YlM{liJ{V2> zMOp$fRFSzSS%kuaz%=RbMNq}Bqx^T|SVL&ni!dHZcgr8J7~5dj-NF%injOl+qk?|o z5!ZcQQzRJ>l8=le26K0b(^KiZoIWm^h*NfFmf=tT^1U?Ks@zVjO~CX#ltk0{{bHxb zoS=OSPVGnvy;BXDZ4<3bu9sr7kp|i|W0?qC6mCD=DC;RRPBcO^--N~L)c zm5Da`5GoJ7Vi902xBeW*|36r2j!pQ=7}8n zJqA1>k|d@k5Ie4Ufz}2bxa-EA7{8n?)=Ir0ew))>f}4D7v8&%#jGL@~gJy*SPF>HR1-5m{eY@`Uq%MfnFw$x5Afn`K(qQoNns-~hD~*_ZwqW< zMeXod7x{WecDUGm$0Shn#u5G88KpK7G$fW3w^QQ2(VLij^4Fba`9Z?(P_RfS$Ms9) zG&RTJdv4gqCDODlLy={lQ{DJ`@t5nF)H2RVs7>nS7vLXQiA@|-L<+BpvP)hH8ikGS zxCWNQAklf~ISn$O5|0fCXS&~laKa3E3MT}F;@dHCzh0JLXmh~JXo8F1&eYF1%4y1H zy|DeYe1;D8C9L-sXi9**ntb&qyTSWpe={2i5VWIXBx~0f$@u9x*Ff0e-&!0LiAiYt z<`!j~h6_gGzMYeg@&$y(0%08J;`R3d5V{!I76kXKLQ7y%SZJ~^c*;QDZ*EUGvsYWhfIP$At;6PKz@s0X8e>)Z5E zy(N@a1Fx+-T8cPy^y5>JHxoOlMZ;d9BtMOzx%o|>UajOZ7nj#Y>!FH%VD!Z|im<%E zgayiYNyjdzf;}O>ky~u5znv+U_XT}9smJ9pARq874_=(FiFRt7k-Mq+MV5Ccsh5x} z?|N1x-WyTiKV6_spL?=xVfM}QY%ol-GvtR`F{rojZhdx@$~g2bI5cV-B6ktuZMf@S zrI2tn`ZfgoLz97Fs!aQAp*V;|8|?byYRbKES5f>u;^;_;+hOG?Z_-m%f3;#r)!NcJaDfS7H2vy?lmlb#VO) z?vx3$yneQ*=Zz)5AnUILosJtY)I_f$`R+}Gw9+uz9ZgH)K+%p$vK4J*Ybc{?LY#$^ zC@W~9Wj83ply~;eM$$hV~j&8S8Ll zaUnI{CBAK8E+RP|k*D?hWJCDHT+1zho|jVpX(FLr%xvDcAJ@y}h68cx z@t~{2m0%p;NGxkA$Na}-YGxLOA41+nw;TIc_C2U}b@Bj{GYkLXf3^0OVNrEq8|chP zgLEk=A>9awAl=d_A*D!{LkcrUNp~qor*y**10vEb-93newA7r<`@Y{f-#OQHew{P_ z=DKF~UVE))?X}i@-_QMs1)1u5<1HpS%OX@Fc$P2su86V`*+U~JSZ!i;#`7R3FhS;? zVRm}NL3(%_+|3a+Uz%m+Z|Kuw8;&->9hJ&baXDy(_b{mDlf)5G-nuX^+ufmy*)wfS5Cu(B8>YUw+IvxRrz3#)Zhz|>}`%T!28O0Uf=U|s6yw@$! zrav*Nd9P~(V^)@yc`+T+j8!+EC?3;MuYN@sVTM|cdN(kkYmnHj^IYEzchTI;^W4Vb zgm1TKk2=}Bioz^AF$Mk&LJt4ygMiciovXa=f8NpFGd5zPr|o1fvBT#epEW`BCd(A> zT;LVcgB1nR5!{mjUnw>FvE}QHl(KWwhJ1=?CO&*Ntfjd6xx|^S#=gspEk7lB?!hQJ z^E^p{aed@!5k7Ktuzb@J;;#A+ewBqQnDyL$DycWgs=ZrJUbkN-2Y67zJF6re%nK2~ zwnF6rkby9|P6!b$w4iDB>U2n*VXe!Pl7t?oIK!i0xPX|nXEjxCUb45pEook z8rptGaNl3w*^)hDUI_n#4B}NG3tE4d^d{vZ>-B>5+_3L_f&{nS^u8kNvkLHBsr|PK z+?c(I{M`%HdguV$oBr-}a@}KP+&>`xRVSi|yMQSJfD=pZjLKr9N|6ZiJxt;EyskaH z82mZ^{Db!HAAqTJrGQIRe2bT2%Gc^c95-i<30b;H0QCl}WIjoF>CiAXEFXtr0s7{S zD<-c^3F)f>7U}=M>kcYLC&LGZzB+lCiSlCU?lJGso4x$Skd5)@7-KbRRq( z*FrY71p|jznfh*SLNSyb>a@T3enlGa(PasihD&ga>4b)e|4OQ1_y-E^*pB{(N3ln< zo-_eD*#Cm%*=*8eJg3`}auc6tvdoFpJ-a6(yFlxIYA+?+Po;i$?7tgXz71 z8YlnV3)5DwWNUYdy87-(l>|3$pKp5**lT%&`(DeG?XhhsN{Hr1UNpj}dOaUHv1 z|Ld12K+N*}4}$^%7m6`T-z%(q(7jZK!X`ks8z9CxiB>G3J=bE1i>}cC_ zGjX$b(cmEFbpCFO`Y#)H^gxFG_oM#{Cs*M=C_8awmhvgye0gSb(R>^wq^wd6w?RoZ zciHC~X)t@fn^Ye^USJR6oH`JLMJ|2tJ^6gOF16-$ZcbQUuF$C8XVuACmxAMZc{87P z<1ky{Ia(|SAy|<2xMg1h*6F#c4VmvB;RL#SqJX0CpH`><+KKWx9g~U{gAmyOuKj*z zi~G_fi{I`quelGt4z>YM?&j9MW~9|~1(cZ2jRPohbNv^U_G163aW#Qs>qt$jZvR`M zFZt%j>)Q@k6}bn_45iGmI1d^FkDgrGC{X*lZ1vdt&GuuDjrhMb8Tcb0HG#&7ULOo*?v*iZJ_$^ssw`#jckp@6M-8 z75VbICW=z05;jf*eMPuC(vjDJu=tmojdX82_vRbnGSL?t~5Hm zyLTqQeX{9e82QsIKJ&*Z;z})hphaq7w#Wm0JM_1O=7wgBPUondI}84*)w`PH1{yE> zY-a{QyerL-w>XHJOfA{(M-S$L?GG3dx&=K*3p)qcL0CM@tsFLU}7{`0-l|-Dux&z)%wlgc1gQa!`cO z7DNP}t7h5=60?29KEBc2iv~CU*SRH39ra#(B;YcIRYD0l7I5ab=8%M-j5hLg7ZY?z_a7*GqtDR}v$M1>KhQiQVm+lSbojn3wX$i72v~-2GW) zu#U~565m%!$w;!EfekLrHBqiG(5|+mbGF*EZ|b*|Bmz^EP>q!2axpa^Cs;IZ5TuNjUXSh^`-{F1xJK%hd|>hHGsSO{}2cgi~q$B`^J(;I_4&D~zI z5nOcsy;e5Xp^Pa!ezf0(-8P=cA~I;A??+GI)KT(65#B>=Xx+cn975*D9*4(Z9**(=&X(m_{x_(UwP6EDN|&d#hb$xqf2e~ zsde5Yfzl)255qEghO$L4xlXW%o$mJ zg!#gf^7`fgz_X5wTPHneZV7B^1-=7V|@UH#yt3yD?cH+jJ!Qu&p1tFjuXLL6-u z9%G^8Q7d!m`MB4j;zoO^7)^i423etJWU6gJVmEI`#o(QqjaT;kUPeUy6gG!s~0OvAuH)INsr9$tjLKFO*EfcNM;b^DS)IolhG;C;GJzs^5m zu(LiZ?O}#qt*Hk$T&fiea5t$BaF{eYOU4YZAWN^XAooZ(2{9nA_eR2A(6y_v)LtZ)Uox1IlTgb7g< zg5X5!*wWVlji(uVOxw?P+l5;2(c{2(C04n)eRw;b7=N{L7X#Qd#6JRciH}AygKve% zSE90J^+^jcUOmqEe+MNGrzw_On+0XLvk0tA8Ldk2>xqb5?zhn$ut8cs+5zIlXCdvK zPnURvdo>?^I|nL+y(1c^jA@u+1sg0V8umQNbs1JQjl)o`V4Kx$X+Tu$_m6mt#A~nM zK{4Sk+bP8iXi44}49?uzE~ZZSwGzF9kzW)V@hgJ)I~K^Pb%5j*;Yg(Q3QZD(kH zIzBk<==?r@LIpb3LJO?4D8F59hBW8&3R5`A$&vo9Sb7kT>zot} z_qx%K3-K=TP>9LUHTZLfJX@p6h{-x1OLA)f%$X(QTM3o+eKLzxP1HC$Jg5oQ*C+$Ofy;txxC--zz_JW^jV5?e^SjyPC{p zDf~q?|Hya%kpib+nzzJiT*hV_R){#mnkk*i(Hn&6`dt`Jl&Q@%{%dTg7(Wxt_imw; z7|jy+i?~U*?}QNvBZaUa5V+(0;qDT^ahwf;6ozNoJL?fLl@&2c+Z*$iM z3>nm81P^{hc)>}x;YgYPpYA6;)5r@ZyQ-z@t)U-o$lu-+ZH1&3>pf|SmSE?i)TEyw z6`ogVPb`@+#j0Pdb&s+iW^+Z8xe2AX(!33rF`}}yHnfLORZ6M2tPr0iwu#;3JU(UIr(MI`aiIxtU^gKqVDU=O>vR5L)e6pp4{JXN}xzDbdDW|A4c#lL3fn zG%RzN(1fn#55rwxVI%iBFxZ!g9ERwiZwTNHf-Myy|4&Tk5!CTtOoy;Y>3n}l>EksS z(b5l%F7@dIsnFOQGP|0_#h)S~0Pk?$7|#w?A?1f!dGOOHlx(sktiJzv zB$w-_5iNKtQmDv@`2nZR1_v~B=r`^uSf~GSTOg(pf4%1wM+PX<`&3ZYurIcnuE?Bp zWg{#9phBsUua4MDsnZ^v2l$e8Se@kZLfd`5%08`f|iM z!WDH$?lZqeHe%IDkbi$9h~eW$eMpx7LgR*u$E}22na|DBDOCyYz$RIOuqaT*xT;wOCW*=N^7pU9rge7R_FPBeshKD;{4@DrWvuPq{63ybwT zJ9^!BbdRRjkAB|mvaivq+#rjN7k+9vwYBW6`%Bt;@1!I#%UBr%`1=uiaqG!<&;h4$ zAjiqACFLFhIBNhh(REKAZ0LWFvu8|*0;p{;s4sTDo_4hR-<*y{ho{;93AUZ5-KD93 zZ9hmEwotJdzzeMVfNHeKYyfQb|LwxK<>LjDiB`8?0CiY~gg|Rk#|o~720O2?(cc+# z_}=gxQgWwHEknQ%I&Jw)ECdtUPN+xm0@kPgJ2Ja4_!8#HOWVKdHzqOm%uhC}^Q27S z=3aY<0~gbDi>qhq|2`m_L47^tBK)a)AI_%Stbqzmw`l+-)y_LHT!%3}A-MsU-0V%| zp_g9kKcX2<##?*ZdmPT^FBU%K^tac?BYYefz0p5|zj@%_rryrs(vT0WGY}*wU;(cTi9iLgk>!RH z2Nk{m)}z06vTh_RB>9_Z%SfhcJ7!8oAK`KHWXOj6LpkXH6-5~{vmm83fv&xvcl)WOa#sr_42UaTiN zys;;_lJuAMdTC{QDDlnVFHR(U#Uv71oT+&YYs#BK5osX+Tk>))YZLOWb z=SYdm&8uBJITNy(ub8`2B;fW~s;c}$c=^>DYV1DQ#)(@el@ihv8{(+?vz$SgeS%r9 z0{h+%>SJHq2S-MW6C`TGz2P&ZijajHx>b|w<&QA5$;Bq~f+}ldCZoghWz3(HeV9^W zQ580^4lkGD`8A7N**cyUO-VvtO;&IE`7ANNjJxTo_RjI?{n*vmgt@~KE7)gm3iE$67pgV->UWI^$-Gc+K5wyjR1yR#V59y z=(NVQu-Rf%23tq?NY<%7k=0ca&5h2%EG79o_)3$8AW*COCj3coJ%ok9YrXvWMp3}M zgItaX0#_#4_1TDIR8-broKHNU8O!I)FFd&V9pcWz(y=_yXJKi(HGrrB-H-$^`pl$D zS-5Cg{77eH4ZV^HP!Gjw3@O6Gpf(xY&C%D$JI;6Wsn0rT{w;EO!skL6m)W$31z~Yo za6x}5(cqG1YHx(0ua*y{b}+9A{Bwy{fJ3_REgs$0&BO8)TrIki&mJ$drpddSEy1^Z zb5U()x52%8%@CHF)-!6X$iqwPoIMNT{GFAjU>lJpf8_*xV3^~Rah%Ss1`cv~#skM| z4U5o$!`Mp8=r@9t`HtE(^PXHB_y{L51JlV~nZ~%Vhz!~$ke(Fu)jT8)?&WYGqA)Elz41Y9$7-}<{`R-@S8uI*gRPi4 z)e(Qm=Soo``ISetdbeB$THk=)O*^++{QP3eB3Mehq2I< zV{0_?>Cw$64euRv4vRG6qI~%ZfB7;@2p>z=$Ge`peEF;JB^K{zFLtphy*)3JfjNM~C7*%ttoj{p$l zg)b16n1!Ya=bW2F1)^h;vs^wOwbyG`_nMADQW4Z!7m2wO2jQc}zMp!n#otfA!qxG^ zj&F-mh~9AKcQ7b3a+4*^cFvD4OYGsnp{X!OYRuJNypb~TxIsN(s@@IRcx6PLfLf(0 zMDcCNB%oR0BlQka3yg_a40)*`RSv)#Tm9a@W2@e`JRY{sRZ&{p9y==Ii;p_8#^G>z z-rq*Lp-BSaz7~-UxV?QO1-lAHY=lv9?2au`nVSX?U!7QSe4>4qT&KG`y4gE#xuf(o zH*UzolHuEQ<>G~oPk9d!OX+)VtBlmc_kZ1qYQ!Z7jzSnJFzf;YK#8=#>`*)umi4kv zR{L5Fecs74D!QM0wc0t|H#tI2xJa*s+cvnKM^q5b3(v*6Mz*kmFX8A%$IH%6WZsx- z)e(d5UhYbHU)0WTs3w`9egaHlB`Gi#UpI?^c%vTZhMZI;@*YU4`kx!k*tw^!Ksb8x z?!UI{y}0u5IU$?9oP+G7zX0e!5QZ+;=E`cXQG@P<2nhUx{H|fAW>9C-johQ!;=n;6 zneDg1RJYMHb~FbxfUW}VvsT@>@dJXeBq@2X`qjpiZrT=hdDLKs}vQ!$%~t@AGmj z2j+k>C6+T4H^!U|4#x4A>3_05Y&V|ibCYRiiPtC`tVNCrrx|Ja(TWBYIm6ya`f&Gd zO{+k44Wfm@ex~1T;{xMBk!Vtc`tlqvRHZYD!Xq79{M-Fk1V6@Ubnw9;&VG0|X-26mJS8b68&Vq+ zQhyCn<5UHb!}pr&pY@h9V5Ct4o4-fW0rq##1Q0}BC1~ZhX0i469ZcTZcn%MlDNsg_ z3=QpZJN+z#PDOIPz3-wfb<)8l{$@+lOrLIW4aVB`2ev#oNU`A|jKePg>>uS$u5K96 z+p*5rs~rDbbv?YGL8yK+k-lZJpHg7H@WSKFO^xU%9C}zzxf3`oe%$WP{4xY-FYLo} z5BwPGe|D*iz&e-o+0nz(_JdA9e4v{pfo{V9{KwGEclGM1k6~`d@ zZoZeXLo9B`QxY2r0{eo^z&0N}>ixw`$OZ5++P;JlAa~?boRcuZrYV6pu`m?RzhLa0 zm`s2GCI(6$usH&P$Ce3dBJi`Pu}z+w#J;+(OWN=FN8l~hl1FbJ4jR>D45D|hA3F#IfyflGwX#!DpLfo1 z!M!M)s{5Zd4b2VBsxvPuGk<-JiouzVsCP-Q<90w5)#vqRmAa&{%*up@o|YQd{Mrg=2jsDU zUm0GI9e+7~Kbt1sE=e_ai|fLPHf9b7_ZP*etXG)>&Z!-WAKvx6V3<`wKl5juc$~UR z2m&w@kTOg4du|(BdW$4^<_<#ZXQe4o?0kG9QQp=8$xeWg8hwIVfZ2EYudK|98syL9 zTLn7$MS!~z_3=u}^d^2uc`M`G?=(JF7s*5p0<~%;l2|PFmG`MlZRiZ8AC`NxgnbyB zDBM`{dQdP?7&FK+APjL7^1V!|Nr|X*7I6O+#lbq1G!G@z$YPBUny8~$SAIN{CdSWv zB01#BsC)ES<74SOIJ=MJ8Mwlw815m7c2jNudb?ugsncNENyVD$P&#i;G$PEZ%6kiX zU16FbW{{Eb*cLPGxi&YCbt%g@TQcEimMzYP9j&M3O)qFOhi9o>1mAoYu6}2$AIct6 zOg>Pg9YzRm#Ii#i)TeIlm}SXpHfxW)0mY2~*vD7#ewdXc=E z%%Tivw~(7w1^X6ZR&tIH+3<)h17p0Axj?1Iu4#2;HpL2~fLcf3Z#L*B1v@qzyD!Ih zh3W>5y4*JS-DAGCTvVi2*C(=tdvNS&F`_1&7q4OO+Vs8#>CP= z!t^FPo5G?w?GesPtME8|Sv!upG$sR$uUdFjkz$33=G^*@wBJVN`d9UVBvacOVLEWk zXKLD~_JbQb!|BA2z*yg}hp992>@bWtZ8(p_zTpVOJ&H2K)1nU9d-^o8(Tz$Vwk_W9 z0|*$EaiHFx>(*dL_5%vc4AH<*&v7w9JsMIA!@0|XjrgsyHFdDcDxQ3|?#m!6wMR}z zFR|;@asP@3tcI@(D#`(h4XMsg&VaU|c5IAb%SYY%t(AZf%#Aw#wPvHQx+TG8j zTeOi@pF@MEY*5#6qQvoJ25)@kz6**}BcH)LQCG2iDH zP;{Sd;j3|OF0)suliWw@HlgZ2?R0iRYIZlg}<# zAnC+Hi?;b6y46c$z_Ff@wYU^&;zQ!i3fB diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step9.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_bfs_step9.png index 22dba9f343575fc5a03c6fc3e299ea77215beb75..e925a275e9f7d0d2132a20e55e5b8c8670cf7c3a 100644 GIT binary patch literal 44017 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

Z?XptBQuEcb`;@*C>o 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 SCN}1q!L`&Msa2`ig#Rxe?j8~V diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step1.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step1.png index 6811da28936ae708b529588f59486128c26e2d86..30daa752c94f5b7ddad72121540abbf14fa98743 100644 GIT binary patch literal 20035 zcmc$`bySqy_c;2@Fq9xEB`FFBNK2=pB1m_4C@^&Apdum)D$*^|EuAw+Nq2V-Idl%g z9p6v9?{}@ce(Se>_pW>AAD;D`bN1e6pIy)1`w*_Ks&Mnh?Hd39+*Ex2L=ymTv5(*Z z0vzn0vrHaq0Kfs%m9?K67Ut*Y=jP^SXJ=<-W(Jo>C+1FimU_D9 zyV_RHJLfw)=G$9mTM#n{#0-3LdUFH_h-S6)1?&|95?Ckvg`*%l2M_XH4Yinyu zOUticznYty5eNi)X0Ks%J#YM^ajKzqqNaANrgFIE=SW$}P;o(jeqnDxc5hZ@Pv-ZY zjI^QSn7*Tib`%^AZ)|L=Yul~*g{o}cDQnuUudmPOs!Hul`SGhNu`MB{>+oae;nz0g z*XH7HzrKC>_4!NV=ctCL2>6G04WaMqLtob~zpe{$Y1k{Q-L9%`s;sOmFE1}ED=R4} zDJm)|EG*2=&(Epc%qT%7=C3D}BFFivIwXA2Nzi^1yBPAV!{_s~$A>ws z;vJ3rLAk6g*|-s>(0S+3nXs_1fH!F&AtAxR!GVE+{{H@6US96*?yjz`FN3Ged?t)M zC-mLMot>Q>9UWi2diC<pxJ)%xP6i?A> zkZW{)XMKGm4&O{2Su4WzcEM`ksS_#4m7MpE1Zz_|*xSqVV_k6wcbxCH($`x=2ltC_ zfBNuqYtQgBS!)!fBR$(PGJSL!{ou%Bw1*+eKM2z=t~2@=tCau0{Cslfm)ar<+~>qm zYU^31sr)a;2+!wTrg~)gcrPgJ=G@iNPV5r1yrYQ}8+bc)T|$c-hn+v@mf@`(u{#aNF`Q%b?oR-~Di{c}$#0#939xA5Lps z`y!~ta_jijQfjZkF4BMMRSJO|5F+a0-sIndBe+Oyxc=LIuSj*RoAQS0d|_YrO}T^= z8cG-d?w0}9;TQSIr%flD1*hnZ{$R|Z!@=zM%Dig_z~Iv_eSogs9mJ!60gp3I)68^C z=L-*2YjvA0*R`t}V;MbyMR4|x#}AN+`)Wy|*PRy$5EdAJ=QQNJB`Nl)2xtO@_7|j1 zb`DY?rSmB<4%lxSH=TI{K*;cBgRByG-t0_`&;-7%SyA0VZ#onwRQet!jlWzs1jUyx zot~szaF|2~Ef=wZd^(i#N|5ynm7=DD3i#3oQ%NP)cPgicHl}2A`Rr2G4Df+mV|ba- zkk)vEzSjKtL2^Vn@B1=BM6WjzCqZ++k`;9JPQqfX);VkZcKH}%DDv>xrk&JKOGL0A zK-DV%nDs&yDw9OvK~1bgazcRr>6Yl$vE;?E5eximtMURr<)livsV#zL3-yW(F!L2U zHrjoDtz`1dmYTr~wPwQy!_Q6+X0uBopu@Ut!*}`1dhqBrI=7?^4+f-O6yT>IGLh5 zP0n_X^>h zeZ{tA_xtpTeGod%KVNDG48(91uUDQ)?DhnCGWoKwN6d5M&6p|6-=-ko1o)0QR;ZxP4Bv1pJV7%L;(?; z3YapGH3{<60*TqDXUBofX3=8~C0maEqsmP+zA8Pxj^0@KIqUYfTnw-EI_uh9<-+r? zrbXxc9Mm~MXYZ-vIa5Z}HjCy~*(m@fpH}0LdUj{Z6&-QDVqK6=q|&p)hJ?o`FMYL$ zL9AZz9Oh~kiKy->U%zDqO_X#QFKhKLOi2|)<))tdnVs8=-gWLRteRs3KsBm5(7Z;1 zdO+$?_EeI+o-X@5F`b)pP8!8aU05S3!6s0_xf16ftVgZ%CITyV!DD7RaHn10-`9=o z!5xlQp-#PK{xkvHKm{Mwqu?E@9ecFJNe|t)v3qajIOdsJfX*!*b-jAy>E&dZxGs4A zFn37aYOPFCIWuA4FJ({vY5Fln#}u_K|41m^=`&TpcJ}gQ{P0PRp5WGJ@7gO;tTcFP z`7<6q)j^ktPuG=Xi9R|ys_6NdWfT+S- zmle-=m<}(m3FL4;oJ${kc?<#1efYh^#}s}xOZ;B{BLSp=N^5`J`>uKT7Z@yz*0q`S zI&d%TE`oc-4AJ`46`llWf1o|5dFYCX0hkooube;!PvRjsbLjwax)_MS=liz}T@@8< zG=Pl*0s~D_@Kqka)saI`7WKhwE`;q0IB-l90Px&PHlX*Ypd>F(!)#<^G>d@tDtaXPlgnp zRu#p(0Uk^{UmsQniGuD}%Z_MQQFY3uz=S2(7V*HPj@RdD_gK2@unvJPT48?DJxt03j)N!21IHUrORUN7?xPLy8;p8 zK-qTmU7PIU+a9pFfbwhk=fK8;k~dN9~o>Xec?4?FdUS?_Y=Ig(t2!KN%%-h z6JWnqc|X~iptFRwHU-=m)42%{Ug|E7%un;8izxPjp;Jd@*B2!!N$)mG+By36YF-f# zUv2@1I4(h=fj>H4CwtS6;=X~T6a87{^Jw8|UeX+9%Zxpcei+uOUy}3=QA%eoY;T)% zYQb`NNuV(*Dti5OT3eF>#*39!`DWaZly(kYF0rk7N>NWfAIg|tixvdF^(;f*&m#`z zEh#5>Am;V=YgkH$&+>3BM15J$^_sWeCHAtWGuk4G?*P*Ze?X{miRDOohiD7dXV{A3 zR}Cryb)kSGM-C>opYV~u2`Et^#HXvlC z`}ko+3~QY}mxs$4VDi-DS+8g0fhtj6g10>D8QFJ>`N2un=Xz?G+6Vw5rD2_$_gPDE ze5RqOOmUWOeB{TFTDzHw^!Yj$R=! zxh^-g@x}@U3b3Dy3+1>EEy4yPYqw#HN55SEt4cP7ivsiBa z9==d7DCkcE`wtY}Pyp)QVyAPbeyj-69J>{NbO;6^W3@OzUy6PJZ>udkYvxsur8O*M zldK;r7sA=Buof?u;LANW^96n!FFG0sYv_jVf;v$5soUZ+wOtMFi;v&|D3<7l;)LuV zoO|tX(o@$*EJL)eAd2uq=N6(rLkX}>+RVOSa;jigk*tQ#O)Q@!$Rxnz1n98ecXKeh zC`ekDGOgx=-P7L+f=p5B7~idt*R!7!6YKo8+H>maVA98TDI(gI?PJNJ+Q1@q5l?!u z6QGCn!hq5qv+s)#;p1BGrf%9oqTjP=eu4M&%wMxp^gA0#wFh^Fz_f@$5@yZ0udG)L zNM-ZOQ$y)s5(CPz2F6cE?mdb%DvLjkoacFwWj5oOI4L5OcI89|v-AMPC*q86ymAg| zw6jg`C(m6jaq;dUzMbaIZd*LN0;hkQ4Z8o>jL0em=GjMDHsN6eUhs zu42oxL}uu^g`h$ykMs_r7PW>?5Ajl+b~T7=7aoYXCtjSekVue z(V(Dv=G=7Ayp`zpbX(af>)C99eJ+|)JHc~WpyxA+QF0LFH=@tf!ljNhTrOqSMKpigb6gF^`sJ`J4Y1nv5-A? zv*h-0U1tdH5;1{{`A85|9hAJKKWSx9gH@-3~OhyY)4wP3`{X9^!V`i3yKq5_nLQbA*O+tN?3gJuMpE3LCsyY_F+IAaN zF+VYJqarde27=orKx|?#7idez)K3$fC~QJ^XW1epYg$)zcqsr7Cljj!3LWNj59H>u zf0fKdq%8a-k~_4NRNH(oTXn$1%Dg_z5t6Qfo1P5B$wVfN+^czJCbs-jP;av0y@F?~ zy^%Pjc{!9^W`~O4tAsoLj}gMsA*2SO{u;^q&P)pav3HKy*nK?1H82s!O}CDP6_S{FIBndTpmUs0li?*}#s$6+k$QV4= zs7q&G2A-W9;*m6MY1GSep^f1b?6$Kq77qJ6aXlVlD{ZUn0v$XHxYeY$eda#mMnadB zXj#NIkBBFV0b}(dH8JRy-ZH3ZPe=q$c^lTQuaXH0kgg#Fa_II@`A7Tt^~vDR;{0R` z_ISq5G_VLig2B^dqSAD-i7dd$-|Bd$5X$DF3|)v8HhXen8W8vTq~ zs%y2@^aMWM>tDWjQu6OZ1npPE522BM{P>Xuinh_Lf=QC%`04oW<{fl%f z$4{)XcNMFe3045_i2J<4sDycCub9)w{JIvv9xN)9@PGm)z>G7%dVN?nkpT@MMP$6F zGKDtjdmg(k9c8T5+np*inoXA4Tla}RcvXXP96W62afb#Qw|wQbxw_!BtG>Fg&eQ=U z^R=?&1KYFxA}>c+)4S_gij3`z?*X&$jjB;#`+=WiCC^?x3v*>fK(5)tiVE~{W*U5~ zbNsN|IX3=Maw#G<*1x=;`CR@*H+9*Mtktb$$DpaM*w~V1Qw^w<5NE?C+Nt(TxrEJQ z!_;1@bQHDaJ1zjl@ZfE)OesEyR&@LTOb2sqj9qukCR+~^1j6RL=L3zfX)|5ygZjSC zi*8D@?&~}pL1H7Bx@+mx`q)^tqX@POqsYrJDUbP2r=7C&P9uIcR|x-Lr&s4yakC{q z$Dd*z)8#-V?5$Syn4L{D+s||PBSAi4WZs>!`7}`!zt+BsfJ^lO-d!l%^A;M=7Pos< zQK+F-R+u3nuAv^9#SrX3&h`DCqGPhH8Z|$p2jmRX#+Rb}S zS6faxUO<=ir6tmnhgpXI$isJ~=3N>*>GIP((yP5s*-B;kztG(f^SF_y%iNtVBdHZbUx>5WK@`kGB#jI6k7O_xAQfFIWK=- z=4zc%hfQ=b-11dIV8vUHyMV^G8pod9qB?d3J>6V*)!C6wy}U6Tj%l>|kEH>p-tbIwvV}|sDu99vZ>!}^}TtiQ#_YgQ2Uz5J9 zMffuh2x=`9&{qW=nYI|a)3B{0H%O(@4G*JwHcWP>4;KBo6|&t<+P!6_>fQoRG$OG~ z70oya(IK0fC0cLxgh5H=PD^mGs#aeAq3@)+*#Js(;t8`?L^blQJkZpak=zeQ7j1LvTPhFPeV0@pO(&kQ_Ct-Ba{)t$#kDAXN8ZP)ZssABKM3 zs6M=+^Ed#SdYa`~W0#LWd&Ss4=^HE%3NP?}^`wNar$j~|xHJD~@zfag@NMj23d@_f z$o*W?{_6UY`FWy@KvKE&Ex^u`$|PkAj=*wDcKw!n!CDYoM02gYr(ET&ZExhz)-u|A zR44ew!8}@(eW@QeiGH&JWn+Gfo-1TH1oLaT1Zh41=C#c1Y?qnyrPsHD`lN{`@`n3c zsxPI;#MQQ>92T=4dzAY#eAENIyna}CUT)jF$?+CFTnuHxO@|Jzp!JAT^CqE;xH5nZ zRpkn!j&>(Q=e-_^!B?HtJo9r~w_sQ~T#Xat3_jBwE}z3QsBAoRZyz%)XyR^wm5h_F zsnu#=j!BPAjH&|S3FQJkws6!O&v*T$i~7VRJi4h3K2`-Z+H}WWj*fGszyp>fj!oZu zl&6X{EAb1%9+6gk z4=H-Nl!=zhuWL&2cj;Ho>H|{)#aZtXk~-d$R*Fi2p@UI9vyD!q@5gQ> z;Lt2K6W1UaYVMz=z0`wT7~P6H^Z`CE$9*SIoPSQ5R~6> z=eN}5!BJF|$is)f0kk^ic#-CXwZU20Qx!|C64^1_q#FnxPBTf|^!%9-74JMc7pK;6 zUU%7%ak3!qVZhBN5FTTHHMm*s5WgOb5a>Old}O%z(0^Ldb7KS zSWI+jQQW@$GK4^M~Z7sa8i>DaV>>ZO9hcrD>+oVum% z)}`@UD)TMSeVLw=<+Ud>`6VOoesb+WM=g(yrVe`(4&L^?7Fn6I>T#=V2)6S#p-TeosjI|7B zS&V+;p-IW>%sid;G@YT&`(tM4~FrNIWE7TOlF+G3nd**o1+CETUR+Y zX>z|+`$3vN-L|^@O^AoX&Sf6 zvM(9reSSxD$*IB#b@lSctOi}Gkw;J9bUJr0M^D1pxchN*wQgQH{9BCUnt=$6@k*OU zoRF6XL_Z3dNCNX$k{dq*`{@Ezi(Dzs_lV@~>;^s_b-MuJ3If6Wfj^j_b(-+ugV4Fi z8daM`E_ccmdL5!o;2YZ#7hU-Lh7Xr85V0xlwmVY*-DOb}zieka%}SG0r+^#xa+A?;4iee;E|t>K~>OoU=o`U-{>@{Ge@(M><%p0ABluQs7IHOiskMheU^4qHR_0HTKiw4KH{{NVP3Z zb~TMNmP+Ux-A6ksayeh({hsq0<}wgHUx!XF$U7Cs+>&m7&?Cnv5EQ3>0*z=5mt`^T zIhGa29oq^L78dqA_M;o9o^*a!i=l}-R2Dw|^n_JlD+TD`?>&|+cvT0r9ezC^0%Vo5 z^7&KV12*iq8g8*O5k7CdwcY=4P#Pc8^Uad+WhmnM2%upZQ9=OB*ZTht-js)bLo6&%S zTo^*#iOBCJl8m+s`ltlN2$rwq`Cl()O>Pu9z`VnQPXojCr}HRp%JjGH_b++AHF{mw z4{Z=Yj!~}(h+*m^HuIrn+>d zFGt|NGwU69CcX4!tIm6#apUxwhs%^8%nf*3GQP`k{W>RvV!(TmzUvWLlj&Um2U+Jm z8FOlM_RftAJ7MDbCJT5V_`kz%kh9)bnCqu)MDyw-ulJ5`gJ_>X(ow%ezrA4zXnY3X zk%N%+dpB2E2+T^zVUL~w7rX)T;sn3O9U$gpvH?r+S(_2=753Y zvZ!G~1VHdF9EJs;`@`7E)-%C@z`t>gDFKNa)vhx&uA33Aq%yfp_rSBy{zlh^v-c<^ zsMcBfIixNUI5PS7em>wX)M%qui$M7V4C`p9nC;&Hb?*Vp5109zZ>rlY)ZlZ1vE`Eg z65j`U`7SvU4#nzDr}fXgJlCX3yyxJ$4}Sw@z)@F7{s4z^T?*b#I)=nUJShL>1U8L9 zQiD&l#77l!LAwRR=0^i*nlcz5i(A5B0E3;4vDG8A0XY_6_&)%GU98H`FE|#SIa_78 zk^Pr-iGe`AWAwS6*pabHnMFAQo)9OdW`tvipzK^*{wDfWH;Z*J*_Jjg19_ z!~_3VZrlkF`0j^%>`&%jT-{vWGHvP@I~-3Xb8ujQf0Xd|$bR0@<# z?;k{{05Z96cqBJ%30?IB>AvLj_XpM2`ZBni|8o))SnG$`5$wCTHA!3*H;C`O*~Y04 z`I~J@HxMtLj9a^<*EB}Qe-XvEB_F^R4*nycwv;gX(H@a?_Ro*L8&bnYqfW@MT^Oc+ z(^>hSf`{TAy#FyEoCG*J^-bd_Mp88Dfa1}iH4oPV1G7)}2loFKYePj4E#)lU2fEIu zk99*J>G%Y4^P$f7@gJS}75(7cOF3v|ipnpr*tNZ}jr%wAxH$ouE=s%H%S8!3R-jSt zZ?VG`OAhAW#-}73u=Vx(R%@8>wRrxiDEwD?ur-PfVdw7fy7SqiPHAc~Sn59plK_Ss z+p5}nmd^9Qx4D~1Nx_PN{rn&#_;1wi0kn@X%X>7vX5UU#?~=;95dAH*lei1dj*|pD@51DJjEH^JB%1k>S=A>l+Jb2!RZL>uxCRA=fxKAlHB z$pVfj{stx<_#peDr(0KsS}V{kyQ5j1^KX`YB7H{6`Zs`bQn?i9Q<>W)qrun$Bev-F zAESj8KG)thih(X!8PZmszYiN*=G%Z&gd?({V*-B_CH~8{9N;02YP)$5B>!w$EE4Tb z^$&vZ(y3hY2^{CfCVrgACnjoN--OaU&-&td}UbuKo}tgc&h{-#Oy0nkgh_olWoHBz=q*83l#vkz2^0n7m|$-GzX z8%M+C<~9E?28Kj(bRqPIV?em<_&?TcfqeY>ZnJEx|4(UJ6!@DtcY!zW|JDuy1k2yl z3WNFI|AX5A@jsaTzrCzzadr#Mv~&L-QVTH$czjQT;Mc(#`~P+fSl@Lsh}3)KE^zg4 z!&mtQr3uFCrLaX{{_+WACsS9brutSCd6eUL;|mZHPDZi{5LlJuLGFRyEY)q@{tf?^ zf4lFm!p=g|0tvnFeuTl5yC3!w^?1tRbiV()mfXXKGqOV{5$&qy_o$;fqTTLySe3=k z7j;sFZ&a}@=f7&UPnv}0kG~#=0!kDb``QOD}#}h!KkFn!y=#dGg=|gE_Oh0-Sw#u zdmernS4#slF+rejHH~dap$GDZ60X$SKZ?Tj*ZnwbdCMy2D&qGVpnom;un{tIAtqwQ zzPqX{r2C6OXt?5iPWi%L1a5rh=hDNaZn{s)UYhWD%?2_XLLIPbcjf{OJ zst{iEu&;Sa*(-|K*>*vu!bJ^L3H21Fl|1QK&T5w(*t#Vu(0C%VV%)w`kakmo48KLUlGaIY!1NL=6ks zT2-r-?y-lYw>I>k0d;pqktQ)SeJVJA@#hCaG7>qb`la66l`TB|U|z z2(_2G{>AySkWC^k$#%NxN8h?+GI#(jayo5$S#JaMxjDvj{2@D1tM*&S;|X5djn3qP zyR}H-8pGs;3J9`|HQl|sk{VWwm8!3mw_!Qq#Su`_*23;@CeTE!>0N5eZ|+G}zapwC zc>og>7Ow*ju&lGh5O&w8#FmN(5o8~=xQKgFnTH<%Yr}D|2xzkM?PA3iS6rnz-1#qy zo8e^Aj^0Ajw4M7umRr_n2&lTrUCYcs$QkGuugfS)hYLFpl79a-OnQXQTaw{O2pd7z z9#g%+p@%&_x{DohpXt@^6MvLCIQdGkdn((r^3@5{Xv9Ff8-5{%Yp&@tC~|4m=+mAh zM8lIfsq;PogVoKiR5uaUZb60R$cBNmFWU?-p|@uynmZ60B7~ku%|@246Qt>dm~bQj z0cXYlBNpy)vUexNfr8L@0rxd!1N^=UQoBWeKxSJEA4?tLejQ$Jk2jYM+6c!u*>mXC ziApr|a()-joO?F**7p+GKZjR@x9}jRJ|vJBF~@#K6&YA;1zc1RS{mGMWdV~Bh;@8H z@13umpyck@PDfggmmqn55;#Mz_50CpK+6Xl~%Bq_zpr6dVO92P3&Z>d6Ytv$0Hdw0-s!dLPsqf#3Mbh#&iYV+pF?caZxvyfOoF zi>dN2)9De(ypO!UrufAMtN0S#nP7ED9afQ*#|>70D9@BDwKt@ee5}eFj%KRjiN~Ie zhlD^EZC5Il!B|*koB&}Y)`0vmQC~N3uZFaq^`oWotyw#NQVb*m{vH`7e~iV3%IP=CMr?a4eXa39P-C>avvuy`?N}oFK5S42>pCT z9wq;mq43CiG}R?HMi+fl^=kj?7)a;vu42i*hxSLPACn8n3O@TGLi(YqH=jb<`7c|y zVfZP*XYF2aBDJey5?2cvYDD&jnvwgSOx>>T;k{`g3@@l7=oo|Zp-oaRx&GKAkGy#D zGIVotBrTlDHb)QWt!g_=!d6gca{k5YM^QG?`c`H7#-C<EI?AFvKRP9zUlvtu zWM@sU>7lcxse7Do)bUJOTMt_9Sw`BM8Gf@BDPmFfXgy02_+#j8_}5*3eiK-a{qkOT zh;XG&;Z4T9l|I8H2hQvwKPY%}r)Y}Z+?{{QO_jM6~;DT?{#Ck#j0ws$ay zD$5Gr{FE#!Efm|eH=KdPAFxlu1_F_Kt^mX~n9lIh`71o_k0cB*j>{Bl=+m17K0lW6 z%wHbz-QL;to(EBVU&c$H=ky}})4qo+1x?JNZb?#q!}icfI0El{@Orpd7Ra&jQalb$ zDs~v@{f?0m+c^gT(LN74Wm2ajK*$}`pTfH20KBjBjriJlVE)hOUFmc|GFZrpHwqLJ z0ubMW`;+DpL(EyuXZ_`DSOA<()Eo|%d?@b15VoHReX%w=9hbnThnf&jy9!)Q+#f`S zcE4K>8c$yB?s$@^SEw(*v2GW5@>sIXh zGC5HV&b0lx@NxR~oGp^u{YmTnmvU2$4%_SR${yY}v7oIVmd*F-l{uf~QyAZ!yE-NH zLd{8k0U*C}zJp!5$Xm`_k9wcAe+iUqx5iy4ee`zuJPWBG_udQjBrLNId5`f-sl>TXL!W-L>K))CgL_afqanNto7JV6OJ6*uk z=MI*pr=eJyaF(y~HUOy#_w_!;L8NBEhiOp`2RFyU^miDkFCdg- zVc_BfIxvCN4=qwH3McIXWb8`zm+NSvZcC2bsU-ZV{q%d;14HhX0W=;K;q+QhG(HKF zuvhnO*Dm~bt_7+MX)@8NGS;+P$8AFIT%QDX94ibN{l*gM6LSkzy^#;?a>KTp^ov=K zxk!#Hmw{a_E!>$J6jXhpwkONiqa*;c&-hhIIlEQG$#fYwE=A~KY#N`$n9T~6F5wb- z@#xTNw`O(XFzQb`R|x2SPF^<&t$#H$|4E5aqr*4@H((}ZzM^ke3<`2$&~D;tZ1wM8vd`cN)v`x=r zT)e}KjN{wkB$gAm2s%OZtyXfc81>6u&Xh-yhTDz-t4WuYIG5hU&K>Bx*tS(|O+ZPu z3;5RT-IzS_tOGT}4P_=bImr{hyz+QYj2O-2`0cxc9Lx+$0_i)@qSQ?4y>{&0xvFC- zbx|%qz%HKbeAm7ptURgU;w{KnUGu!#Ux|G4!4MRn#4$10=B?zoJ&2&?kP350Wjvuf%kV>3)wYRcZzas=xy#+ zZ*%SqO8{|vaWNStK=G)o^Dpw{fp}y^rk`^>RsypRzhom+x;4+tsEYXBa8ly@LrzQXd5 zQR}AFRMXYw&zRF;(An_1zs+_a=6pSB3qaRfFf^IsEr2{H=j|>%0N!~k6M3uc50PT# zbN7<#sCM($%~GEL;5!-yApJ`YC45oC z7kFY<#-W^lY3MB&^Y3k={g5xHJfvD)U9UI*^$r-4u%;&a<-~NSB1fB>$ zUgv%VyDX6}yNbV?W#{Ven*G^|(RiG}gYm(9M5_jPP zqomXDBOjk}tIe?*at9e%sV3>ySk-FK)&Th|QWdTAQ7w1a%@2yKe2>s>c0|p4#lRm&i~~ZF(76teGSmnps418`5dH^JXqW6c9E!Vd_jEyiID#YnU;cgICTYS` zQ;YMsXxP(Yf}?*q|GEqx%mzdo_q#jz0_)@zXu?~U_G^d{K2p>X=d+1k>lQOqKF?L1 zBUaNAU`dIh;ur{aW5@y4eIHExM{FWOyWZ`2tgqD&UzqWzs&93`t2z4KUO}9QRWrfb zB44dC#ZoMG4`Xs6^itXLC!whiaIFM{aITyTB!7~|QneS4baRvLFn{%vMn%Qmk&n$W zwGA8(b^m!YJknRjCQ?eGm7llgoQ-sY&}9()g8lg3L>c4{=_D`O%&>_J)Kg1FZt%_< zn={!@Pd1Nb?wZtIS?j-xQfUGeEV=;Q1rim}B8a7wH0(Qowl1O=$6VMKnp)H-}UNe~(X+`owAv}`lG_Z5!! z($>5qT&`YU@qtkl8Zl+ly`~b+C2hr^5v(!@@+p@H(#Ks0I^J}ng3+iZi|x}{p<2WJ z%3LB{e~ev-SKq!QRTYZekv6A?C20e;f7m#tPwneHfZf@<*s$fhX<#fptlt`Ut%wUqldWl)@b!7c1ymBQc_Zmu z`gmA!!Z)qmnjD8~L*31>5$Sv4ruVh@OAl;g!-GVRCnndrjuTb$Pd{-8p{CVB%5nDI z*koT}ZOoj-_Ovhu70j<-UX(=o@Jt2xicR=ZE)nyv8{)PhAB zbwOfT6E^&~pc-`^5Xr6TdEO^|G5px;C<*ah75aqdc5LPo;~=QJO}t_wdPeL_ZB?rP zY@BhE&Ixm+9Rx5!otP5%9cm#(C7mzZYl_KW%+2j7a9(>+P35opG`%K_8Y8g^@B_ z&{npDk$Mv&!fbHw6CqYmZ+*T2kbv}RuNS?tF)`%slQIpC?l$B2AL=mYtjkEMOob>@ zr)@?21+T59s6e%8$ij(XGznsKgLAKMeTdK59be;Wysr>QzCCJT zM+5V(P9oV5Ml9+n>pO3o?jO1HN!b++ukY|s!2WcJy*yatawP;2oTWDqmL|ZyxWvJ# zKrd;-NEnA4VD&uNtO-`fjQ>C_J9^eAWH;`&d0cpY~8{QaODeQN{7IU0eRTCa1fne;nAI9E6ab<+Hq{$ZY(xOMijy~3{ z`4*O0g$f*(U&#ka9DOY_k=An9RGS3p^W#?y8(ZUHkP>+vo3jrli|L)Lrst^Ji_ zV2dd@)A;GWcaG+7TA4n)n6NrDeMmxzm8(7+ts{e$xW1&rAFldMQ-NoD8deG(ODAvM z?N<*DB9V*=pO`7_S6zCG+L!z3DN`lRPLD>!7-9A#4S6w9kU{2%R>};}DOCc<%s8tb zY30v9<8FQlpf#k=&b5}2iMffDN^9~N?z@m$^z%)UFO~0H&kmEAqs;>CrJtMW`YABe zyPqNU_7%pJgM87SE&Ay$kJ?7Veg^$wzsiFbLCgoip8?2J1f7kS1C z5J_Et#Mia5-OjT;%jp)s zRsITW|Fq*i%oNvg$2}zT=?ytB*-MT-p@kQ3Yclm?C^nzUkscPql;L6jy6GZG1B0*( zs3zm=F%0$wUA9mNIcE@YpqBdDJ+S+UBz(D=<_>y}J)>4^KC$gQVzE=0W zy7w!)^$bhGn%)Ow5i86ff{N&xVW!`ikCO|Sv|00QDPTK0cglbNbs0uj&6y2*?Jzw> z3~wPI@a(OOAP7|@sR}R=Nw@KQM6erRpoyjd7`LjNUh0(Cq{sGV3STQci7mU%1nLn5jT5#zPx!RRX#|f{< zf_!}IN2>p}4q}Z*T#+gA4VJ+N$T!@0jsfi`(RkRfrFX%9%=gMXyORPrJ*}UIk+5eg zA>7!TzwFV#Sbqq!oa0xBO6TxMgRB@cfLj*I2#h0uv%_mi<+-|Ih9r_(U5S=|NWQCv z1{J@L`2w>oo49j83cRf(*4G5**UK)gFvCcmm=WD&E!x5DxVzyFO3y6)Rpdh+e?u{C z`UbGW?ZmS!u8^+!`}x-kQn|3`si{vB3h9w>lJaXJKwKMpMTWY&AK~+)!|a|a284{) z-p)GUp^j)9jeRb~6lKtVHEeWmF%XXhxRrHxKxWwkt%03|I9jP@!MSTIjC>IRAcWQ~ z(vrbjp77`QC?f23UITJrx;3N>99MvLWU>m`5b6KHZQTD)m#9}+6zDk%uNMNe zzl}QBJJjR1RtVo?0Z=o7y{M6H0chnsBRJi1=4U(VcXzpM{JaS`T@z9WY|k~uQjozE zM9vs}&awaE!IaP#@S0!njstRU{qN*Biy#Y}c0SR52H3SsoD?v-9)tavcQ^T@YL5=Q zK2~!xMSqY9!d{14AYTUx17)s~hdTO)P{j5BS0z{e&Gxp%zcD>?bJ5#+sB)3#DiKyi zjBimLG&lOBjcPTauA+)c%!25p71i=?+?ryjYl;9;m8PjF+H49-k)>U=bZJ~+lQaxdr|YMNGSgEI0^{`8%J~@0N6cyMpS#g+-ofSQlsrL zrfsD}33Q?hWEEJ>dU^Ewp-*grprz3f;MmcIu@caKLoKBjeXJM;gKkHe!8c9BR-`V9 zk5!wD;^~K_VUsn?w!qoRw)&!^e&o0VLYn^M4T6lxgA3=hr9d_mZ+>;XJpE?8o@@#};))JSJg z=h`&6<;xjXKM%TKsu__mm9V=}9j&m}gYd?c!&SZeQ`L(W-niAFYa1>a+=ev8Ic!ex zlj|G-30cJfz{V%Ag&s3B_i=Dm+Ro|DBn#JJ>DYdl0oJsxI%Qum1C0*S;fZ$s<4^fg zns-i9{uJKg0emOY?F;`XoHKDRn6>-9m7BFO2`<_6Tih6?DNw^p|4@tu)}G3P$RvjA*$mv9+{P^G*s!GF); zSd{9r#ClSkL649RXnMC-2cLA$6DlzPn=A7>wd4E&uJuFu}rIm6Ru!I zdSvktsFaS?T10#wBmz>`YQcl$V-?kt9rfA6E_`EV3k6U4*NSEu81CUv+!9Z)&@8H; zQfVZ-+JA;oXZ$+>k9Myk^U6SbWrhv-8T2p-l<`Y5(5;1u4@d0E*4$wAw|j>0`E}Q$E`LuCoJp=ZFl~cz*bF(aU5DaHE8P75*)o38=$+^6smZEQ^eUvH^ zCf}kt9KFQCSinZGK^Uh3+<{n!4dJ0`Vv{p zNYp3i_DpPB zRTu@`kU9%+pEU_N@9P`UTK5DF$+Vyre6>`m}RlQ$NRh-T3IV%V<;-A@Leo}sR~6GzJzmfS4hiI$|CxzTjU3_-e(yk99dr7~s0 zHH_G2_tnu@c=~yL#OC9T0D5a$!HX>NM4bX_9OXT_Cx@N>6-i$N?QZ!roG7nowUKfIFN$3D`{Yi_I}Rhut?D-?4Pg;%d%(BoY2khCoT#5kp+d Vqld2>HG6+wd&LQJf$8A+=zsMekj?-A literal 19865 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 diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step11.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step11.png index 343e4a6cb20c4b6cb83761e2ca22f138797f1f73..6aa6d3d6bc67431b94d4c6caa5a3a7b0b5ee4dcf 100644 GIT binary patch literal 39838 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 literal 27109 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̘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 literal 27683 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 W!*b4(RxF-+@G{J(qdxA@F34zcAcXxM!yF=g3 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 HMezRt&37;E diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step7.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step7.png index 5153dd254f3c8c7be34e895fd5329c1f1bf7543a..033a61714b9abc0c7cb5167e3a4e8f5e7f51d014 100644 GIT binary patch literal 29117 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 z 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 WzRz~N`M7+vJE9% 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 A_W%F@ literal 28862 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

Cc)Lk7qq}@w1bof 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 diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step8.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step8.png index 42b3fcb36799ae9d05271f78c4fb784775f18791..e3eb4ceac8bf1473e878937622ecd5dc1566ea25 100644 GIT binary patch literal 32212 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 bwv5EE95W~g5fX^KUs~mf=Hn^_%QycEwxMv) diff --git a/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step9.png b/zh-hant/chapter_graph/graph_traversal.assets/graph_dfs_step9.png index afbd16f390bac2ae911468d716e4434a89cb28d6..7f5d4c488b641408a49291b72e74d6fdfd9b9434 100644 GIT binary patch literal 38894 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 de~-7&!{f=mnXqmfZkLl^*1utLyHP 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 diff --git a/zh-hant/chapter_stack_and_queue/deque/index.html b/zh-hant/chapter_stack_and_queue/deque/index.html index f4b1c36fb..33f6194bc 100644 --- a/zh-hant/chapter_stack_and_queue/deque/index.html +++ b/zh-hant/chapter_stack_and_queue/deque/index.html @@ -3723,28 +3723,28 @@

deque.py
from collections import deque
 
 # 初始化雙向佇列
-deque: deque[int] = deque()
+deq: deque[int] = deque()
 
 # 元素入列
-deque.append(2)      # 新增至佇列尾
-deque.append(5)
-deque.append(4)
-deque.appendleft(3)  # 新增至佇列首
-deque.appendleft(1)
+deq.append(2)      # 新增至佇列尾
+deq.append(5)
+deq.append(4)
+deq.appendleft(3)  # 新增至佇列首
+deq.appendleft(1)
 
 # 訪問元素
-front: int = deque[0]  # 佇列首元素
-rear: int = deque[-1]  # 佇列尾元素
+front: int = deq[0]  # 佇列首元素
+rear: int = deq[-1]  # 佇列尾元素
 
 # 元素出列
-pop_front: int = deque.popleft()  # 佇列首元素出列
-pop_rear: int = deque.pop()       # 佇列尾元素出列
+pop_front: int = deq.popleft()  # 佇列首元素出列
+pop_rear: int = deq.pop()       # 佇列尾元素出列
 
 # 獲取雙向佇列的長度
-size: int = len(deque)
+size: int = len(deq)
 
 # 判斷雙向佇列是否為空
-is_empty: bool = len(deque) == 0
+is_empty: bool = len(deq) == 0
 
diff --git a/zh-hant/chapter_tree/array_representation_of_tree/index.html b/zh-hant/chapter_tree/array_representation_of_tree/index.html index 8470f677c..b1233c236 100644 --- a/zh-hant/chapter_tree/array_representation_of_tree/index.html +++ b/zh-hant/chapter_tree/array_representation_of_tree/index.html @@ -3746,7 +3746,7 @@ """串列容量""" return len(self._tree) - def val(self, i: int) -> int: + def val(self, i: int) -> int | None: """獲取索引為 i 節點的值""" # 若索引越界,則返回 None ,代表空位 if i < 0 or i >= self.size(): diff --git a/zh-hant/search/search_index.json b/zh-hant/search/search_index.json index b26d1f563..9b161eee6 100644 --- a/zh-hant/search/search_index.json +++ b/zh-hant/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"chapter_appendix/","title":"\u7b2c 16 \u7ae0 \u00a0 \u9644\u9304","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd
  • 16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c
  • 16.3 \u00a0 \u8853\u8a9e\u8868
"},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c","text":"

\u7531\u65bc\u7b46\u8005\u80fd\u529b\u6709\u9650\uff0c\u66f8\u4e2d\u96e3\u514d\u5b58\u5728\u4e00\u4e9b\u907a\u6f0f\u548c\u932f\u8aa4\uff0c\u8acb\u60a8\u8ad2\u89e3\u3002\u5982\u679c\u60a8\u767c\u73fe\u4e86\u7b46\u8aa4\u3001\u9023\u7d50\u5931\u6548\u3001\u5167\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u7fa9\u3001\u89e3\u91cb\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7d50\u69cb\u4e0d\u5408\u7406\u7b49\u554f\u984c\uff0c\u8acb\u5354\u52a9\u6211\u5011\u9032\u884c\u4fee\u6b63\uff0c\u4ee5\u7d66\u8b80\u8005\u63d0\u4f9b\u66f4\u512a\u8cea\u7684\u5b78\u7fd2\u8cc7\u6e90\u3002

\u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c07\u5728\u672c\u66f8\u5009\u5eab\u3001\u7db2\u9801\u7248\u548c PDF \u7248\u7684\u4e3b\u9801\u4e0a\u9032\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8b1d\u4ed6\u5011\u5c0d\u958b\u6e90\u793e\u7fa4\u7684\u7121\u79c1\u5949\u737b\u3002

\u958b\u6e90\u7684\u9b45\u529b

\u7d19\u8cea\u5716\u66f8\u7684\u5169\u6b21\u5370\u5237\u7684\u9593\u9694\u6642\u9593\u5f80\u5f80\u8f03\u4e45\uff0c\u5167\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

\u800c\u5728\u672c\u958b\u6e90\u66f8\u4e2d\uff0c\u5167\u5bb9\u66f4\u8fed\u7684\u6642\u9593\u88ab\u7e2e\u77ed\u81f3\u6578\u65e5\u751a\u81f3\u5e7e\u500b\u5c0f\u6642\u3002

"},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5167\u5bb9\u5fae\u8abf","text":"

\u5982\u5716 16-3 \u6240\u793a\uff0c\u6bcf\u500b\u9801\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7de8\u8f2f\u5716\u793a\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9a5f\u4fee\u6539\u6587\u5b57\u6216\u7a0b\u5f0f\u78bc\u3002

  1. \u9ede\u9078\u201c\u7de8\u8f2f\u5716\u793a\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u5009\u5eab\u201d\u7684\u63d0\u793a\uff0c\u8acb\u540c\u610f\u8a72\u64cd\u4f5c\u3002
  2. \u4fee\u6539 Markdown \u6e90\u6a94\u6848\u5167\u5bb9\uff0c\u6aa2\u67e5\u5167\u5bb9\u7684\u6b63\u78ba\u6027\uff0c\u4e26\u5118\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7d71\u4e00\u3002
  3. \u5728\u9801\u9762\u5e95\u90e8\u586b\u5beb\u4fee\u6539\u8aaa\u660e\uff0c\u7136\u5f8c\u9ede\u9078\u201cPropose file change\u201d\u6309\u9215\u3002\u9801\u9762\u8df3\u8f49\u5f8c\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002

\u5716 16-3 \u00a0 \u9801\u9762\u7de8\u8f2f\u6309\u9375

\u5716\u7247\u7121\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u900f\u904e\u65b0\u5efa Issue \u6216\u8a55\u8ad6\u7559\u8a00\u4f86\u63cf\u8ff0\u554f\u984c\uff0c\u6211\u5011\u6703\u76e1\u5feb\u91cd\u65b0\u7e6a\u88fd\u4e26\u66ff\u63db\u5716\u7247\u3002

"},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5167\u5bb9\u5275\u4f5c","text":"

\u5982\u679c\u60a8\u6709\u8208\u8da3\u53c3\u8207\u6b64\u958b\u6e90\u5c08\u6848\uff0c\u5305\u62ec\u5c07\u7a0b\u5f0f\u78bc\u7ffb\u8b6f\u6210\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u3001\u64f4\u5c55\u6587\u7ae0\u5167\u5bb9\u7b49\uff0c\u90a3\u9ebc\u9700\u8981\u5be6\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

  1. \u767b\u5165 GitHub \uff0c\u5c07\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5009\u5eab Fork \u5230\u500b\u4eba\u5e33\u865f\u4e0b\u3002
  2. \u9032\u5165\u60a8\u7684 Fork \u5009\u5eab\u7db2\u9801\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c07\u5009\u5eab\u514b\u9686\u81f3\u672c\u5730\u3002
  3. \u5728\u672c\u5730\u9032\u884c\u5167\u5bb9\u5275\u4f5c\uff0c\u4e26\u9032\u884c\u5b8c\u6574\u6e2c\u8a66\uff0c\u9a57\u8b49\u7a0b\u5f0f\u78bc\u7684\u6b63\u78ba\u6027\u3002
  4. \u5c07\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u5f8c Push \u81f3\u9060\u7aef\u5009\u5eab\u3002
  5. \u91cd\u65b0\u6574\u7406\u5009\u5eab\u7db2\u9801\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002
"},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

\u5728 hello-algo \u6839\u76ee\u9304\u4e0b\uff0c\u57f7\u884c\u4ee5\u4e0b Docker \u6307\u4ee4\u78bc\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8a2a\u554f\u672c\u5c08\u6848\uff1a

docker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u522a\u9664\u90e8\u7f72\uff1a

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88dd IDE","text":"

\u63a8\u85a6\u4f7f\u7528\u958b\u6e90\u3001\u8f15\u91cf\u7684 VS Code \u4f5c\u70ba\u672c\u5730\u6574\u5408\u958b\u767c\u74b0\u5883\uff08IDE\uff09\u3002\u8a2a\u554f VS Code \u5b98\u7db2\uff0c\u6839\u64da\u4f5c\u696d\u7cfb\u7d71\u9078\u64c7\u76f8\u61c9\u7248\u672c\u7684 VS Code \u9032\u884c\u4e0b\u8f09\u548c\u5b89\u88dd\u3002

\u5716 16-1 \u00a0 \u5f9e\u5b98\u7db2\u4e0b\u8f09 VS Code

VS Code \u64c1\u6709\u5f37\u5927\u7684\u64f4\u5c55\u5305\u751f\u614b\u7cfb\u7d71\uff0c\u652f\u6301\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u7684\u57f7\u884c\u548c\u9664\u932f\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5b89\u88dd\u201cPython Extension Pack\u201d\u64f4\u5c55\u5305\u4e4b\u5f8c\uff0c\u5373\u53ef\u9032\u884c Python \u7a0b\u5f0f\u78bc\u9664\u932f\u3002\u5b89\u88dd\u6b65\u9a5f\u5982\u5716 16-2 \u6240\u793a\u3002

\u5716 16-2 \u00a0 \u5b89\u88dd VS Code \u64f4\u5c55\u5305

"},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88dd\u8a9e\u8a00\u74b0\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88dd Python Extension Pack \u3002
  3. \uff08\u53ef\u9078\uff09\u5728\u547d\u4ee4\u5217\u8f38\u5165 pip install black \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u74b0\u5883","text":"
  1. Windows \u7cfb\u7d71\u9700\u8981\u5b89\u88dd MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e36 Clang \uff0c\u7121\u9808\u5b89\u88dd\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88dd C/C++ Extension Pack \u3002
  3. \uff08\u53ef\u9078\uff09\u958b\u555f Settings \u9801\u9762\uff0c\u641c\u5c0b Clang_format_fallback Style \u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u9078\u9805\uff0c\u8a2d\u5b9a\u70ba { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
"},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd OpenJDK\uff08\u7248\u672c\u9700\u6eff\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88dd Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd .Net 8.0 \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88dd C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
  3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88dd\u6559\u7a0b\uff09\u3002
"},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd go \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88dd Go \u3002
  3. \u6309\u5feb\u6377\u9375 Ctrl + Shift + P \u64a5\u51fa\u547d\u4ee4\u6b04\uff0c\u8f38\u5165 go \uff0c\u9078\u64c7 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9078\u4e26\u5b89\u88dd\u5373\u53ef\u3002
"},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Swift \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88dd Swift for Visual Studio Code \u3002
"},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Node.js \u3002
  2. \uff08\u53ef\u9078\uff09\u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u74b0\u5883","text":"
  1. \u540c JavaScript \u74b0\u5883\u5b89\u88dd\u6b65\u9a5f\u3002
  2. \u5b89\u88dd TypeScript Execute (tsx) \u3002
  3. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88dd Pretty TypeScript Errors \u3002
"},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Dart \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88dd Dart \u3002
"},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Rust \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88dd rust-analyzer \u3002
"},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u8853\u8a9e\u8868","text":"

\u8868 16-1 \u5217\u51fa\u4e86\u66f8\u4e2d\u51fa\u73fe\u7684\u91cd\u8981\u8853\u8a9e\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u5e7e\u9ede\u3002

  • \u5efa\u8b70\u8a18\u4f4f\u540d\u8a5e\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u95b1\u8b80\u82f1\u6587\u6587\u737b\u3002
  • \u90e8\u5206\u540d\u8a5e\u5728\u7c21\u9ad4\u4e2d\u6587\u548c\u7e41\u9ad4\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

\u8868 16-1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8a5e

English \u7c21\u9ad4\u4e2d\u6587 \u7e41\u9ad4\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217","text":"

Abstract

\u8cc7\u6599\u7d50\u69cb\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5be6\u7684\u78da\u7246\u3002

\u9663\u5217\u7684\u78da\u584a\u6574\u9f4a\u6392\u5217\uff0c\u9010\u500b\u7dca\u8cbc\u3002\u93c8\u7d50\u4e32\u5217\u7684\u78da\u584a\u5206\u6563\u5404\u8655\uff0c\u9023\u7dda\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u65bc\u78da\u7e2b\u4e4b\u9593\u3002

"},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 4.1 \u00a0 \u9663\u5217
  • 4.2 \u00a0 \u93c8\u7d50\u4e32\u5217
  • 4.3 \u00a0 \u4e32\u5217
  • 4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *
  • 4.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u9663\u5217","text":"

\u9663\u5217\uff08array\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5c07\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\u3002\u6211\u5011\u5c07\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u4f4d\u7f6e\u7a31\u70ba\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u5716 4-1 \u5c55\u793a\u4e86\u9663\u5217\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5132\u5b58\u65b9\u5f0f\u3002

\u5716 4-1 \u00a0 \u9663\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u9663\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u9663\u5217","text":"

\u6211\u5011\u53ef\u4ee5\u6839\u64da\u9700\u6c42\u9078\u7528\u9663\u5217\u7684\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u7121\u521d\u59cb\u503c\u3001\u7d66\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u6cc1\u4e0b\uff0c\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u6703\u5c07\u9663\u5217\u5143\u7d20\u521d\u59cb\u5316\u70ba \\(0\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
# \u521d\u59cb\u5316\u9663\u5217\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
array.cpp
/* \u521d\u59cb\u5316\u9663\u5217 */\n// \u5132\u5b58\u5728\u5806\u758a\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff08\u9700\u8981\u624b\u52d5\u91cb\u653e\u7a7a\u9593\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[5]int\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08[]int\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Go \u7684\u9663\u5217\u88ab\u8a2d\u8a08\u70ba\u5728\u7de8\u8b6f\u671f\u78ba\u5b9a\u9577\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u6578\u4f86\u6307\u5b9a\u9577\u5ea6\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u9663\u5217\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* \u521d\u59cb\u5316\u9663\u5217 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* \u521d\u59cb\u5316\u9663\u5217 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
array.rb
# \u521d\u59cb\u5316\u9663\u5217\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
array.zig
// \u521d\u59cb\u5316\u9663\u5217\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8a2a\u554f\u5143\u7d20","text":"

\u9663\u5217\u5143\u7d20\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u9019\u610f\u5473\u8457\u8a08\u7b97\u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7d66\u5b9a\u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09\u548c\u67d0\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5716 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8a08\u7b97\u5f97\u5230\u8a72\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u76f4\u63a5\u8a2a\u554f\u8a72\u5143\u7d20\u3002

\u5716 4-2 \u00a0 \u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a08\u7b97

\u89c0\u5bdf\u5716 4-2 \uff0c\u6211\u5011\u767c\u73fe\u9663\u5217\u9996\u500b\u5143\u7d20\u7684\u7d22\u5f15\u70ba \\(0\\) \uff0c\u9019\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\u6703\u66f4\u81ea\u7136\u3002\u4f46\u5f9e\u4f4d\u5740\u8a08\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8cea\u4e0a\u662f\u8a18\u61b6\u9ad4\u4f4d\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u500b\u5143\u7d20\u7684\u4f4d\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u70ba \\(0\\) \u662f\u5408\u7406\u7684\u3002

\u5728\u9663\u5217\u4e2d\u8a2a\u554f\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u96a8\u6a5f\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u96a8\u6a5f\u8a2a\u554f\u5143\u7d20\"\"\"\n    # \u5728\u5340\u9593 [0, len(nums)-1] \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u5340\u9593 [0, size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = rand() % size;\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u5340\u9593 [0, nums.Length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u5340\u9593 [0, nums.count) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u5340\u9593 [0, nums.len()) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u5340\u9593 [0, size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = rand() % size;\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u5340\u9593 [0, nums.size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u5340\u9593 [0, nums.len) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6574\u6578\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

\u9663\u5217\u5143\u7d20\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u201c\u7dca\u6328\u8457\u7684\u201d\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u7a7a\u9593\u518d\u5b58\u653e\u4efb\u4f55\u8cc7\u6599\u3002\u5982\u5716 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u9663\u5217\u4e2d\u9593\u63d2\u5165\u4e00\u500b\u5143\u7d20\uff0c\u5247\u9700\u8981\u5c07\u8a72\u5143\u7d20\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u4e4b\u5f8c\u518d\u628a\u5143\u7d20\u8ce6\u503c\u7d66\u8a72\u7d22\u5f15\u3002

\u5716 4-3 \u00a0 \u9663\u5217\u63d2\u5165\u5143\u7d20\u793a\u4f8b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u6703\u5c0e\u81f4\u9663\u5217\u5c3e\u90e8\u5143\u7d20\u201c\u4e1f\u5931\u201d\u3002\u6211\u5011\u5c07\u9019\u500b\u554f\u984c\u7684\u89e3\u6c7a\u65b9\u6848\u7559\u5728\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u4e2d\u8a0e\u8ad6\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c07 _num \u8ce6\u7d66 index \u8655\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u522a\u9664\u5143\u7d20","text":"

\u540c\u7406\uff0c\u5982\u5716 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u522a\u9664\u7d22\u5f15 \\(i\\) \u8655\u7684\u5143\u7d20\uff0c\u5247\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\u3002

\u5716 4-4 \u00a0 \u9663\u5217\u522a\u9664\u5143\u7d20\u793a\u4f8b

\u8acb\u6ce8\u610f\uff0c\u522a\u9664\u5143\u7d20\u5b8c\u6210\u5f8c\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u8b8a\u5f97\u201c\u7121\u610f\u7fa9\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u5011\u7121\u9808\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u7684\u4f86\u770b\uff0c\u9663\u5217\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u9ede\u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u9ad8\uff1a\u9663\u5217\u7684\u63d2\u5165\u548c\u522a\u9664\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u9577\u5ea6\u3002
  • \u4e1f\u5931\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u5f8c\uff0c\u8d85\u51fa\u9663\u5217\u9577\u5ea6\u7bc4\u570d\u7684\u5143\u7d20\u6703\u4e1f\u5931\u3002
  • \u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff1a\u6211\u5011\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u500b\u6bd4\u8f03\u9577\u7684\u9663\u5217\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u9019\u6a23\u5728\u63d2\u5165\u8cc7\u6599\u6642\uff0c\u4e1f\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u7121\u610f\u7fa9\u201d\u7684\uff0c\u4f46\u9019\u6a23\u505a\u6703\u9020\u6210\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
"},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u8d70\u8a2a\u9663\u5217","text":"

\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u65e2\u53ef\u4ee5\u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u7372\u53d6\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u8d70\u8a2a\u9663\u5217\"\"\"\n    count = 0\n    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u8d70\u8a2a\u9663\u5217 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u8d70\u8a2a\u9663\u5217 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u8d70\u8a2a\u9663\u5217 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u8d70\u8a2a\u9663\u5217 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u8d70\u8a2a\u9663\u5217 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u8d70\u8a2a\u9663\u5217\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u900f\u904e forEach \u65b9\u6cd5\u8d70\u8a2a\u9663\u5217\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u8d70\u8a2a\u9663\u5217 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u8d70\u8a2a\u9663\u5217 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u8d70\u8a2a\u9663\u5217 ###\ndef traverse(nums)\n  count = 0\n\n  # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u8d70\u8a2a\u9663\u5217\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u8a62\u5143\u7d20","text":"

\u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\u9700\u8981\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u5224\u65b7\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5247\u8f38\u51fa\u5c0d\u61c9\u7d22\u5f15\u3002

\u56e0\u70ba\u9663\u5217\u662f\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u8a62\u64cd\u4f5c\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u67e5\u8a62\u201d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u64f4\u5bb9\u9663\u5217","text":"

\u5728\u8907\u96dc\u7684\u7cfb\u7d71\u74b0\u5883\u4e2d\uff0c\u7a0b\u5f0f\u96e3\u4ee5\u4fdd\u8b49\u9663\u5217\u4e4b\u5f8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u53ef\u7528\u7684\uff0c\u5f9e\u800c\u7121\u6cd5\u5b89\u5168\u5730\u64f4\u5c55\u9663\u5217\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u9663\u5217\u7684\u9577\u5ea6\u662f\u4e0d\u53ef\u8b8a\u7684\u3002

\u5982\u679c\u6211\u5011\u5e0c\u671b\u64f4\u5bb9\u9663\u5217\uff0c\u5247\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u7136\u5f8c\u628a\u539f\u9663\u5217\u5143\u7d20\u4f9d\u6b21\u8907\u88fd\u5230\u65b0\u9663\u5217\u3002\u9019\u662f\u4e00\u500b \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u9663\u5217\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\u975e\u5e38\u8017\u6642\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u64f4\u5c55\u9663\u5217\u9577\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res = [0] * (len(nums) + enlarge)\n    # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n
array.cpp
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = new int[size + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete[] nums;\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.java
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.cs
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.go
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res := make([]int, len(nums)+enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.swift
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.js
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.ts
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.dart
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  return res;\n}\n
array.rs
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    res\n}\n
array.c
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u64f4\u5c55\u5f8c\u7684\u7a7a\u9593\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.kt
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    val res = IntArray(nums.size + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.rb
### \u64f4\u5c55\u9663\u5217\u9577\u5ea6 ###\n# \u8acb\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n# \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  res\nend\n
array.zig
// \u64f4\u5c55\u9663\u5217\u9577\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u9663\u5217\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u4e14\u5143\u7d20\u578b\u5225\u76f8\u540c\u3002\u9019\u7a2e\u505a\u6cd5\u5305\u542b\u8c50\u5bcc\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u7cfb\u7d71\u53ef\u4ee5\u5229\u7528\u9019\u4e9b\u8cc7\u8a0a\u4f86\u6700\u4f73\u5316\u8cc7\u6599\u7d50\u69cb\u7684\u64cd\u4f5c\u6548\u7387\u3002

  • \u7a7a\u9593\u6548\u7387\u9ad8\uff1a\u9663\u5217\u70ba\u8cc7\u6599\u5206\u914d\u4e86\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u584a\uff0c\u7121\u9808\u984d\u5916\u7684\u7d50\u69cb\u958b\u92b7\u3002
  • \u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff1a\u9663\u5217\u5141\u8a31\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u4efb\u4f55\u5143\u7d20\u3002
  • \u5feb\u53d6\u5340\u57df\u6027\uff1a\u7576\u8a2a\u554f\u9663\u5217\u5143\u7d20\u6642\uff0c\u8a08\u7b97\u6a5f\u4e0d\u50c5\u6703\u8f09\u5165\u5b83\uff0c\u9084\u6703\u5feb\u53d6\u5176\u5468\u570d\u7684\u5176\u4ed6\u8cc7\u6599\uff0c\u5f9e\u800c\u85c9\u52a9\u9ad8\u901f\u5feb\u53d6\u4f86\u63d0\u5347\u5f8c\u7e8c\u64cd\u4f5c\u7684\u57f7\u884c\u901f\u5ea6\u3002

\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u662f\u4e00\u628a\u96d9\u5203\u528d\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

  • \u63d2\u5165\u8207\u522a\u9664\u6548\u7387\u4f4e\uff1a\u7576\u9663\u5217\u4e2d\u5143\u7d20\u8f03\u591a\u6642\uff0c\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52d5\u5927\u91cf\u7684\u5143\u7d20\u3002
  • \u9577\u5ea6\u4e0d\u53ef\u8b8a\uff1a\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u64f4\u5bb9\u9663\u5217\u9700\u8981\u5c07\u6240\u6709\u8cc7\u6599\u8907\u88fd\u5230\u65b0\u9663\u5217\uff0c\u958b\u92b7\u5f88\u5927\u3002
  • \u7a7a\u9593\u6d6a\u8cbb\uff1a\u5982\u679c\u9663\u5217\u5206\u914d\u7684\u5927\u5c0f\u8d85\u904e\u5be6\u969b\u6240\u9700\uff0c\u90a3\u9ebc\u591a\u9918\u7684\u7a7a\u9593\u5c31\u88ab\u6d6a\u8cbb\u4e86\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u9663\u5217\u5178\u578b\u61c9\u7528","text":"

\u9663\u5217\u662f\u4e00\u7a2e\u57fa\u790e\u4e14\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u65e2\u983b\u7e41\u61c9\u7528\u5728\u5404\u985e\u6f14\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u65bc\u5be6\u73fe\u5404\u7a2e\u8907\u96dc\u8cc7\u6599\u7d50\u69cb\u3002

  • \u96a8\u6a5f\u8a2a\u554f\uff1a\u5982\u679c\u6211\u5011\u60f3\u96a8\u6a5f\u62bd\u53d6\u4e00\u4e9b\u6a23\u672c\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7528\u9663\u5217\u5132\u5b58\uff0c\u4e26\u751f\u6210\u4e00\u500b\u96a8\u6a5f\u5e8f\u5217\uff0c\u6839\u64da\u7d22\u5f15\u5be6\u73fe\u96a8\u6a5f\u62bd\u6a23\u3002
  • \u6392\u5e8f\u548c\u641c\u5c0b\uff1a\u9663\u5217\u662f\u6392\u5e8f\u548c\u641c\u5c0b\u6f14\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u4e8c\u5206\u641c\u5c0b\u7b49\u90fd\u4e3b\u8981\u5728\u9663\u5217\u4e0a\u9032\u884c\u3002
  • \u67e5\u8a62\u8868\uff1a\u7576\u9700\u8981\u5feb\u901f\u67e5\u8a62\u4e00\u500b\u5143\u7d20\u6216\u5176\u5c0d\u61c9\u95dc\u4fc2\u6642\uff0c\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u4f5c\u70ba\u67e5\u8a62\u8868\u3002\u5047\u5982\u6211\u5011\u60f3\u5be6\u73fe\u5b57\u5143\u5230 ASCII \u78bc\u7684\u5c0d\u6620\uff0c\u5247\u53ef\u4ee5\u5c07\u5b57\u5143\u7684 ASCII \u78bc\u503c\u4f5c\u70ba\u7d22\u5f15\uff0c\u5c0d\u61c9\u7684\u5143\u7d20\u5b58\u653e\u5728\u9663\u5217\u4e2d\u7684\u5c0d\u61c9\u4f4d\u7f6e\u3002
  • \u6a5f\u5668\u5b78\u7fd2\uff1a\u795e\u7d93\u7db2\u8def\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9663\u3001\u5f35\u91cf\u4e4b\u9593\u7684\u7dda\u6027\u4ee3\u6578\u904b\u7b97\uff0c\u9019\u4e9b\u8cc7\u6599\u90fd\u662f\u4ee5\u9663\u5217\u7684\u5f62\u5f0f\u69cb\u5efa\u7684\u3002\u9663\u5217\u662f\u795e\u7d93\u7db2\u8def\u7a0b\u5f0f\u8a2d\u8a08\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff1a\u9663\u5217\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002\u4f8b\u5982\uff0c\u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a\u5be6\u969b\u4e0a\u662f\u4e00\u500b\u4e8c\u7dad\u9663\u5217\u3002
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u93c8\u7d50\u4e32\u5217","text":"

\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u516c\u5171\u8cc7\u6e90\uff0c\u5728\u4e00\u500b\u8907\u96dc\u7684\u7cfb\u7d71\u57f7\u884c\u74b0\u5883\u4e0b\uff0c\u7a7a\u9592\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u80fd\u6563\u843d\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u6211\u5011\u77e5\u9053\uff0c\u5132\u5b58\u9663\u5217\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5fc5\u9808\u662f\u9023\u7e8c\u7684\uff0c\u800c\u7576\u9663\u5217\u975e\u5e38\u5927\u6642\uff0c\u8a18\u61b6\u9ad4\u53ef\u80fd\u7121\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u9023\u7e8c\u7a7a\u9593\u3002\u6b64\u6642\u93c8\u7d50\u4e32\u5217\u7684\u9748\u6d3b\u6027\u512a\u52e2\u5c31\u9ad4\u73fe\u51fa\u4f86\u4e86\u3002

\u93c8\u7d50\u4e32\u5217\uff08linked list\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u662f\u4e00\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u5404\u500b\u7bc0\u9ede\u900f\u904e\u201c\u5f15\u7528\u201d\u76f8\u9023\u7dda\u3002\u5f15\u7528\u8a18\u9304\u4e86\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u900f\u904e\u5b83\u53ef\u4ee5\u5f9e\u7576\u524d\u7bc0\u9ede\u8a2a\u554f\u5230\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002

\u93c8\u7d50\u4e32\u5217\u7684\u8a2d\u8a08\u4f7f\u5f97\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u5b83\u5011\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

\u5716 4-5 \u00a0 \u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

\u89c0\u5bdf\u5716 4-5 \uff0c\u93c8\u7d50\u4e32\u5217\u7684\u7d44\u6210\u55ae\u4f4d\u662f\u7bc0\u9ede\uff08node\uff09\u7269\u4ef6\u3002\u6bcf\u500b\u7bc0\u9ede\u90fd\u5305\u542b\u5169\u9805\u8cc7\u6599\uff1a\u7bc0\u9ede\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u201c\u5f15\u7528\u201d\u3002

  • \u93c8\u7d50\u4e32\u5217\u7684\u9996\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u982d\u7bc0\u9ede\u201d\uff0c\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u5c3e\u7bc0\u9ede\u201d\u3002
  • \u5c3e\u7bc0\u9ede\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u5225\u88ab\u8a18\u70ba null\u3001nullptr \u548c None \u3002
  • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u6a19\u7684\u8a9e\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u61c9\u88ab\u66ff\u63db\u70ba\u201c\u6307\u6a19\u201d\u3002

\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u9084\u9700\u984d\u5916\u5132\u5b58\u4e00\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u8cc7\u6599\u91cf\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u6bd4\u9663\u5217\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  //\u5efa\u69cb\u5b50\n    int val = x;         // \u7bc0\u9ede\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype ListNode struct {\n    Val  int       // \u7bc0\u9ede\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewListNode \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u93c8\u7d50\u4e32\u5217\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u7bc0\u9ede\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u5efa\u69cb\u5b50\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u7bc0\u9ede\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
# \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val  # \u7bc0\u9ede\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
// \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u93c8\u7d50\u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217","text":"

\u5efa\u7acb\u93c8\u7d50\u4e32\u5217\u5206\u70ba\u5169\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u7b2c\u4e8c\u6b65\u662f\u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\u95dc\u4fc2\u3002\u521d\u59cb\u5316\u5b8c\u6210\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f9e\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u900f\u904e\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8a2a\u554f\u6240\u6709\u7bc0\u9ede\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
# \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rb
# \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.zig
// \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9663\u5217\u6574\u9ad4\u662f\u4e00\u500b\u8b8a\u6578\uff0c\u6bd4\u5982\u9663\u5217 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u7531\u591a\u500b\u7368\u7acb\u7684\u7bc0\u9ede\u7269\u4ef6\u7d44\u6210\u7684\u3002\u6211\u5011\u901a\u5e38\u5c07\u982d\u7bc0\u9ede\u7576\u4f5c\u93c8\u7d50\u4e32\u5217\u7684\u4ee3\u7a31\uff0c\u6bd4\u5982\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u53ef\u8a18\u4f5c\u93c8\u7d50\u4e32\u5217 n0 \u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u7bc0\u9ede\u975e\u5e38\u5bb9\u6613\u3002\u5982\u5716 4-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u60f3\u5728\u76f8\u9130\u7684\u5169\u500b\u7bc0\u9ede n0 \u548c n1 \u4e4b\u9593\u63d2\u5165\u4e00\u500b\u65b0\u7bc0\u9ede P \uff0c\u5247\u53ea\u9700\u6539\u8b8a\u5169\u500b\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u9663\u5217\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6548\u7387\u8f03\u4f4e\u3002

\u5716 4-6 \u00a0 \u93c8\u7d50\u4e32\u5217\u63d2\u5165\u7bc0\u9ede\u793a\u4f8b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u500b\u5167\u5efa\u51fd\u5f0f\uff0c `P` \u662f\u4e00\u500b\u5e38\u6578\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u5982\u5716 4-7 \u6240\u793a\uff0c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u7bc0\u9ede\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u8b8a\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u3002

\u8acb\u6ce8\u610f\uff0c\u5118\u7ba1\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\u7bc0\u9ede P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5be6\u969b\u4e0a\u8d70\u8a2a\u6b64\u93c8\u7d50\u4e32\u5217\u5df2\u7d93\u7121\u6cd5\u8a2a\u554f\u5230 P \uff0c\u9019\u610f\u5473\u8457 P \u5df2\u7d93\u4e0d\u518d\u5c6c\u65bc\u8a72\u93c8\u7d50\u4e32\u5217\u4e86\u3002

\u5716 4-7 \u00a0 \u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete P;\n}\n
linked_list.java
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(P);\n}\n
linked_list.kt
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8a2a\u554f\u7bc0\u9ede","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u8a2a\u554f\u7bc0\u9ede\u7684\u6548\u7387\u8f03\u4f4e\u3002\u5982\u4e0a\u4e00\u7bc0\u6240\u8ff0\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u4e0b\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u93c8\u7d50\u4e32\u5217\u5247\u4e0d\u7136\uff0c\u7a0b\u5f0f\u9700\u8981\u5f9e\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u9010\u500b\u5411\u5f8c\u8d70\u8a2a\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u7684\u7b2c \\(i\\) \u500b\u7bc0\u9ede\u9700\u8981\u8ff4\u5708 \\(i - 1\\) \u8f2a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u67e5\u8a62\u5176\u4e2d\u503c\u70ba target \u7684\u7bc0\u9ede\uff0c\u8f38\u51fa\u8a72\u7bc0\u9ede\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u904e\u7a0b\u4e5f\u5c6c\u65bc\u7dda\u6027\u67e5\u8a62\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u9663\u5217 vs. \u93c8\u7d50\u4e32\u5217","text":"

\u8868 4-1 \u7e3d\u7d50\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7684\u5404\u9805\u7279\u9ede\u4e26\u5c0d\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u65bc\u5b83\u5011\u63a1\u7528\u5169\u7a2e\u76f8\u53cd\u7684\u5132\u5b58\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u7a2e\u6027\u8cea\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73fe\u5c0d\u7acb\u7684\u7279\u9ede\u3002

\u8868 4-1 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217\u7684\u6548\u7387\u5c0d\u6bd4

\u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u5132\u5b58\u65b9\u5f0f \u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5206\u6563\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5bb9\u91cf\u64f4\u5c55 \u9577\u5ea6\u4e0d\u53ef\u8b8a \u53ef\u9748\u6d3b\u64f4\u5c55 \u8a18\u61b6\u9ad4\u6548\u7387 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8cbb\u7a7a\u9593 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u591a \u8a2a\u554f\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u65b0\u589e\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u578b\u5225","text":"

\u5982\u5716 4-8 \u6240\u793a\uff0c\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u4e09\u7a2e\u3002

  • \u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u5373\u524d\u9762\u4ecb\u7d39\u7684\u666e\u901a\u93c8\u7d50\u4e32\u5217\u3002\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\u5169\u9805\u8cc7\u6599\u3002\u6211\u5011\u5c07\u9996\u500b\u7bc0\u9ede\u7a31\u70ba\u982d\u7bc0\u9ede\uff0c\u5c07\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7a31\u70ba\u5c3e\u7bc0\u9ede\uff0c\u5c3e\u7bc0\u9ede\u6307\u5411\u7a7a None \u3002
  • \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff1a\u5982\u679c\u6211\u5011\u4ee4\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5c3e\u7bc0\u9ede\u6307\u5411\u982d\u7bc0\u9ede\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5247\u5f97\u5230\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u5728\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u4efb\u610f\u7bc0\u9ede\u90fd\u53ef\u4ee5\u8996\u4f5c\u982d\u7bc0\u9ede\u3002
  • \u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u8207\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u76f8\u6bd4\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u8a18\u9304\u4e86\u5169\u500b\u65b9\u5411\u7684\u5f15\u7528\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5b9a\u7fa9\u540c\u6642\u5305\u542b\u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\uff08\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\u548c\u524d\u9a45\u7bc0\u9ede\uff08\u4e0a\u4e00\u500b\u7bc0\u9ede\uff09\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u76f8\u8f03\u65bc\u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u66f4\u5177\u9748\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u5169\u500b\u65b9\u5411\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u76f8\u61c9\u5730\u4e5f\u9700\u8981\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode *prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  // \u5efa\u69cb\u5b50\n    int val = x;    // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype DoublyListNode struct {\n    Val  int             // \u7bc0\u9ede\u503c\n    Next *DoublyListNode // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u5efa\u69cb\u5b50\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u578b\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n/* \u5efa\u69cb\u5b50 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u7bc0\u9ede\u503c\n    val next: ListNode? = null  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
# \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :next   # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
// \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

\u5716 4-8 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u7a2e\u985e

"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u93c8\u7d50\u4e32\u5217\u5178\u578b\u61c9\u7528","text":"

\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u548c\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002

  • \u5806\u758a\u8207\u4f47\u5217\uff1a\u7576\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u90fd\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\u6642\uff0c\u5b83\u8868\u73fe\u7684\u7279\u6027\u70ba\u5148\u9032\u5f8c\u51fa\uff0c\u5c0d\u61c9\u5806\u758a\uff1b\u7576\u63d2\u5165\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\uff0c\u522a\u9664\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u53e6\u4e00\u7aef\u9032\u884c\uff0c\u5b83\u8868\u73fe\u7684\u7279\u6027\u70ba\u5148\u9032\u5148\u51fa\uff0c\u5c0d\u61c9\u4f47\u5217\u3002
  • \u96dc\u6e4a\u8868\uff1a\u93c8\u5f0f\u4f4d\u5740\u662f\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8a72\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u885d\u7a81\u7684\u5143\u7d20\u90fd\u6703\u88ab\u653e\u5230\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
  • \u5716\uff1a\u9130\u63a5\u8868\u662f\u8868\u793a\u5716\u7684\u4e00\u7a2e\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u5716\u7684\u6bcf\u500b\u9802\u9ede\u90fd\u8207\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u76f8\u95dc\u806f\uff0c\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u4ee3\u8868\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u5176\u4ed6\u9802\u9ede\u3002

\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u5feb\u901f\u67e5\u8a62\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u5143\u7d20\u7684\u5834\u666f\u3002

  • \u9ad8\u968e\u8cc7\u6599\u7d50\u69cb\uff1a\u6bd4\u5982\u5728\u7d05\u9ed1\u6a39\u3001B \u6a39\u4e2d\uff0c\u6211\u5011\u9700\u8981\u8a2a\u554f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5728\u7bc0\u9ede\u4e2d\u5132\u5b58\u4e00\u500b\u6307\u5411\u7236\u7bc0\u9ede\u7684\u5f15\u7528\u4f86\u5be6\u73fe\uff0c\u985e\u4f3c\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
  • \u700f\u89bd\u5668\u6b77\u53f2\uff1a\u5728\u7db2\u9801\u700f\u89bd\u5668\u4e2d\uff0c\u7576\u7528\u6236\u9ede\u9078\u524d\u9032\u6216\u5f8c\u9000\u6309\u9215\u6642\uff0c\u700f\u89bd\u5668\u9700\u8981\u77e5\u9053\u4f7f\u7528\u8005\u8a2a\u554f\u904e\u7684\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u7db2\u9801\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7279\u6027\u4f7f\u5f97\u9019\u7a2e\u64cd\u4f5c\u8b8a\u5f97\u7c21\u55ae\u3002
  • LRU \u6f14\u7b97\u6cd5\uff1a\u5728\u5feb\u53d6\u6dd8\u6c70\uff08LRU\uff09\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u3002\u9019\u6642\u5019\u4f7f\u7528\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5c31\u975e\u5e38\u5408\u9069\u3002

\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u9031\u671f\u6027\u64cd\u4f5c\u7684\u5834\u666f\uff0c\u6bd4\u5982\u4f5c\u696d\u7cfb\u7d71\u7684\u8cc7\u6e90\u6392\u7a0b\u3002

  • \u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\uff1a\u5728\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\u662f\u4e00\u7a2e\u5e38\u898b\u7684 CPU \u6392\u7a0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5c0d\u4e00\u7d44\u7a0b\u5e8f\u9032\u884c\u8ff4\u5708\u3002\u6bcf\u500b\u7a0b\u5e8f\u88ab\u8ce6\u4e88\u4e00\u500b\u6642\u9593\u7247\uff0c\u7576\u6642\u9593\u7247\u7528\u5b8c\u6642\uff0cCPU \u5c07\u5207\u63db\u5230\u4e0b\u4e00\u500b\u7a0b\u5e8f\u3002\u9019\u7a2e\u8ff4\u5708\u64cd\u4f5c\u53ef\u4ee5\u900f\u904e\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
  • \u8cc7\u6599\u7de9\u885d\u5340\uff1a\u5728\u67d0\u4e9b\u8cc7\u6599\u7de9\u885d\u5340\u7684\u5be6\u73fe\u4e2d\uff0c\u4e5f\u53ef\u80fd\u6703\u4f7f\u7528\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u6bd4\u5982\u5728\u97f3\u8a0a\u3001\u5f71\u7247\u64ad\u653e\u5668\u4e2d\uff0c\u8cc7\u6599\u6d41\u53ef\u80fd\u6703\u88ab\u5206\u6210\u591a\u500b\u7de9\u885d\u584a\u4e26\u653e\u5165\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff0c\u4ee5\u4fbf\u5be6\u73fe\u7121\u7e2b\u64ad\u653e\u3002
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u4e32\u5217","text":"

\u4e32\u5217\uff08list\uff09\u662f\u4e00\u500b\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8a2a\u554f\u3001\u4fee\u6539\u3001\u65b0\u589e\u3001\u522a\u9664\u548c\u8d70\u8a2a\u7b49\u64cd\u4f5c\uff0c\u7121\u9808\u4f7f\u7528\u8005\u8003\u616e\u5bb9\u91cf\u9650\u5236\u7684\u554f\u984c\u3002\u4e32\u5217\u53ef\u4ee5\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u5be6\u73fe\u3002

  • \u93c8\u7d50\u4e32\u5217\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u4e32\u5217\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\u64cd\u4f5c\uff0c\u4e26\u4e14\u53ef\u4ee5\u9748\u6d3b\u52d5\u614b\u64f4\u5bb9\u3002
  • \u9663\u5217\u4e5f\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\uff0c\u4f46\u7531\u65bc\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u500b\u5177\u6709\u9577\u5ea6\u9650\u5236\u7684\u4e32\u5217\u3002

\u7576\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u4e32\u5217\u6642\uff0c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u6027\u8cea\u6703\u5c0e\u81f4\u4e32\u5217\u7684\u5be6\u7528\u6027\u964d\u4f4e\u3002\u9019\u662f\u56e0\u70ba\u6211\u5011\u901a\u5e38\u7121\u6cd5\u4e8b\u5148\u78ba\u5b9a\u9700\u8981\u5132\u5b58\u591a\u5c11\u8cc7\u6599\uff0c\u5f9e\u800c\u96e3\u4ee5\u9078\u64c7\u5408\u9069\u7684\u4e32\u5217\u9577\u5ea6\u3002\u82e5\u9577\u5ea6\u904e\u5c0f\uff0c\u5247\u5f88\u53ef\u80fd\u7121\u6cd5\u6eff\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u9577\u5ea6\u904e\u5927\uff0c\u5247\u6703\u9020\u6210\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002

\u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff08dynamic array\uff09\u4f86\u5be6\u73fe\u4e32\u5217\u3002\u5b83\u7e7c\u627f\u4e86\u9663\u5217\u7684\u5404\u9805\u512a\u9ede\uff0c\u4e26\u4e14\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u9032\u884c\u52d5\u614b\u64f4\u5bb9\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u6a19\u6e96\u5eab\u63d0\u4f9b\u7684\u4e32\u5217\u662f\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u4f86\u7684\u8a0e\u8ad6\u4e2d\uff0c\u6211\u5011\u5c07\u628a\u201c\u4e32\u5217\u201d\u548c\u201c\u52d5\u614b\u9663\u5217\u201d\u8996\u70ba\u7b49\u540c\u7684\u6982\u5ff5\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e32\u5217","text":"

\u6211\u5011\u901a\u5e38\u4f7f\u7528\u201c\u7121\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u9019\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u7121\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u9663\u5217\u7684\u5143\u7d20\u578b\u5225\u9700\u70ba int[] \u7684\u5305\u88dd\u985e\u5225 Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
list.rb
# \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u4e32\u5217\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8a2a\u554f\u5143\u7d20","text":"

\u4e32\u5217\u672c\u8cea\u4e0a\u662f\u9663\u5217\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u8a2a\u554f\u5143\u7d20\nnum: int = nums[1]  # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.cpp
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.java
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums.get(1);  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.cs
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list_test.go
/* \u8a2a\u554f\u5143\u7d20 */\nnum := nums[1]  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.swift
/* \u8a2a\u554f\u5143\u7d20 */\nlet num = nums[1] // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.js
/* \u8a2a\u554f\u5143\u7d20 */\nconst num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.ts
/* \u8a2a\u554f\u5143\u7d20 */\nconst num: number = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.dart
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.rs
/* \u8a2a\u554f\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u8a2a\u554f\u5143\u7d20 */\nval num = nums[1]       // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.rb
# \u8a2a\u554f\u5143\u7d20\nnum = nums[1] # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.zig
// \u8a2a\u554f\u5143\u7d20\nvar num = nums.items[1]; // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u5143\u7d20","text":"

\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5730\u65b0\u589e\u8207\u522a\u9664\u5143\u7d20\u3002\u5728\u4e32\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u8207\u9663\u5217\u76f8\u540c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6e05\u7a7a\u4e32\u5217\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.pop(3)        # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.java
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.cs
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u4e32\u5217 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.swift
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.ts
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.dart
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.rs
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);    // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.rb
# \u6e05\u7a7a\u4e32\u5217\nnums.clear\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.delete_at(3) # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u4e32\u5217\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n// \u522a\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u8d70\u8a2a\u4e32\u5217","text":"

\u8207\u9663\u5217\u4e00\u6a23\uff0c\u4e32\u5217\u53ef\u4ee5\u6839\u64da\u7d22\u5f15\u8d70\u8a2a\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u5404\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\nfor num in nums:\n    count += num\n
list.cpp
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
list.rb
# \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
list.zig
// \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u4e32\u5217","text":"

\u7d66\u5b9a\u4e00\u500b\u65b0\u4e32\u5217 nums1 \uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u62fc\u63a5\u5230\u539f\u4e32\u5217\u7684\u5c3e\u90e8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.cpp
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.cs
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list_test.go
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.swift
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.js
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.ts
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.dart
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.rs
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.rb
# \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
list.zig
// \u62fc\u63a5\u5169\u500b\u4e32\u5217\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u4e32\u5217","text":"

\u5b8c\u6210\u4e32\u5217\u6392\u5e8f\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u9663\u5217\u985e\u5225\u6f14\u7b97\u6cd5\u984c\u4e2d\u7d93\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u548c\u201c\u96d9\u6307\u6a19\u201d\u6f14\u7b97\u6cd5\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6392\u5e8f\u4e32\u5217\nnums.sort()  # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u4e32\u5217 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.java
/* \u6392\u5e8f\u4e32\u5217 */\nCollections.sort(nums);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.cs
/* \u6392\u5e8f\u4e32\u5217 */\nnums.Sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list_test.go
/* \u6392\u5e8f\u4e32\u5217 */\nsort.Ints(nums)  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.ts
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.dart
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.rs
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.rb
# \u6392\u5e8f\u4e32\u5217\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.zig
// \u6392\u5e8f\u4e32\u5217\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u4e32\u5217\u5be6\u73fe","text":"

\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u4e86\u4e32\u5217\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u5011\u7684\u5be6\u73fe\u6bd4\u8f03\u8907\u96dc\uff0c\u5404\u500b\u53c3\u6578\u7684\u8a2d\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u64f4\u5bb9\u500d\u6578\u7b49\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u539f\u59cb\u78bc\u9032\u884c\u5b78\u7fd2\u3002

\u70ba\u4e86\u52a0\u6df1\u5c0d\u4e32\u5217\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u5011\u5617\u8a66\u5be6\u73fe\u4e00\u500b\u7c21\u6613\u7248\u4e32\u5217\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u500b\u91cd\u9ede\u8a2d\u8a08\u3002

  • \u521d\u59cb\u5bb9\u91cf\uff1a\u9078\u53d6\u4e00\u500b\u5408\u7406\u7684\u9663\u5217\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u9078\u64c7 10 \u4f5c\u70ba\u521d\u59cb\u5bb9\u91cf\u3002
  • \u6578\u91cf\u8a18\u9304\uff1a\u5ba3\u544a\u4e00\u500b\u8b8a\u6578 size \uff0c\u7528\u65bc\u8a18\u9304\u4e32\u5217\u7576\u524d\u5143\u7d20\u6578\u91cf\uff0c\u4e26\u96a8\u8457\u5143\u7d20\u63d2\u5165\u548c\u522a\u9664\u5be6\u6642\u66f4\u65b0\u3002\u6839\u64da\u6b64\u8b8a\u6578\uff0c\u6211\u5011\u53ef\u4ee5\u5b9a\u4f4d\u4e32\u5217\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65b7\u662f\u5426\u9700\u8981\u64f4\u5bb9\u3002
  • \u64f4\u5bb9\u6a5f\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u6642\u4e32\u5217\u5bb9\u91cf\u5df2\u6eff\uff0c\u5247\u9700\u8981\u9032\u884c\u64f4\u5bb9\u3002\u5148\u6839\u64da\u64f4\u5bb9\u500d\u6578\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u518d\u5c07\u7576\u524d\u9663\u5217\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52d5\u81f3\u65b0\u9663\u5217\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u898f\u5b9a\u6bcf\u6b21\u5c07\u9663\u5217\u64f4\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u4e32\u5217\u985e\u5225\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._capacity: int = 10  # \u4e32\u5217\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        self._size: int = 0  # \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8a2a\u554f\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u522a\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u4e32\u5217\u64f4\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  private:\n    int *arr;             // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    int arrSize = 0;      // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Vector \u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    private int size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] toArray() {\n        int size = size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr;           // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u4e32\u5217\u5bb9\u91cf\n    private int arrSize = 0;         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba arrCapacity * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u4e32\u5217\u985e\u5225 */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u4e32\u5217\u5bb9\u91cf\n        arr:         make([]int, 10), // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrSize:     0,               // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n    }\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u522a\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217 */\nfunc (l *myList) toArray() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: [Int] // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var _capacity: Int // \u4e32\u5217\u5bb9\u91cf\n    private var _size: Int // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5247\u4e1f\u64f2\u932f\u8aa4\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    #arr = new Array(); // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    #capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    #size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    toArray() {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private arr: Array<number>; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u4e32\u5217\u5bb9\u91cf\n    private _size: number = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  late List<int> _arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n  int _capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n  int _size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  /* \u5efa\u69cb\u5b50 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8a2a\u554f\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u522a\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u4e32\u5217\u64f4\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extendRatio \u500d\u7684\u65b0\u9663\u5217\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u4e32\u5217\u985e\u5225 */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    capacity: usize,     // \u4e32\u5217\u5bb9\u91cf\n    size: usize,         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u4e32\u5217\u985e\u5225 */\ntypedef struct {\n    int *arr;        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int capacity;    // \u4e32\u5217\u5bb9\u91cf\n    int size;        // \u4e32\u5217\u5927\u5c0f\n    int extendRatio; // \u4e32\u5217\u6bcf\u6b21\u64f4\u5bb9\u7684\u500d\u6578\n} MyList;\n\n/* \u5efa\u69cb\u5b50 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u522a\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u9593\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u8907\u88fd\u820a\u8cc7\u6599\u5230\u65b0\u8cc7\u6599\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91cb\u653e\u820a\u8cc7\u6599\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u8cc7\u6599\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Array \u7528\u65bc\u5217\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u4e32\u5217\u5bb9\u91cf\n    private var size: Int = 0 // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u4e32\u5217\u985e\u5225 ###\nclass MyList\n  attr_reader :size       # \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  attr_reader :capacity   # \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n\n    # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u522a\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u4e32\u5217\u64f4\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 ###\n  def to_array\n    sz = size\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u4e32\u5217\u985e\u5225\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u4e32\u5217\u5bb9\u91cf\n        numSize: usize = 0,                           // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4e32\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8a2a\u554f\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }\n\n        // \u522a\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u4e32\u5217\u64f4\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *","text":"

\u5728\u672c\u7ae0\u7684\u524d\u5169\u7bc0\u4e2d\uff0c\u6211\u5011\u63a2\u8a0e\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u9019\u5169\u7a2e\u57fa\u790e\u4e14\u91cd\u8981\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b83\u5011\u5206\u5225\u4ee3\u8868\u4e86\u201c\u9023\u7e8c\u5132\u5b58\u201d\u548c\u201c\u5206\u6563\u5132\u5b58\u201d\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u3002

\u5be6\u969b\u4e0a\uff0c\u7269\u7406\u7d50\u69cb\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u6c7a\u5b9a\u4e86\u7a0b\u5f0f\u5c0d\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u7684\u4f7f\u7528\u6548\u7387\uff0c\u9032\u800c\u5f71\u97ff\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u7684\u6574\u9ad4\u6548\u80fd\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u88dd\u7f6e","text":"

\u8a08\u7b97\u6a5f\u4e2d\u5305\u62ec\u4e09\u7a2e\u985e\u578b\u7684\u5132\u5b58\u88dd\u7f6e\uff1a\u786c\u789f\uff08hard disk\uff09\u3001\u8a18\u61b6\u9ad4\uff08random-access memory, RAM\uff09\u3001\u5feb\u53d6\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u5011\u5728\u8a08\u7b97\u6a5f\u7cfb\u7d71\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6548\u80fd\u7279\u9ede\u3002

\u8868 4-2 \u00a0 \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u88dd\u7f6e

\u786c\u789f \u8a18\u61b6\u9ad4 \u5feb\u53d6 \u7528\u9014 \u9577\u671f\u5132\u5b58\u8cc7\u6599\uff0c\u5305\u62ec\u4f5c\u696d\u7cfb\u7d71\u3001\u7a0b\u5f0f\u3001\u6a94\u6848\u7b49 \u81e8\u6642\u5132\u5b58\u7576\u524d\u57f7\u884c\u7684\u7a0b\u5f0f\u548c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599 \u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u6e1b\u5c11 CPU \u8a2a\u554f\u8a18\u61b6\u9ad4\u7684\u6b21\u6578 \u6613\u5931\u6027 \u65b7\u96fb\u5f8c\u8cc7\u6599\u4e0d\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u5bb9\u91cf \u8f03\u5927\uff0cTB \u7d1a\u5225 \u8f03\u5c0f\uff0cGB \u7d1a\u5225 \u975e\u5e38\u5c0f\uff0cMB \u7d1a\u5225 \u901f\u5ea6 \u8f03\u6162\uff0c\u5e7e\u767e\u5230\u5e7e\u5343 MB/s \u8f03\u5feb\uff0c\u5e7e\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u5e7e\u5341\u5230\u5e7e\u767e GB/s \u50f9\u683c \u8f03\u4fbf\u5b9c\uff0c\u5e7e\u6bdb\u5230\u5e7e\u5143 / GB \u8f03\u8cb4\uff0c\u5e7e\u5341\u5230\u5e7e\u767e\u5143 / GB \u975e\u5e38\u8cb4\uff0c\u96a8 CPU \u6253\u5305\u8a08\u50f9

\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71\u60f3\u8c61\u70ba\u5716 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7d50\u69cb\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9802\u7aef\u7684\u5132\u5b58\u88dd\u7f6e\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u9019\u7a2e\u591a\u5c64\u7d1a\u7684\u8a2d\u8a08\u4e26\u975e\u5076\u7136\uff0c\u800c\u662f\u8a08\u7b97\u6a5f\u79d1\u5b78\u5bb6\u548c\u5de5\u7a0b\u5e2b\u5011\u7d93\u904e\u6df1\u601d\u719f\u616e\u7684\u7d50\u679c\u3002

  • \u786c\u789f\u96e3\u4ee5\u88ab\u8a18\u61b6\u9ad4\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u5728\u65b7\u96fb\u5f8c\u6703\u4e1f\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9069\u5408\u9577\u671f\u5132\u5b58\u8cc7\u6599\uff1b\u5176\u6b21\uff0c\u8a18\u61b6\u9ad4\u7684\u6210\u672c\u662f\u786c\u789f\u7684\u5e7e\u5341\u500d\uff0c\u9019\u4f7f\u5f97\u5b83\u96e3\u4ee5\u5728\u6d88\u8cbb\u8005\u5e02\u5834\u666e\u53ca\u3002
  • \u5feb\u53d6\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96e3\u4ee5\u517c\u5f97\u3002\u96a8\u8457 L1\u3001L2\u3001L3 \u5feb\u53d6\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u6703\u8b8a\u5927\uff0c\u8207 CPU \u6838\u5fc3\u4e4b\u9593\u7684\u7269\u7406\u8ddd\u96e2\u6703\u8b8a\u9060\uff0c\u5f9e\u800c\u5c0e\u81f4\u8cc7\u6599\u50b3\u8f38\u6642\u9593\u589e\u52a0\uff0c\u5143\u7d20\u8a2a\u554f\u5ef6\u9072\u8b8a\u9ad8\u3002\u5728\u7576\u524d\u6280\u8853\u4e0b\uff0c\u591a\u5c64\u7d1a\u7684\u5feb\u53d6\u7d50\u69cb\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u9593\u7684\u6700\u4f73\u5e73\u8861\u9ede\u3002

\u5716 4-9 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71

Tip

\u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u5c64\u6b21\u7d50\u69cb\u9ad4\u73fe\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u9593\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5be6\u969b\u4e0a\uff0c\u9019\u7a2e\u6b0a\u8861\u666e\u904d\u5b58\u5728\u65bc\u6240\u6709\u5de5\u696d\u9818\u57df\uff0c\u5b83\u8981\u6c42\u6211\u5011\u5728\u4e0d\u540c\u7684\u512a\u52e2\u548c\u9650\u5236\u4e4b\u9593\u627e\u5230\u6700\u4f73\u5e73\u8861\u9ede\u3002

\u7e3d\u7684\u4f86\u8aaa\uff0c\u786c\u789f\u7528\u65bc\u9577\u671f\u5132\u5b58\u5927\u91cf\u8cc7\u6599\uff0c\u8a18\u61b6\u9ad4\u7528\u65bc\u81e8\u6642\u5132\u5b58\u7a0b\u5f0f\u57f7\u884c\u4e2d\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\uff0c\u800c\u5feb\u53d6\u5247\u7528\u65bc\u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5f0f\u57f7\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u5354\u4f5c\uff0c\u78ba\u4fdd\u8a08\u7b97\u6a5f\u7cfb\u7d71\u9ad8\u6548\u57f7\u884c\u3002

\u5982\u5716 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u6703\u5f9e\u786c\u789f\u4e2d\u88ab\u8b80\u53d6\u5230\u8a18\u61b6\u9ad4\u4e2d\uff0c\u4f9b CPU \u8a08\u7b97\u4f7f\u7528\u3002\u5feb\u53d6\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u900f\u904e\u667a\u6167\u5730\u5f9e\u8a18\u61b6\u9ad4\u8f09\u5165\u8cc7\u6599\uff0c\u7d66 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u8cc7\u6599\u8b80\u53d6\uff0c\u5f9e\u800c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\uff0c\u6e1b\u5c11\u5c0d\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u7684\u4f9d\u8cf4\u3002

\u5716 4-10 \u00a0 \u786c\u789f\u3001\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u4e4b\u9593\u7684\u8cc7\u6599\u6d41\u901a

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u8a18\u61b6\u9ad4\u6548\u7387","text":"

\u5728\u8a18\u61b6\u9ad4\u7a7a\u9593\u5229\u7528\u65b9\u9762\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5404\u81ea\u5177\u6709\u512a\u52e2\u548c\u4fb7\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u8a18\u61b6\u9ad4\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u584a\u8a18\u61b6\u9ad4\u4e0d\u80fd\u88ab\u591a\u500b\u7a0b\u5f0f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u5011\u5e0c\u671b\u8cc7\u6599\u7d50\u69cb\u80fd\u5920\u5118\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u9593\u3002\u9663\u5217\u7684\u5143\u7d20\u7dca\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u984d\u5916\u7684\u7a7a\u9593\u4f86\u5132\u5b58\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u56e0\u6b64\u7a7a\u9593\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u9663\u5217\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u5920\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u9019\u53ef\u80fd\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff0c\u9663\u5217\u64f4\u5bb9\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u4ee5\u201c\u7bc0\u9ede\u201d\u70ba\u55ae\u4f4d\u9032\u884c\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u96a8\u8457\u53cd\u8986\u7533\u8acb\u8207\u91cb\u653e\u8a18\u61b6\u9ad4\uff0c\u7a7a\u9592\u8a18\u61b6\u9ad4\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u6703\u8d8a\u4f86\u8d8a\u9ad8\uff0c\u5f9e\u800c\u5c0e\u81f4\u8a18\u61b6\u9ad4\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u9663\u5217\u7531\u65bc\u5176\u9023\u7e8c\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u76f8\u5c0d\u4e0d\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u5143\u7d20\u662f\u5206\u6563\u5132\u5b58\u7684\uff0c\u5728\u983b\u7e41\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u5feb\u53d6\u6548\u7387","text":"

\u5feb\u53d6\u96d6\u7136\u5728\u7a7a\u9593\u5bb9\u91cf\u4e0a\u9060\u5c0f\u65bc\u8a18\u61b6\u9ad4\uff0c\u4f46\u5b83\u6bd4\u8a18\u61b6\u9ad4\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u901f\u5ea6\u4e0a\u8d77\u8457\u81f3\u95dc\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u65bc\u5feb\u53d6\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5132\u5b58\u4e00\u5c0f\u90e8\u5206\u983b\u7e41\u8a2a\u554f\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u7576 CPU \u5617\u8a66\u8a2a\u554f\u7684\u8cc7\u6599\u4e0d\u5728\u5feb\u53d6\u4e2d\u6642\uff0c\u5c31\u6703\u767c\u751f\u5feb\u53d6\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u6642 CPU \u4e0d\u5f97\u4e0d\u5f9e\u901f\u5ea6\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u4e2d\u8f09\u5165\u6240\u9700\u8cc7\u6599\u3002

\u986f\u7136\uff0c\u201c\u5feb\u53d6\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8b80\u5beb\u8cc7\u6599\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5f0f\u6548\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u5011\u5c07 CPU \u5f9e\u5feb\u53d6\u4e2d\u6210\u529f\u7372\u53d6\u8cc7\u6599\u7684\u6bd4\u4f8b\u7a31\u70ba\u5feb\u53d6\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u9019\u500b\u6307\u6a19\u901a\u5e38\u7528\u4f86\u8861\u91cf\u5feb\u53d6\u6548\u7387\u3002

\u70ba\u4e86\u5118\u53ef\u80fd\u9054\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u5feb\u53d6\u6703\u63a1\u53d6\u4ee5\u4e0b\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\u3002

  • \u5feb\u53d6\u884c\uff1a\u5feb\u53d6\u4e0d\u662f\u55ae\u500b\u4f4d\u5143\u7d44\u5730\u5132\u5b58\u8207\u8f09\u5165\u8cc7\u6599\uff0c\u800c\u662f\u4ee5\u5feb\u53d6\u884c\u70ba\u55ae\u4f4d\u3002\u76f8\u6bd4\u65bc\u55ae\u500b\u4f4d\u5143\u7d44\u7684\u50b3\u8f38\uff0c\u5feb\u53d6\u884c\u7684\u50b3\u8f38\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
  • \u9810\u53d6\u6a5f\u5236\uff1a\u8655\u7406\u5668\u6703\u5617\u8a66\u9810\u6e2c\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\uff08\u4f8b\u5982\u9806\u5e8f\u8a2a\u554f\u3001\u56fa\u5b9a\u6b65\u9577\u8df3\u8e8d\u8a2a\u554f\u7b49\uff09\uff0c\u4e26\u6839\u64da\u7279\u5b9a\u6a21\u5f0f\u5c07\u8cc7\u6599\u8f09\u5165\u81f3\u5feb\u53d6\u4e4b\u4e2d\uff0c\u5f9e\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
  • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u9644\u8fd1\u7684\u8cc7\u6599\u53ef\u80fd\u8fd1\u671f\u4e5f\u6703\u88ab\u8a2a\u554f\u3002\u56e0\u6b64\uff0c\u5feb\u53d6\u5728\u8f09\u5165\u67d0\u4e00\u8cc7\u6599\u6642\uff0c\u4e5f\u6703\u8f09\u5165\u5176\u9644\u8fd1\u7684\u8cc7\u6599\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
  • \u6642\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u5728\u4e0d\u4e45\u7684\u5c07\u4f86\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8a2a\u554f\u3002\u5feb\u53d6\u5229\u7528\u9019\u4e00\u539f\u7406\uff0c\u900f\u904e\u4fdd\u7559\u6700\u8fd1\u8a2a\u554f\u904e\u7684\u8cc7\u6599\u4f86\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

\u5be6\u969b\u4e0a\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5c0d\u5feb\u53d6\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5e7e\u500b\u65b9\u9762\u3002

  • \u4f54\u7528\u7a7a\u9593\uff1a\u93c8\u7d50\u4e32\u5217\u5143\u7d20\u6bd4\u9663\u5217\u5143\u7d20\u4f54\u7528\u7a7a\u9593\u66f4\u591a\uff0c\u5c0e\u81f4\u5feb\u53d6\u4e2d\u5bb9\u7d0d\u7684\u6709\u6548\u8cc7\u6599\u91cf\u66f4\u5c11\u3002
  • \u5feb\u53d6\u884c\uff1a\u93c8\u7d50\u4e32\u5217\u8cc7\u6599\u5206\u6563\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u800c\u5feb\u53d6\u662f\u201c\u6309\u884c\u8f09\u5165\u201d\u7684\uff0c\u56e0\u6b64\u8f09\u5165\u5230\u7121\u6548\u8cc7\u6599\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
  • \u9810\u53d6\u6a5f\u5236\uff1a\u9663\u5217\u6bd4\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9810\u6e2c\u6027\u201d\uff0c\u5373\u7cfb\u7d71\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c07\u88ab\u8f09\u5165\u7684\u8cc7\u6599\u3002
  • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u9663\u5217\u88ab\u5132\u5b58\u5728\u96c6\u4e2d\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u56e0\u6b64\u88ab\u8f09\u5165\u8cc7\u6599\u9644\u8fd1\u7684\u8cc7\u6599\u66f4\u6709\u53ef\u80fd\u5373\u5c07\u88ab\u8a2a\u554f\u3002

\u7e3d\u9ad4\u800c\u8a00\uff0c\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u9019\u4f7f\u5f97\u5728\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u5f80\u5f80\u66f4\u53d7\u6b61\u8fce\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u5feb\u53d6\u6548\u7387\u4e26\u4e0d\u610f\u5473\u8457\u9663\u5217\u5728\u6240\u6709\u60c5\u6cc1\u4e0b\u90fd\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u5be6\u969b\u61c9\u7528\u4e2d\u9078\u64c7\u54ea\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5be6\u73fe\u201c\u5806\u758a\u201d\u8cc7\u6599\u7d50\u69cb\uff08\u4e0b\u4e00\u7ae0\u6703\u8a73\u7d30\u4ecb\u7d39\uff09\uff0c\u4f46\u5b83\u5011\u9069\u7528\u65bc\u4e0d\u540c\u5834\u666f\u3002

  • \u5728\u505a\u6f14\u7b97\u6cd5\u984c\u6642\uff0c\u6211\u5011\u6703\u50be\u5411\u65bc\u9078\u64c7\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\uff0c\u56e0\u70ba\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u96a8\u6a5f\u8a2a\u554f\u7684\u80fd\u529b\uff0c\u4ee3\u50f9\u50c5\u662f\u9700\u8981\u9810\u5148\u70ba\u9663\u5217\u5206\u914d\u4e00\u5b9a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u5982\u679c\u8cc7\u6599\u91cf\u975e\u5e38\u5927\u3001\u52d5\u614b\u6027\u5f88\u9ad8\u3001\u5806\u758a\u7684\u9810\u671f\u5927\u5c0f\u96e3\u4ee5\u4f30\u8a08\uff0c\u90a3\u9ebc\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u66f4\u52a0\u5408\u9069\u3002\u93c8\u7d50\u4e32\u5217\u80fd\u5920\u5c07\u5927\u91cf\u8cc7\u6599\u5206\u6563\u5132\u5b58\u65bc\u8a18\u61b6\u9ad4\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u4e26\u4e14\u907f\u514d\u4e86\u9663\u5217\u64f4\u5bb9\u7522\u751f\u7684\u984d\u5916\u958b\u92b7\u3002
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u662f\u5169\u7a2e\u57fa\u672c\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5206\u5225\u4ee3\u8868\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5169\u7a2e\u5132\u5b58\u65b9\u5f0f\uff1a\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\u3002\u5169\u8005\u7684\u7279\u9ede\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u6027\u3002
  • \u9663\u5217\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002
  • \u93c8\u7d50\u4e32\u5217\u900f\u904e\u66f4\u6539\u5f15\u7528\uff08\u6307\u6a19\uff09\u5be6\u73fe\u9ad8\u6548\u7684\u7bc0\u9ede\u63d2\u5165\u8207\u522a\u9664\uff0c\u4e14\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\uff1b\u4f46\u7bc0\u9ede\u8a2a\u554f\u6548\u7387\u4f4e\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u591a\u3002\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u3001\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3001\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
  • \u4e32\u5217\u662f\u4e00\u7a2e\u652f\u6301\u589e\u522a\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u3002\u5b83\u4fdd\u7559\u4e86\u9663\u5217\u7684\u512a\u52e2\uff0c\u540c\u6642\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\u3002
  • \u4e32\u5217\u7684\u51fa\u73fe\u5927\u5e45\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
  • \u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u9663\u5217\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6548\u7387\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u5247\u5728\u8a18\u61b6\u9ad4\u4f7f\u7528\u4e0a\u66f4\u52a0\u9748\u6d3b\u3002
  • \u5feb\u53d6\u900f\u904e\u5feb\u53d6\u884c\u3001\u9810\u53d6\u6a5f\u5236\u4ee5\u53ca\u7a7a\u9593\u5340\u57df\u6027\u548c\u6642\u9593\u5340\u57df\u6027\u7b49\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\uff0c\u70ba CPU \u63d0\u4f9b\u5feb\u901f\u8cc7\u6599\u8a2a\u554f\uff0c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\u3002
  • \u7531\u65bc\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u93c8\u7d50\u4e32\u5217\u66f4\u9ad8\u6548\u3002\u5728\u9078\u64c7\u8cc7\u6599\u7d50\u69cb\u6642\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u548c\u5834\u666f\u505a\u51fa\u6070\u7576\u9078\u64c7\u3002
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u9663\u5217\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff0c\u5c0d\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u5426\u6709\u5f71\u97ff\uff1f

\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u90fd\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u8cc7\u6599\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u5806\u758a\u548c\u5806\u7a4d\u5177\u6709\u5404\u81ea\u7684\u7279\u9ede\uff0c\u5f9e\u800c\u5c0e\u81f4\u4ee5\u4e0b\u4e0d\u540c\u9ede\u3002

  1. \u5206\u914d\u548c\u91cb\u653e\u6548\u7387\uff1a\u5806\u758a\u662f\u4e00\u584a\u8f03\u5c0f\u7684\u8a18\u61b6\u9ad4\uff0c\u5206\u914d\u7531\u7de8\u8b6f\u5668\u81ea\u52d5\u5b8c\u6210\uff1b\u800c\u5806\u7a4d\u8a18\u61b6\u9ad4\u76f8\u5c0d\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u7a0b\u5f0f\u78bc\u4e2d\u52d5\u614b\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u7a4d\u4e0a\u7684\u5206\u914d\u548c\u91cb\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u5806\u758a\u4e0a\u7684\u6162\u3002
  2. \u5927\u5c0f\u9650\u5236\uff1a\u5806\u758a\u8a18\u61b6\u9ad4\u76f8\u5c0d\u8f03\u5c0f\uff0c\u5806\u7a4d\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\u3002\u56e0\u6b64\u5806\u7a4d\u66f4\u52a0\u9069\u5408\u5132\u5b58\u5927\u578b\u9663\u5217\u3002
  3. \u9748\u6d3b\u6027\uff1a\u5806\u758a\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u9700\u8981\u5728\u7de8\u8b6f\u6642\u78ba\u5b9a\uff0c\u800c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u57f7\u884c\u6642\u52d5\u614b\u78ba\u5b9a\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u9663\u5217\u8981\u6c42\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u537b\u6c92\u6709\u5f37\u8abf\u76f8\u540c\u578b\u5225\u5462\uff1f

\u93c8\u7d50\u4e32\u5217\u7531\u7bc0\u9ede\u7d44\u6210\uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u5f15\u7528\uff08\u6307\u6a19\uff09\u9023\u7dda\uff0c\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5132\u5b58\u4e0d\u540c\u578b\u5225\u7684\u8cc7\u6599\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

\u76f8\u5c0d\u5730\uff0c\u9663\u5217\u5143\u7d20\u5247\u5fc5\u9808\u662f\u76f8\u540c\u578b\u5225\u7684\uff0c\u9019\u6a23\u624d\u80fd\u900f\u904e\u8a08\u7b97\u504f\u79fb\u91cf\u4f86\u7372\u53d6\u5c0d\u61c9\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u9663\u5217\u540c\u6642\u5305\u542b int \u548c long \u5169\u7a2e\u578b\u5225\uff0c\u55ae\u500b\u5143\u7d20\u5206\u5225\u4f54\u7528 4 \u4f4d\u5143\u7d44 \u548c 8 \u4f4d\u5143\u7d44 \uff0c\u6b64\u6642\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8a08\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u70ba\u9663\u5217\u4e2d\u5305\u542b\u4e86\u5169\u7a2e\u201c\u5143\u7d20\u9577\u5ea6\u201d\u3002

# \u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740 = \u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09 + \u5143\u7d20\u9577\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

Q\uff1a\u522a\u9664\u7bc0\u9ede P \u5f8c\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8a2d\u70ba None \u5462\uff1f

\u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u5f9e\u8a72\u93c8\u7d50\u4e32\u5217\u7684\u89d2\u5ea6\u770b\uff0c\u5f9e\u982d\u7bc0\u9ede\u8d70\u8a2a\u5230\u5c3e\u7bc0\u9ede\u5df2\u7d93\u4e0d\u6703\u9047\u5230 P \u4e86\u3002\u9019\u610f\u5473\u8457\u7bc0\u9ede P \u5df2\u7d93\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u4e86\uff0c\u6b64\u6642\u7bc0\u9ede P \u6307\u5411\u54ea\u88e1\u90fd\u4e0d\u6703\u5c0d\u8a72\u93c8\u7d50\u4e32\u5217\u7522\u751f\u5f71\u97ff\u3002

\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff08\u505a\u984c\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65b7\u958b\u6c92\u6709\u95dc\u4fc2\uff0c\u53ea\u8981\u4fdd\u8b49\u7a0b\u5f0f\u7684\u908f\u8f2f\u662f\u6b63\u78ba\u7684\u5c31\u884c\u3002\u5f9e\u6a19\u6e96\u5eab\u7684\u89d2\u5ea6\u770b\uff0c\u65b7\u958b\u66f4\u52a0\u5b89\u5168\u3001\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65b7\u958b\uff0c\u5047\u8a2d\u88ab\u522a\u9664\u7bc0\u9ede\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u9ebc\u5b83\u6703\u5f71\u97ff\u5f8c\u7e7c\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u56de\u6536\u3002

Q\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u522a\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u67e5\u8a62\u5143\u7d20\uff0c\u90a3\u70ba\u4ec0\u9ebc\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

\u5982\u679c\u662f\u5148\u67e5\u8a62\u5143\u7d20\u3001\u518d\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u78ba\u5be6\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u7684 \\(O(1)\\) \u589e\u522a\u7684\u512a\u52e2\u53ef\u4ee5\u5728\u5176\u4ed6\u61c9\u7528\u4e0a\u5f97\u5230\u9ad4\u73fe\u3002\u4f8b\u5982\uff0c\u96d9\u5411\u4f47\u5217\u9069\u5408\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u6211\u5011\u7dad\u8b77\u4e00\u500b\u6307\u6a19\u8b8a\u6578\u59cb\u7d42\u6307\u5411\u982d\u7bc0\u9ede\u3001\u5c3e\u7bc0\u9ede\uff0c\u6bcf\u6b21\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

Q\uff1a\u5716\u201c\u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f\u201d\u4e2d\uff0c\u6dfa\u85cd\u8272\u7684\u5132\u5b58\u7bc0\u9ede\u6307\u6a19\u662f\u4f54\u7528\u4e00\u584a\u8a18\u61b6\u9ad4\u4f4d\u5740\u55ce\uff1f\u9084\u662f\u548c\u7bc0\u9ede\u503c\u5404\u4f54\u4e00\u534a\u5462\uff1f

\u8a72\u793a\u610f\u5716\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

  • \u4e0d\u540c\u578b\u5225\u7684\u7bc0\u9ede\u503c\u4f54\u7528\u7684\u7a7a\u9593\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u4f8b\u9805\u7269\u4ef6\u7b49\u3002
  • \u6307\u6a19\u8b8a\u6578\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5927\u5c0f\u6839\u64da\u6240\u4f7f\u7528\u7684\u4f5c\u696d\u7cfb\u7d71\u53ca\u7de8\u8b6f\u74b0\u5883\u800c\u5b9a\uff0c\u5927\u591a\u70ba 8 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\u3002

Q\uff1a\u5728\u4e32\u5217\u672b\u5c3e\u65b0\u589e\u5143\u7d20\u662f\u5426\u6642\u6642\u523b\u523b\u90fd\u70ba \\(O(1)\\) \uff1f

\u5982\u679c\u65b0\u589e\u5143\u7d20\u6642\u8d85\u51fa\u4e32\u5217\u9577\u5ea6\uff0c\u5247\u9700\u8981\u5148\u64f4\u5bb9\u4e32\u5217\u518d\u65b0\u589e\u3002\u7cfb\u7d71\u6703\u7533\u8acb\u4e00\u584a\u65b0\u7684\u8a18\u61b6\u9ad4\uff0c\u4e26\u5c07\u539f\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u642c\u904b\u904e\u53bb\uff0c\u9019\u6642\u5019\u6642\u9593\u8907\u96dc\u5ea6\u5c31\u6703\u662f \\(O(n)\\) \u3002

Q\uff1a\u201c\u4e32\u5217\u7684\u51fa\u73fe\u6975\u5927\u5730\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u201d\uff0c\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u662f\u6307\u984d\u5916\u589e\u52a0\u7684\u8b8a\u6578\u5982\u5bb9\u91cf\u3001\u9577\u5ea6\u3001\u64f4\u5bb9\u500d\u6578\u6240\u4f54\u7684\u8a18\u61b6\u9ad4\u55ce\uff1f

\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u4e3b\u8981\u6709\u5169\u65b9\u9762\u542b\u7fa9\uff1a\u4e00\u65b9\u9762\uff0c\u4e32\u5217\u90fd\u6703\u8a2d\u5b9a\u4e00\u500b\u521d\u59cb\u9577\u5ea6\uff0c\u6211\u5011\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u9019\u9ebc\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u70ba\u4e86\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\uff0c\u64f4\u5bb9\u4e00\u822c\u6703\u4e58\u4ee5\u4e00\u500b\u4fc2\u6578\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u9019\u6a23\u4e00\u4f86\uff0c\u4e5f\u6703\u51fa\u73fe\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u5011\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6eff\u5b83\u5011\u3002

Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u5f8c\uff0c\u9019 3 \u500b\u5143\u7d20\u7684\u4f4d\u5740\u662f\u76f8\u9023\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u6703\u767c\u73fe\u5b83\u5011\u6bcf\u500b\u5143\u7d20\u7684 id \u4e26\u4e0d\u662f\u9023\u7e8c\u7684\uff0c\u800c\u662f\u5206\u5225\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u9019\u4e9b\u5143\u7d20\u7684\u4f4d\u5740\u4e0d\u9023\u7e8c\uff0c\u90a3\u9ebc m \u9084\u662f\u9663\u5217\u55ce\uff1f

\u5047\u5982\u628a\u4e32\u5217\u5143\u7d20\u63db\u6210\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u9019 5 \u500b\u7bc0\u9ede\u7269\u4ef6\u4e5f\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u7136\u800c\uff0c\u7d66\u5b9a\u4e00\u500b\u4e32\u5217\u7d22\u5f15\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u7bc0\u9ede\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u8a2a\u554f\u5230\u5c0d\u61c9\u7684\u7bc0\u9ede\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u4e2d\u5132\u5b58\u7684\u662f\u7bc0\u9ede\u7684\u5f15\u7528\uff0c\u800c\u975e\u7bc0\u9ede\u672c\u8eab\u3002

\u8207\u8a31\u591a\u8a9e\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6578\u5b57\u4e5f\u88ab\u5305\u88dd\u70ba\u7269\u4ef6\uff0c\u4e32\u5217\u4e2d\u5132\u5b58\u7684\u4e0d\u662f\u6578\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5c0d\u6578\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6703\u767c\u73fe\u5169\u500b\u9663\u5217\u4e2d\u7684\u76f8\u540c\u6578\u5b57\u64c1\u6709\u540c\u4e00\u500b id \uff0c\u4e26\u4e14\u9019\u4e9b\u6578\u5b57\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

Q\uff1aC++ STL \u88e1\u9762\u7684 std::list \u5df2\u7d93\u5be6\u73fe\u4e86\u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u6f14\u7b97\u6cd5\u66f8\u4e0a\u4e0d\u600e\u9ebc\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u70ba\u6709\u4ec0\u9ebc\u4fb7\u9650\u6027\u5462\uff1f

\u4e00\u65b9\u9762\uff0c\u6211\u5011\u5f80\u5f80\u66f4\u9752\u775e\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u6f14\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u6642\u624d\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\uff0c\u4e3b\u8981\u6709\u5169\u500b\u539f\u56e0\u3002

  • \u7a7a\u9593\u958b\u92b7\uff1a\u7531\u65bc\u6bcf\u500b\u5143\u7d20\u9700\u8981\u5169\u500b\u984d\u5916\u7684\u6307\u6a19\uff08\u4e00\u500b\u7528\u65bc\u524d\u4e00\u500b\u5143\u7d20\uff0c\u4e00\u500b\u7528\u65bc\u5f8c\u4e00\u500b\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u4f54\u7528\u7a7a\u9593\u3002
  • \u5feb\u53d6\u4e0d\u53cb\u597d\uff1a\u7531\u65bc\u8cc7\u6599\u4e0d\u662f\u9023\u7e8c\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5c0d\u5feb\u53d6\u7684\u5229\u7528\u7387\u8f03\u4f4e\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0cstd::vector \u7684\u6548\u80fd\u6703\u66f4\u597d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u7684\u60c5\u6cc1\u4e3b\u8981\u662f\u4e8c\u5143\u6a39\u548c\u5716\u3002\u5806\u758a\u548c\u4f47\u5217\u5f80\u5f80\u6703\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u93c8\u7d50\u4e32\u5217\u3002

Q\uff1a\u521d\u59cb\u5316\u4e32\u5217 res = [0] * self.size() \u64cd\u4f5c\uff0c\u6703\u5c0e\u81f4 res \u7684\u6bcf\u500b\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u4f4d\u5740\u55ce\uff1f

\u4e0d\u6703\u3002\u4f46\u4e8c\u7dad\u9663\u5217\u6703\u6709\u9019\u500b\u554f\u984c\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7dad\u4e32\u5217 res = [[0] * self.size()] \uff0c\u5247\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u500b\u4e32\u5217 [0] \u3002

"},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

Abstract

\u6211\u5011\u5982\u540c\u8ff7\u5bae\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u9032\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u6703\u9047\u5230\u56f0\u96e3\u3002

\u56de\u6eaf\u7684\u529b\u91cf\u8b93\u6211\u5011\u80fd\u5920\u91cd\u65b0\u958b\u59cb\uff0c\u4e0d\u65b7\u5617\u8a66\uff0c\u6700\u7d42\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

"},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 13.1 \u00a0 \u56de\u6eaf\u6f14\u7b97\u6cd5
  • 13.2 \u00a0 \u5168\u6392\u5217\u554f\u984c
  • 13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c
  • 13.4 \u00a0 N \u7687\u540e\u554f\u984c
  • 13.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u6f14\u7b97\u6cd5","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u7a2e\u900f\u904e\u7aae\u8209\u4f86\u89e3\u6c7a\u554f\u984c\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u5f9e\u4e00\u500b\u521d\u59cb\u72c0\u614b\u51fa\u767c\uff0c\u66b4\u529b\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u7576\u9047\u5230\u6b63\u78ba\u7684\u89e3\u5247\u5c07\u5176\u8a18\u9304\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5617\u8a66\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u90fd\u7121\u6cd5\u627e\u5230\u89e3\u70ba\u6b62\u3002

\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u4f86\u8d70\u8a2a\u89e3\u7a7a\u9593\u3002\u5728\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u4e2d\uff0c\u6211\u5011\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5229\u7528\u524d\u5e8f\u8d70\u8a2a\u69cb\u9020\u4e00\u500b\u56de\u6eaf\u554f\u984c\uff0c\u9010\u6b65\u77ad\u89e3\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u984c\u4e00

\u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\uff0c\u641c\u5c0b\u4e26\u8a18\u9304\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u7bc0\u9ede\u4e32\u5217\u3002

\u5c0d\u65bc\u6b64\u984c\uff0c\u6211\u5011\u524d\u5e8f\u8d70\u8a2a\u9019\u68f5\u6a39\uff0c\u4e26\u5224\u65b7\u7576\u524d\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \uff0c\u82e5\u662f\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u7684\u503c\u52a0\u5165\u7d50\u679c\u4e32\u5217 res \u4e4b\u4e2d\u3002\u76f8\u95dc\u904e\u7a0b\u5be6\u73fe\u5982\u5716 13-1 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
preorder_traversal_i_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
preorder_traversal_i_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
preorder_traversal_i_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
preorder_traversal_i_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
preorder_traversal_i_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
preorder_traversal_i_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
preorder_traversal_i_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_i_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-1 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u4e2d\u641c\u7d22\u7bc0\u9ede

"},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5617\u8a66\u8207\u56de\u9000","text":"

\u4e4b\u6240\u4ee5\u7a31\u4e4b\u70ba\u56de\u6eaf\u6f14\u7b97\u6cd5\uff0c\u662f\u56e0\u70ba\u8a72\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u89e3\u7a7a\u9593\u6642\u6703\u63a1\u7528\u201c\u5617\u8a66\u201d\u8207\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u7576\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u9047\u5230\u67d0\u500b\u72c0\u614b\u7121\u6cd5\u7e7c\u7e8c\u524d\u9032\u6216\u7121\u6cd5\u5f97\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u6642\uff0c\u5b83\u6703\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u5617\u8a66\u5176\u4ed6\u53ef\u80fd\u7684\u9078\u64c7\u3002

\u5c0d\u65bc\u4f8b\u984c\u4e00\uff0c\u8a2a\u554f\u6bcf\u500b\u7bc0\u9ede\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5617\u8a66\u201d\uff0c\u800c\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u8fd4\u56de\u7236\u7bc0\u9ede\u7684 return \u5247\u8868\u793a\u201c\u56de\u9000\u201d\u3002

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u56de\u9000\u4e26\u4e0d\u50c5\u50c5\u5305\u62ec\u51fd\u5f0f\u8fd4\u56de\u3002\u70ba\u89e3\u91cb\u9019\u4e00\u9ede\uff0c\u6211\u5011\u5c0d\u4f8b\u984c\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u4f8b\u984c\u4e8c

\u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\u3002

\u5728\u4f8b\u984c\u4e00\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u4e32\u5217 path \u8a18\u9304\u8a2a\u554f\u904e\u7684\u7bc0\u9ede\u8def\u5f91\u3002\u7576\u8a2a\u554f\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u8907\u88fd path \u4e26\u65b0\u589e\u9032\u7d50\u679c\u4e32\u5217 res \u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0cres \u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_ii_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_ii_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_ii_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_ii_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_ii_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_ii_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_ii_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_ii_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_ii_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_ii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_ii_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u6bcf\u6b21\u201c\u5617\u8a66\u201d\u4e2d\uff0c\u6211\u5011\u900f\u904e\u5c07\u7576\u524d\u7bc0\u9ede\u65b0\u589e\u9032 path \u4f86\u8a18\u9304\u8def\u5f91\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u5011\u9700\u8981\u5c07\u8a72\u7bc0\u9ede\u5f9e path \u4e2d\u5f48\u51fa\uff0c\u4ee5\u6062\u5fa9\u672c\u6b21\u5617\u8a66\u4e4b\u524d\u7684\u72c0\u614b\u3002

\u89c0\u5bdf\u5716 13-2 \u6240\u793a\u7684\u904e\u7a0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5617\u8a66\u548c\u56de\u9000\u7406\u89e3\u70ba\u201c\u524d\u9032\u201d\u8207\u201c\u64a4\u92b7\u201d\uff0c\u5169\u500b\u64cd\u4f5c\u4e92\u70ba\u9006\u5411\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 13-2 \u00a0 \u5617\u8a66\u8207\u56de\u9000

"},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

\u8907\u96dc\u7684\u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u4e00\u500b\u6216\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u7d04\u675f\u689d\u4ef6\u901a\u5e38\u53ef\u7528\u65bc\u201c\u526a\u679d\u201d\u3002

\u4f8b\u984c\u4e09

\u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\uff0c\u4e26\u8981\u6c42\u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u3002

\u70ba\u4e86\u6eff\u8db3\u4ee5\u4e0a\u7d04\u675f\u689d\u4ef6\uff0c\u6211\u5011\u9700\u8981\u65b0\u589e\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\uff0c\u5247\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_iii_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_iii_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_iii_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_iii_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_iii_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_iii_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_iii_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_iii_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_iii_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_iii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_iii_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u201c\u526a\u679d\u201d\u662f\u4e00\u500b\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8a5e\u3002\u5982\u5716 13-3 \u6240\u793a\uff0c\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u641c\u5c0b\u5206\u652f\uff0c\u907f\u514d\u8a31\u591a\u7121\u610f\u7fa9\u7684\u5617\u8a66\uff0c\u5f9e\u800c\u63d0\u9ad8\u4e86\u641c\u5c0b\u6548\u7387\u3002

\u5716 13-3 \u00a0 \u6839\u64da\u7d04\u675f\u689d\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u7a0b\u5f0f\u78bc","text":"

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5617\u8a66\u5c07\u56de\u6eaf\u7684\u201c\u5617\u8a66\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u9ad4\u6846\u67b6\u63d0\u7149\u51fa\u4f86\uff0c\u63d0\u5347\u7a0b\u5f0f\u78bc\u7684\u901a\u7528\u6027\u3002

\u5728\u4ee5\u4e0b\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\uff0cstate \u8868\u793a\u554f\u984c\u7684\u7576\u524d\u72c0\u614b\uff0cchoices \u8868\u793a\u7576\u524d\u72c0\u614b\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9078\u64c7\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
\n
\n

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u57fa\u65bc\u6846\u67b6\u7a0b\u5f0f\u78bc\u4f86\u89e3\u6c7a\u4f8b\u984c\u4e09\u3002\u72c0\u614b state \u70ba\u7bc0\u9ede\u8d70\u8a2a\u8def\u5f91\uff0c\u9078\u64c7 choices \u70ba\u7576\u524d\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\uff0c\u7d50\u679c res \u662f\u8def\u5f91\u4e32\u5217\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8a18\u9304\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72c0\u614b\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u5fa9\u72c0\u614b\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
preorder_traversal_iii_template.cpp
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.java
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.cs
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.go
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.swift
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.js
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.ts
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.dart
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
preorder_traversal_iii_template.rs
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice.clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
preorder_traversal_iii_template.c
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution()) {\n        // \u8a18\u9304\u89e3\n        recordSolution();\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice();\n        }\n    }\n}\n
preorder_traversal_iii_template.kt
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.rb
[class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\n
preorder_traversal_iii_template.zig
[class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6839\u64da\u984c\u610f\uff0c\u6211\u5011\u5728\u627e\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u5f8c\u61c9\u8a72\u7e7c\u7e8c\u641c\u5c0b\uff0c\u56e0\u6b64\u9700\u8981\u5c07\u8a18\u9304\u89e3\u4e4b\u5f8c\u7684 return \u8a9e\u53e5\u522a\u9664\u3002\u5716 13-4 \u5c0d\u6bd4\u4e86\u4fdd\u7559\u6216\u522a\u9664 return \u8a9e\u53e5\u7684\u641c\u5c0b\u904e\u7a0b\u3002

\u5716 13-4 \u00a0 \u4fdd\u7559\u8207\u522a\u9664 return \u7684\u641c\u5c0b\u904e\u7a0b\u5c0d\u6bd4

\u76f8\u6bd4\u57fa\u65bc\u524d\u5e8f\u8d70\u8a2a\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\uff0c\u57fa\u65bc\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u96d6\u7136\u986f\u5f97\u56c9\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u56de\u6eaf\u554f\u984c\u53ef\u4ee5\u5728\u8a72\u6846\u67b6\u4e0b\u89e3\u6c7a\u3002\u6211\u5011\u53ea\u9700\u6839\u64da\u5177\u9ad4\u554f\u984c\u4f86\u5b9a\u7fa9 state \u548c choices \uff0c\u4e26\u5be6\u73fe\u6846\u67b6\u4e2d\u7684\u5404\u500b\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u8853\u8a9e","text":"

\u70ba\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u6211\u5011\u7e3d\u7d50\u4e00\u4e0b\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e2d\u5e38\u7528\u8853\u8a9e\u7684\u542b\u7fa9\uff0c\u4e26\u5c0d\u7167\u4f8b\u984c\u4e09\u7d66\u51fa\u5c0d\u61c9\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

\u8868 13-1 \u00a0 \u5e38\u898b\u7684\u56de\u6eaf\u6f14\u7b97\u6cd5\u8853\u8a9e

\u540d\u8a5e \u5b9a\u7fa9 \u4f8b\u984c\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6eff\u8db3\u554f\u984c\u7279\u5b9a\u689d\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u500b\u6216\u591a\u500b \u6839\u7bc0\u9ede\u5230\u7bc0\u9ede \\(7\\) \u7684\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u6240\u6709\u8def\u5f91 \u7d04\u675f\u689d\u4ef6\uff08constraint\uff09 \u7d04\u675f\u689d\u4ef6\u662f\u554f\u984c\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u689d\u4ef6\uff0c\u901a\u5e38\u7528\u65bc\u526a\u679d \u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u7bc0\u9ede \\(3\\) \u72c0\u614b\uff08state\uff09 \u72c0\u614b\u8868\u793a\u554f\u984c\u5728\u67d0\u4e00\u6642\u523b\u7684\u60c5\u6cc1\uff0c\u5305\u62ec\u5df2\u7d93\u505a\u51fa\u7684\u9078\u64c7 \u7576\u524d\u5df2\u8a2a\u554f\u7684\u7bc0\u9ede\u8def\u5f91\uff0c\u5373 path \u7bc0\u9ede\u4e32\u5217 \u5617\u8a66\uff08attempt\uff09 \u5617\u8a66\u662f\u6839\u64da\u53ef\u7528\u9078\u64c7\u4f86\u63a2\u7d22\u89e3\u7a7a\u9593\u7684\u904e\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\uff0c\u6aa2\u67e5\u662f\u5426\u70ba\u89e3 \u905e\u8ff4\u8a2a\u554f\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\uff0c\u5c07\u7bc0\u9ede\u65b0\u589e\u9032 path \uff0c\u5224\u65b7\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u72c0\u614b\u6642\uff0c\u64a4\u92b7\u524d\u9762\u505a\u51fa\u7684\u9078\u64c7\uff0c\u56de\u5230\u4e0a\u4e00\u500b\u72c0\u614b \u7576\u8d8a\u904e\u8449\u7bc0\u9ede\u3001\u7d50\u675f\u7bc0\u9ede\u8a2a\u554f\u3001\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\u7d42\u6b62\u641c\u5c0b\uff0c\u51fd\u5f0f\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u64da\u554f\u984c\u7279\u6027\u548c\u7d04\u675f\u689d\u4ef6\u907f\u514d\u7121\u610f\u7fa9\u7684\u641c\u5c0b\u8def\u5f91\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u5c0b\u6548\u7387 \u7576\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b

Tip

\u554f\u984c\u3001\u89e3\u3001\u72c0\u614b\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u4e0a\u662f\u4e00\u7a2e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u5617\u8a66\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\u76f4\u5230\u627e\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u3002\u9019\u7a2e\u65b9\u6cd5\u7684\u512a\u9ede\u5728\u65bc\u80fd\u5920\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

\u7136\u800c\uff0c\u5728\u8655\u7406\u5927\u898f\u6a21\u6216\u8005\u8907\u96dc\u554f\u984c\u6642\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6548\u7387\u53ef\u80fd\u96e3\u4ee5\u63a5\u53d7\u3002

  • \u6642\u9593\uff1a\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u8d70\u8a2a\u72c0\u614b\u7a7a\u9593\u7684\u6240\u6709\u53ef\u80fd\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u6307\u6578\u968e\u6216\u968e\u4e58\u968e\u3002
  • \u7a7a\u9593\uff1a\u5728\u905e\u8ff4\u547c\u53eb\u4e2d\u9700\u8981\u5132\u5b58\u7576\u524d\u7684\u72c0\u614b\uff08\u4f8b\u5982\u8def\u5f91\u3001\u7528\u65bc\u526a\u679d\u7684\u8f14\u52a9\u8b8a\u6578\u7b49\uff09\uff0c\u7576\u6df1\u5ea6\u5f88\u5927\u6642\uff0c\u7a7a\u9593\u9700\u6c42\u53ef\u80fd\u6703\u8b8a\u5f97\u5f88\u5927\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u7684\u6700\u4f73\u89e3\u6c7a\u65b9\u6848\u3002\u5c0d\u65bc\u9019\u4e9b\u554f\u984c\uff0c\u7531\u65bc\u7121\u6cd5\u9810\u6e2c\u54ea\u4e9b\u9078\u64c7\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u5011\u5fc5\u9808\u5c0d\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u9032\u884c\u8d70\u8a2a\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u95dc\u9375\u662f\u5982\u4f55\u6700\u4f73\u5316\u6548\u7387\uff0c\u5e38\u898b\u7684\u6548\u7387\u6700\u4f73\u5316\u65b9\u6cd5\u6709\u5169\u7a2e\u3002

  • \u526a\u679d\uff1a\u907f\u514d\u641c\u5c0b\u90a3\u4e9b\u80af\u5b9a\u4e0d\u6703\u7522\u751f\u89e3\u7684\u8def\u5f91\uff0c\u5f9e\u800c\u7bc0\u7701\u6642\u9593\u548c\u7a7a\u9593\u3002
  • \u555f\u767c\u5f0f\u641c\u5c0b\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8a08\u503c\uff0c\u5f9e\u800c\u512a\u5148\u641c\u5c0b\u6700\u6709\u53ef\u80fd\u7522\u751f\u6709\u6548\u89e3\u7684\u8def\u5f91\u3002
"},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u984c","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u641c\u5c0b\u554f\u984c\u3001\u7d04\u675f\u6eff\u8db3\u554f\u984c\u548c\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u3002

\u641c\u5c0b\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u89e3\u6c7a\u65b9\u6848\u3002

  • \u5168\u6392\u5217\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7d44\u5408\u3002
  • \u5b50\u96c6\u548c\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\u548c\u4e00\u500b\u76ee\u6a19\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u70ba\u76ee\u6a19\u548c\u7684\u5b50\u96c6\u3002
  • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5713\u76e4\uff0c\u8981\u6c42\u5c07\u6240\u6709\u5713\u76e4\u5f9e\u4e00\u6839\u67f1\u5b50\u79fb\u52d5\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\uff0c\u4e14\u4e0d\u80fd\u5c07\u5927\u5713\u76e4\u653e\u5728\u5c0f\u5713\u76e4\u4e0a\u3002

\u7d04\u675f\u6eff\u8db3\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u6240\u6709\u7d04\u675f\u689d\u4ef6\u7684\u89e3\u3002

  • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76e4\u4e0a\u653e\u7f6e \\(n\\) \u500b\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u5011\u4e92\u4e0d\u653b\u64ca\u3002
  • \u6578\u7368\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7db2\u683c\u4e2d\u586b\u5165\u6578\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u500b \\(3 \\times 3\\) \u5b50\u7db2\u683c\u4e2d\u7684\u6578\u5b57\u4e0d\u91cd\u8907\u3002
  • \u5716\u8457\u8272\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u7528\u6700\u5c11\u7684\u984f\u8272\u7d66\u5716\u7684\u6bcf\u500b\u9802\u9ede\u8457\u8272\uff0c\u4f7f\u5f97\u76f8\u9130\u9802\u9ede\u984f\u8272\u4e0d\u540c\u3002

\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u4e00\u500b\u7d44\u5408\u7a7a\u9593\u4e2d\u627e\u5230\u6eff\u8db3\u67d0\u4e9b\u689d\u4ef6\u7684\u6700\u512a\u89e3\u3002

  • 0-1 \u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u80cc\u5305\uff0c\u6bcf\u500b\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u50f9\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5167\uff0c\u9078\u64c7\u7269\u54c1\u4f7f\u5f97\u7e3d\u50f9\u503c\u6700\u5927\u3002
  • \u65c5\u884c\u5546\u554f\u984c\uff1a\u5728\u4e00\u500b\u5716\u4e2d\uff0c\u5f9e\u4e00\u500b\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u6240\u6709\u5176\u4ed6\u9ede\u6070\u597d\u4e00\u6b21\u5f8c\u8fd4\u56de\u8d77\u9ede\uff0c\u6c42\u6700\u77ed\u8def\u5f91\u3002
  • \u6700\u5927\u5718\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u5716\uff0c\u5373\u5b50\u5716\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9802\u9ede\u4e4b\u9593\u90fd\u6709\u908a\u76f8\u9023\u3002

\u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u512a\u89e3\u6c7a\u65b9\u6848\u3002

  • 0-1 \u80cc\u5305\u554f\u984c\u901a\u5e38\u4f7f\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\uff0c\u4ee5\u9054\u5230\u66f4\u9ad8\u7684\u6642\u9593\u6548\u7387\u3002
  • \u65c5\u884c\u5546\u662f\u4e00\u500b\u8457\u540d\u7684 NP-Hard \u554f\u984c\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u907a\u50b3\u6f14\u7b97\u6cd5\u548c\u87fb\u7fa4\u6f14\u7b97\u6cd5\u7b49\u3002
  • \u6700\u5927\u5718\u554f\u984c\u662f\u5716\u8ad6\u4e2d\u7684\u4e00\u500b\u7d93\u5178\u554f\u984c\uff0c\u53ef\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u555f\u767c\u5f0f\u6f14\u7b97\u6cd5\u4f86\u89e3\u6c7a\u3002
"},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u554f\u984c","text":"

Question

\u6839\u64da\u570b\u969b\u8c61\u68cb\u7684\u898f\u5247\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u64ca\u8207\u540c\u8655\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u689d\u659c\u7dda\u4e0a\u7684\u68cb\u5b50\u3002\u7d66\u5b9a \\(n\\) \u500b\u7687\u540e\u548c\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5c0b\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u9593\u7121\u6cd5\u76f8\u4e92\u653b\u64ca\u7684\u64fa\u653e\u65b9\u6848\u3002

\u5982\u5716 13-15 \u6240\u793a\uff0c\u7576 \\(n = 4\\) \u6642\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u5169\u500b\u89e3\u3002\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\u5171\u6709 \\(n^2\\) \u500b\u683c\u5b50\uff0c\u7d66\u51fa\u4e86\u6240\u6709\u7684\u9078\u64c7 choices \u3002\u5728\u9010\u500b\u653e\u7f6e\u7687\u540e\u7684\u904e\u7a0b\u4e2d\uff0c\u68cb\u76e4\u72c0\u614b\u5728\u4e0d\u65b7\u5730\u8b8a\u5316\uff0c\u6bcf\u500b\u6642\u523b\u7684\u68cb\u76e4\u5c31\u662f\u72c0\u614b state \u3002

\u5716 13-15 \u00a0 4 \u7687\u540e\u554f\u984c\u7684\u89e3

\u5716 13-16 \u5c55\u793a\u4e86\u672c\u984c\u7684\u4e09\u500b\u7d04\u675f\u689d\u4ef6\uff1a\u591a\u500b\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u689d\u5c0d\u89d2\u7dda\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5c0d\u89d2\u7dda\u5206\u70ba\u4e3b\u5c0d\u89d2\u7dda \\ \u548c\u6b21\u5c0d\u89d2\u7dda / \u5169\u7a2e\u3002

\u5716 13-16 \u00a0 n \u7687\u540e\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6

"},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

\u7687\u540e\u7684\u6578\u91cf\u548c\u68cb\u76e4\u7684\u884c\u6578\u90fd\u70ba \\(n\\) \uff0c\u56e0\u6b64\u6211\u5011\u5bb9\u6613\u5f97\u5230\u4e00\u500b\u63a8\u8ad6\uff1a\u68cb\u76e4\u6bcf\u884c\u90fd\u5141\u8a31\u4e14\u53ea\u5141\u8a31\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u5f9e\u7b2c\u4e00\u884c\u958b\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\uff0c\u76f4\u81f3\u6700\u5f8c\u4e00\u884c\u7d50\u675f\u3002

\u5716 13-17 \u6240\u793a\u70ba \\(4\\) \u7687\u540e\u554f\u984c\u7684\u9010\u884c\u653e\u7f6e\u904e\u7a0b\u3002\u53d7\u756b\u5e45\u9650\u5236\uff0c\u5716 13-17 \u50c5\u5c55\u958b\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u500b\u641c\u5c0b\u5206\u652f\uff0c\u4e26\u4e14\u5c07\u4e0d\u6eff\u8db3\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u65b9\u6848\u90fd\u9032\u884c\u4e86\u526a\u679d\u3002

\u5716 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73fe\u591a\u500b\u7687\u540e\u7684\u6240\u6709\u641c\u5c0b\u5206\u652f\u3002

"},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u8207\u5c0d\u89d2\u7dda\u526a\u679d","text":"

\u70ba\u4e86\u6eff\u8db3\u5217\u7d04\u675f\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u5e03\u6797\u578b\u9663\u5217 cols \u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u6c7a\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u5011\u900f\u904e cols \u5c07\u5df2\u6709\u7687\u540e\u7684\u5217\u9032\u884c\u526a\u679d\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u52d5\u614b\u66f4\u65b0 cols \u7684\u72c0\u614b\u3002

\u90a3\u9ebc\uff0c\u5982\u4f55\u8655\u7406\u5c0d\u89d2\u7dda\u7d04\u675f\u5462\uff1f\u8a2d\u68cb\u76e4\u4e2d\u67d0\u500b\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\((row, col)\\) \uff0c\u9078\u5b9a\u77e9\u9663\u4e2d\u7684\u67d0\u689d\u4e3b\u5c0d\u89d2\u7dda\uff0c\u6211\u5011\u767c\u73fe\u8a72\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u6e1b\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u70ba\u6046\u5b9a\u503c\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5982\u679c\u5169\u500b\u683c\u5b50\u6eff\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5247\u5b83\u5011\u4e00\u5b9a\u8655\u5728\u540c\u4e00\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u3002\u5229\u7528\u8a72\u898f\u5f8b\uff0c\u6211\u5011\u53ef\u4ee5\u85c9\u52a9\u5716 13-18 \u6240\u793a\u7684\u9663\u5217 diags1 \u8a18\u9304\u6bcf\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

\u540c\u7406\uff0c\u6b21\u5c0d\u89d2\u7dda\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6046\u5b9a\u503c\u3002\u6211\u5011\u540c\u6a23\u4e5f\u53ef\u4ee5\u85c9\u52a9\u9663\u5217 diags2 \u4f86\u8655\u7406\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002

\u5716 13-18 \u00a0 \u8655\u7406\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f

"},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u8acb\u6ce8\u610f\uff0c\\(n\\) \u7dad\u65b9\u9663\u4e2d \\(row - col\\) \u7684\u7bc4\u570d\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u7bc4\u570d\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7684\u6578\u91cf\u90fd\u70ba \\(2n - 1\\) \uff0c\u5373\u9663\u5217 diags1 \u548c diags2 \u7684\u9577\u5ea6\u90fd\u70ba \\(2n - 1\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u8d70\u8a2a\u6240\u6709\u5217\n    for col in range(n):\n        # \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
n_queens.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
n_queens.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
n_queens.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
n_queens.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
n_queens.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
n_queens.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
n_queens.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
n_queens.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u616e\u5217\u7d04\u675f\uff0c\u5247\u5f9e\u7b2c\u4e00\u884c\u5230\u6700\u5f8c\u4e00\u884c\u5206\u5225\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u500b\u9078\u64c7\uff0c\u4f7f\u7528 \\(O(n!)\\) \u6642\u9593\u3002\u7576\u8a18\u9304\u89e3\u6642\uff0c\u9700\u8981\u8907\u88fd\u77e9\u9663 state \u4e26\u65b0\u589e\u9032 res \uff0c\u8907\u88fd\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002\u56e0\u6b64\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n! \\cdot n^2)\\) \u3002\u5be6\u969b\u4e0a\uff0c\u6839\u64da\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u526a\u679d\u4e5f\u80fd\u5920\u5927\u5e45\u7e2e\u5c0f\u641c\u5c0b\u7a7a\u9593\uff0c\u56e0\u800c\u641c\u5c0b\u6548\u7387\u5f80\u5f80\u512a\u65bc\u4ee5\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u3002

\u9663\u5217 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff0c\u9663\u5217 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u554f\u984c","text":"

\u5168\u6392\u5217\u554f\u984c\u662f\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u7684\u5b9a\u7fa9\u662f\u5728\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff08\u5982\u4e00\u500b\u9663\u5217\u6216\u5b57\u4e32\uff09\u7684\u60c5\u6cc1\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u8868 13-2 \u5217\u8209\u4e86\u5e7e\u500b\u793a\u4f8b\u8cc7\u6599\uff0c\u5305\u62ec\u8f38\u5165\u9663\u5217\u548c\u5c0d\u61c9\u7684\u6240\u6709\u6392\u5217\u3002

\u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

\u8f38\u5165\u9663\u5217 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u7121\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\u3002\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u5011\u5148\u9078\u64c7 \\(1\\) \uff0c\u518d\u9078\u64c7 \\(3\\) \uff0c\u6700\u5f8c\u9078\u64c7 \\(2\\) \uff0c\u5247\u7372\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u92b7\u4e00\u500b\u9078\u64c7\uff0c\u4e4b\u5f8c\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002

\u5f9e\u56de\u6eaf\u7a0b\u5f0f\u78bc\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9078\u96c6\u5408 choices \u662f\u8f38\u5165\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72c0\u614b state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9078\u64c7\u7684\u5143\u7d20\u3002\u8acb\u6ce8\u610f\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u5141\u8a31\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u61c9\u8a72\u662f\u552f\u4e00\u7684\u3002

\u5982\u5716 13-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u641c\u5c0b\u904e\u7a0b\u5c55\u958b\u6210\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u7576\u524d\u72c0\u614b state \u3002\u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u7d93\u904e\u4e09\u8f2a\u9078\u64c7\u5f8c\u5230\u9054\u8449\u7bc0\u9ede\uff0c\u6bcf\u500b\u8449\u7bc0\u9ede\u90fd\u5c0d\u61c9\u4e00\u500b\u6392\u5217\u3002

\u5716 13-5 \u00a0 \u5168\u6392\u5217\u7684\u905e\u8ff4\u6a39

"},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u8907\u9078\u64c7\u526a\u679d","text":"

\u70ba\u4e86\u5be6\u73fe\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u6211\u5011\u8003\u616e\u5f15\u5165\u4e00\u500b\u5e03\u6797\u578b\u9663\u5217 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9078\u64c7\uff0c\u4e26\u57fa\u65bc\u5b83\u5be6\u73fe\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

  • \u5728\u505a\u51fa\u9078\u64c7 choice[i] \u5f8c\uff0c\u6211\u5011\u5c31\u5c07 selected[i] \u8ce6\u503c\u70ba \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9078\u64c7\u3002
  • \u8d70\u8a2a\u9078\u64c7\u4e32\u5217 choices \u6642\uff0c\u8df3\u904e\u6240\u6709\u5df2\u88ab\u9078\u64c7\u7684\u7bc0\u9ede\uff0c\u5373\u526a\u679d\u3002

\u5982\u5716 13-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u7b2c\u4e00\u8f2a\u9078\u64c7 1 \uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7 3 \uff0c\u7b2c\u4e09\u8f2a\u9078\u64c7 2 \uff0c\u5247\u9700\u8981\u5728\u7b2c\u4e8c\u8f2a\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f2a\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

\u5716 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

\u89c0\u5bdf\u5716 13-6 \u767c\u73fe\uff0c\u8a72\u526a\u679d\u64cd\u4f5c\u5c07\u641c\u5c0b\u7a7a\u9593\u5927\u5c0f\u5f9e \\(O(n^n)\\) \u6e1b\u5c0f\u81f3 \\(O(n!)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u60f3\u6e05\u695a\u4ee5\u4e0a\u8cc7\u8a0a\u4e4b\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u70ba\u4e86\u7e2e\u77ed\u6574\u9ad4\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4e0d\u55ae\u7368\u5be6\u73fe\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u7684\u5404\u500b\u51fd\u5f0f\uff0c\u800c\u662f\u5c07\u5b83\u5011\u5c55\u958b\u5728 backtrack() \u51fd\u5f0f\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if not selected[i]:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_i.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_i.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_i.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_i.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_i.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_i.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    if (!selected[i]) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_i.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_i.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_i.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
permutations_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u616e\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u8907\u7684\u6392\u5217\u3002

\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 1, 2]\\) \u3002\u70ba\u4e86\u65b9\u4fbf\u5340\u5206\u5169\u500b\u91cd\u8907\u5143\u7d20 \\(1\\) \uff0c\u6211\u5011\u5c07\u7b2c\u4e8c\u500b \\(1\\) \u8a18\u70ba \\(\\hat{1}\\) \u3002

\u5982\u5716 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u8907\u7684\u3002

\u5716 13-7 \u00a0 \u91cd\u8907\u6392\u5217

\u90a3\u9ebc\u5982\u4f55\u53bb\u9664\u91cd\u8907\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408\uff0c\u76f4\u63a5\u5c0d\u6392\u5217\u7d50\u679c\u9032\u884c\u53bb\u91cd\u3002\u7136\u800c\u9019\u6a23\u505a\u4e0d\u5920\u512a\u96c5\uff0c\u56e0\u70ba\u751f\u6210\u91cd\u8907\u6392\u5217\u7684\u641c\u5c0b\u5206\u652f\u6c92\u6709\u5fc5\u8981\uff0c\u61c9\u7576\u63d0\u524d\u8b58\u5225\u4e26\u526a\u679d\uff0c\u9019\u6a23\u53ef\u4ee5\u9032\u4e00\u6b65\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002

"},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u89c0\u5bdf\u5716 13-8 \uff0c\u5728\u7b2c\u4e00\u8f2a\u4e2d\uff0c\u9078\u64c7 \\(1\\) \u6216\u9078\u64c7 \\(\\hat{1}\\) \u662f\u7b49\u50f9\u7684\uff0c\u5728\u9019\u5169\u500b\u9078\u64c7\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u8907\u7684\u3002\u56e0\u6b64\u61c9\u8a72\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(2\\) \u4e4b\u5f8c\uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u61c9\u5c07\u7b2c\u4e8c\u8f2a\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u5728\u67d0\u4e00\u8f2a\u9078\u64c7\u4e2d\uff0c\u4fdd\u8b49\u591a\u500b\u76f8\u7b49\u7684\u5143\u7d20\u50c5\u88ab\u9078\u64c7\u4e00\u6b21\u3002

\u5716 13-8 \u00a0 \u91cd\u8907\u6392\u5217\u526a\u679d

"},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5728\u4e0a\u4e00\u984c\u7684\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u8003\u616e\u5728\u6bcf\u4e00\u8f2a\u9078\u64c7\u4e2d\u958b\u555f\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 duplicated \uff0c\u7528\u65bc\u8a18\u9304\u8a72\u8f2a\u4e2d\u5df2\u7d93\u5617\u8a66\u904e\u7684\u5143\u7d20\uff0c\u4e26\u5c07\u91cd\u8907\u5143\u7d20\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice)  # \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_ii.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.emplace(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_ii.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_ii.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.Add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_ii.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_ii.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_ii.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_ii.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_ii.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated[choice] = true; // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_ii.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
permutations_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5047\u8a2d\u5143\u7d20\u5169\u5169\u4e4b\u9593\u4e92\u4e0d\u76f8\u540c\uff0c\u5247 \\(n\\) \u500b\u5143\u7d20\u5171\u6709 \\(n!\\) \u7a2e\u6392\u5217\uff08\u968e\u4e58\uff09\uff1b\u5728\u8a18\u9304\u7d50\u679c\u6642\uff0c\u9700\u8981\u8907\u88fd\u9577\u5ea6\u70ba \\(n\\) \u7684\u4e32\u5217\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n!n)\\) \u3002

\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u540c\u4e00\u6642\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u500b duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\u3002\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u5169\u7a2e\u526a\u679d\u5c0d\u6bd4","text":"

\u8acb\u6ce8\u610f\uff0c\u96d6\u7136 selected \u548c duplicated \u90fd\u7528\u65bc\u526a\u679d\uff0c\u4f46\u5169\u8005\u7684\u76ee\u6a19\u4e0d\u540c\u3002

  • \u91cd\u8907\u9078\u64c7\u526a\u679d\uff1a\u6574\u500b\u641c\u5c0b\u904e\u7a0b\u4e2d\u53ea\u6709\u4e00\u500b selected \u3002\u5b83\u8a18\u9304\u7684\u662f\u7576\u524d\u72c0\u614b\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u500b\u5143\u7d20\u5728 state \u4e2d\u91cd\u8907\u51fa\u73fe\u3002
  • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f2a\u9078\u64c7\uff08\u6bcf\u500b\u547c\u53eb\u7684 backtrack \u51fd\u5f0f\uff09\u90fd\u5305\u542b\u4e00\u500b duplicated \u3002\u5b83\u8a18\u9304\u7684\u662f\u5728\u672c\u8f2a\u8d70\u8a2a\uff08for \u8ff4\u5708\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9078\u64c7\u904e\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8b49\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002

\u5716 13-9 \u5c55\u793a\u4e86\u5169\u500b\u526a\u679d\u689d\u4ef6\u7684\u751f\u6548\u7bc4\u570d\u3002\u6ce8\u610f\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u9078\u64c7\uff0c\u5f9e\u6839\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\u69cb\u6210\u4e00\u500b\u6392\u5217\u3002

\u5716 13-9 \u00a0 \u5169\u7a2e\u526a\u679d\u689d\u4ef6\u7684\u4f5c\u7528\u7bc4\u570d

"},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u7121\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ef\u4ee5\u88ab\u9078\u53d6\u591a\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

\u4f8b\u5982\uff0c\u8f38\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6a19\u6574\u6578 \\(9\\) \uff0c\u89e3\u70ba \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

  • \u8f38\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u91cd\u8907\u9078\u53d6\u3002
  • \u5b50\u96c6\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u500b\u5b50\u96c6\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c3\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

\u985e\u4f3c\u65bc\u5168\u6392\u5217\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\uff0c\u4e26\u5728\u9078\u64c7\u904e\u7a0b\u4e2d\u5be6\u6642\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u7576\u5143\u7d20\u548c\u7b49\u65bc target \u6642\uff0c\u5c31\u5c07\u5b50\u96c6\u8a18\u9304\u81f3\u7d50\u679c\u4e32\u5217\u3002

\u800c\u8207\u5168\u6392\u5217\u554f\u984c\u4e0d\u540c\u7684\u662f\uff0c\u672c\u984c\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u9078\u53d6\uff0c\u56e0\u6b64\u7121\u9808\u85c9\u52a9 selected \u5e03\u6797\u4e32\u5217\u4f86\u8a18\u9304\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9078\u64c7\u3002\u6211\u5011\u53ef\u4ee5\u5c0d\u5168\u6392\u5217\u7a0b\u5f0f\u78bc\u9032\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u984c\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
subset_sum_i_naive.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i_naive.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
subset_sum_i_naive.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
subset_sum_i_naive.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
subset_sum_i_naive.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6578\u91cf\u70ba0\n    backtrack(target, 0, nums, numsSize);\n}\n
subset_sum_i_naive.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
subset_sum_i_naive.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
subset_sum_i_naive.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5411\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u8f38\u5165\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u8f38\u51fa\u7d50\u679c\u70ba \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u96d6\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u70ba \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u8907\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

\u9019\u662f\u56e0\u70ba\u641c\u5c0b\u904e\u7a0b\u662f\u5340\u5206\u9078\u64c7\u9806\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u5340\u5206\u9078\u64c7\u9806\u5e8f\u3002\u5982\u5716 13-10 \u6240\u793a\uff0c\u5148\u9078 \\(4\\) \u5f8c\u9078 \\(5\\) \u8207\u5148\u9078 \\(5\\) \u5f8c\u9078 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5c0d\u61c9\u540c\u4e00\u500b\u5b50\u96c6\u3002

\u5716 13-10 \u00a0 \u5b50\u96c6\u641c\u5c0b\u8207\u8d8a\u754c\u526a\u679d

\u70ba\u4e86\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u601d\u8def\u662f\u5c0d\u7d50\u679c\u4e32\u5217\u9032\u884c\u53bb\u91cd\u3002\u4f46\u9019\u500b\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u5169\u65b9\u9762\u539f\u56e0\u3002

  • \u7576\u9663\u5217\u5143\u7d20\u8f03\u591a\uff0c\u5c24\u5176\u662f\u7576 target \u8f03\u5927\u6642\uff0c\u641c\u5c0b\u904e\u7a0b\u6703\u7522\u751f\u5927\u91cf\u7684\u91cd\u8907\u5b50\u96c6\u3002
  • \u6bd4\u8f03\u5b50\u96c6\uff08\u9663\u5217\uff09\u7684\u7570\u540c\u975e\u5e38\u8017\u6642\uff0c\u9700\u8981\u5148\u6392\u5e8f\u9663\u5217\uff0c\u518d\u6bd4\u8f03\u9663\u5217\u4e2d\u6bcf\u500b\u5143\u7d20\u7684\u7570\u540c\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u8907\u5b50\u96c6\u526a\u679d","text":"

\u6211\u5011\u8003\u616e\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u900f\u904e\u526a\u679d\u9032\u884c\u53bb\u91cd\u3002\u89c0\u5bdf\u5716 13-11 \uff0c\u91cd\u8907\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u9806\u5e8f\u9078\u64c7\u9663\u5217\u5143\u7d20\u6642\u7522\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u6cc1\u3002

  1. \u7576\u7b2c\u4e00\u8f2a\u548c\u7b2c\u4e8c\u8f2a\u5206\u5225\u9078\u64c7 \\(3\\) \u548c \\(4\\) \u6642\uff0c\u6703\u751f\u6210\u5305\u542b\u9019\u5169\u500b\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8a18\u70ba \\([3, 4, \\dots]\\) \u3002
  2. \u4e4b\u5f8c\uff0c\u7576\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(4\\) \u6642\uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \uff0c\u56e0\u70ba\u8a72\u9078\u64c7\u7522\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c64\u7684\u9078\u64c7\u90fd\u662f\u5f9e\u5de6\u5230\u53f3\u88ab\u9010\u500b\u5617\u8a66\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

  1. \u524d\u5169\u8f2a\u9078\u64c7 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
  2. \u524d\u5169\u8f2a\u9078\u64c7 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
  3. \u82e5\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(5\\) \uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u70ba\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u8207\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

\u5716 13-11 \u00a0 \u4e0d\u540c\u9078\u64c7\u9806\u5e8f\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

\u7e3d\u7d50\u4f86\u770b\uff0c\u7d66\u5b9a\u8f38\u5165\u9663\u5217 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8a2d\u641c\u5c0b\u904e\u7a0b\u4e2d\u7684\u9078\u64c7\u5e8f\u5217\u70ba \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5247\u8a72\u9078\u64c7\u5e8f\u5217\u9700\u8981\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6eff\u8db3\u8a72\u689d\u4ef6\u7684\u9078\u64c7\u5e8f\u5217\u90fd\u6703\u9020\u6210\u91cd\u8907\uff0c\u61c9\u7576\u526a\u679d\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u70ba\u5be6\u73fe\u8a72\u526a\u679d\uff0c\u6211\u5011\u521d\u59cb\u5316\u8b8a\u6578 start \uff0c\u7528\u65bc\u6307\u793a\u8d70\u8a2a\u8d77\u59cb\u9ede\u3002\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i\\) \u958b\u59cb\u8d70\u8a2a\u3002\u9019\u6a23\u505a\u5c31\u53ef\u4ee5\u8b93\u9078\u64c7\u5e8f\u5217\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u5f9e\u800c\u4fdd\u8b49\u5b50\u96c6\u552f\u4e00\u3002

\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u5011\u9084\u5c0d\u7a0b\u5f0f\u78bc\u9032\u884c\u4e86\u4ee5\u4e0b\u5169\u9805\u6700\u4f73\u5316\u3002

  • \u5728\u958b\u555f\u641c\u5c0b\u524d\uff0c\u5148\u5c07\u9663\u5217 nums \u6392\u5e8f\u3002\u5728\u8d70\u8a2a\u6240\u6709\u9078\u64c7\u6642\uff0c\u7576\u5b50\u96c6\u548c\u8d85\u904e target \u6642\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\uff0c\u56e0\u70ba\u5f8c\u908a\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target \u3002
  • \u7701\u53bb\u5143\u7d20\u548c\u8b8a\u6578 total \uff0c\u900f\u904e\u5728 target \u4e0a\u57f7\u884c\u6e1b\u6cd5\u4f86\u7d71\u8a08\u5143\u7d20\u548c\uff0c\u7576 target \u7b49\u65bc \\(0\\) \u6642\u8a18\u9304\u89e3\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_i.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_i.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_i.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_i.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                           // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    backtrack(target, nums, numsSize, start);\n}\n
subset_sum_i.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
subset_sum_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-12 \u6240\u793a\u70ba\u5c07\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u8f38\u5165\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u5f8c\u7684\u6574\u9ad4\u56de\u6eaf\u904e\u7a0b\u3002

\u5716 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u904e\u7a0b

"},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u616e\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u53ef\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

\u76f8\u6bd4\u65bc\u4e0a\u984c\uff0c\u672c\u984c\u7684\u8f38\u5165\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u9019\u5f15\u5165\u4e86\u65b0\u7684\u554f\u984c\u3002\u4f8b\u5982\uff0c\u7d66\u5b9a\u9663\u5217 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u5247\u73fe\u6709\u7a0b\u5f0f\u78bc\u7684\u8f38\u51fa\u7d50\u679c\u70ba \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73fe\u4e86\u91cd\u8907\u5b50\u96c6\u3002

\u9020\u6210\u9019\u7a2e\u91cd\u8907\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f2a\u4e2d\u88ab\u591a\u6b21\u9078\u64c7\u3002\u5728\u5716 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f2a\u5171\u6709\u4e09\u500b\u9078\u64c7\uff0c\u5176\u4e2d\u5169\u500b\u90fd\u70ba \\(4\\) \uff0c\u6703\u7522\u751f\u5169\u500b\u91cd\u8907\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5f9e\u800c\u8f38\u51fa\u91cd\u8907\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f2a\u7684\u5169\u500b \\(4\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002

\u5716 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

"},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5be6\u73fe\u65b9\u5f0f\u6bd4\u8f03\u5de7\u5999\uff1a\u7531\u65bc\u9663\u5217\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u9130\u7684\u3002\u9019\u610f\u5473\u8457\u5728\u67d0\u8f2a\u9078\u64c7\u4e2d\uff0c\u82e5\u7576\u524d\u5143\u7d20\u8207\u5176\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u5247\u8aaa\u660e\u5b83\u5df2\u7d93\u88ab\u9078\u64c7\u904e\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u904e\u7576\u524d\u5143\u7d20\u3002

\u8207\u6b64\u540c\u6642\uff0c\u672c\u984c\u898f\u5b9a\u6bcf\u500b\u9663\u5217\u5143\u7d20\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5e78\u904b\u7684\u662f\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u5229\u7528\u8b8a\u6578 start \u4f86\u6eff\u8db3\u8a72\u7d04\u675f\uff1a\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i + 1\\) \u958b\u59cb\u5411\u5f8c\u8d70\u8a2a\u3002\u9019\u6a23\u65e2\u80fd\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u8907\u9078\u64c7\u5143\u7d20\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_ii.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_ii.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_ii.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_ii.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_ii.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u8df3\u904e\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u958b\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
subset_sum_ii.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
subset_sum_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-14 \u5c55\u793a\u4e86\u9663\u5217 \\([4, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u904e\u7a0b\uff0c\u5171\u5305\u542b\u56db\u7a2e\u526a\u679d\u64cd\u4f5c\u3002\u8acb\u4f60\u5c07\u5716\u793a\u8207\u7a0b\u5f0f\u78bc\u8a3b\u91cb\u76f8\u7d50\u5408\uff0c\u7406\u89e3\u6574\u500b\u641c\u5c0b\u904e\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u7a2e\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

\u5716 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u904e\u7a0b

"},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u662f\u7aae\u8209\u6cd5\uff0c\u900f\u904e\u5c0d\u89e3\u7a7a\u9593\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4f86\u5c0b\u627e\u7b26\u5408\u689d\u4ef6\u7684\u89e3\u3002\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u9047\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u5247\u8a18\u9304\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u8d70\u8a2a\u5b8c\u6210\u5f8c\u7d50\u675f\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u641c\u5c0b\u904e\u7a0b\u5305\u62ec\u5617\u8a66\u8207\u56de\u9000\u5169\u500b\u90e8\u5206\u3002\u5b83\u900f\u904e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4f86\u5617\u8a66\u5404\u7a2e\u9078\u64c7\uff0c\u7576\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u60c5\u6cc1\u6642\uff0c\u5247\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002\u5617\u8a66\u8207\u56de\u9000\u662f\u5169\u500b\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
  • \u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u5b83\u5011\u53ef\u7528\u65bc\u5be6\u73fe\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7d50\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u5c0b\u6548\u7387\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u65bc\u89e3\u6c7a\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u3002\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u96d6\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u6f14\u7b97\u6cd5\u89e3\u6c7a\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
  • \u5168\u6392\u5217\u554f\u984c\u65e8\u5728\u641c\u5c0b\u7d66\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u500b\u5143\u7d20\u662f\u5426\u88ab\u9078\u64c7\uff0c\u526a\u6389\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\u7684\u641c\u5c0b\u5206\u652f\uff0c\u78ba\u4fdd\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002
  • \u5728\u5168\u6392\u5217\u554f\u984c\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff0c\u5247\u6700\u7d42\u7d50\u679c\u6703\u51fa\u73fe\u91cd\u8907\u6392\u5217\u3002\u6211\u5011\u9700\u8981\u7d04\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u9019\u901a\u5e38\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408\u4f86\u5be6\u73fe\u3002
  • \u5b50\u96c6\u548c\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u7d66\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u70ba\u76ee\u6a19\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u800c\u641c\u5c0b\u904e\u7a0b\u6703\u8f38\u51fa\u6240\u6709\u9806\u5e8f\u7684\u7d50\u679c\uff0c\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002\u6211\u5011\u5728\u56de\u6eaf\u524d\u5c07\u8cc7\u6599\u9032\u884c\u6392\u5e8f\uff0c\u4e26\u8a2d\u5b9a\u4e00\u500b\u8b8a\u6578\u4f86\u6307\u793a\u6bcf\u4e00\u8f2a\u7684\u8d70\u8a2a\u8d77\u59cb\u9ede\uff0c\u5f9e\u800c\u5c07\u751f\u6210\u91cd\u8907\u5b50\u96c6\u7684\u641c\u5c0b\u5206\u652f\u9032\u884c\u526a\u679d\u3002
  • \u5c0d\u65bc\u5b50\u96c6\u548c\u554f\u984c\uff0c\u9663\u5217\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u6703\u7522\u751f\u91cd\u8907\u96c6\u5408\u3002\u6211\u5011\u5229\u7528\u9663\u5217\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\uff0c\u900f\u904e\u5224\u65b7\u76f8\u9130\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5be6\u73fe\u526a\u679d\uff0c\u5f9e\u800c\u78ba\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u4e2d\u4e00\u6b21\u3002
  • \\(n\\) \u7687\u540e\u554f\u984c\u65e8\u5728\u5c0b\u627e\u5c07 \\(n\\) \u500b\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76e4\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u5169\u5169\u4e4b\u9593\u7121\u6cd5\u653b\u64ca\u5c0d\u65b9\u3002\u8a72\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6\u6709\u884c\u7d04\u675f\u3001\u5217\u7d04\u675f\u3001\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002\u70ba\u6eff\u8db3\u884c\u7d04\u675f\uff0c\u6211\u5011\u63a1\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8b49\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002
  • \u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u8655\u7406\u65b9\u5f0f\u985e\u4f3c\u3002\u5c0d\u65bc\u5217\u7d04\u675f\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u5f9e\u800c\u6307\u793a\u9078\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5c0d\u65bc\u5c0d\u89d2\u7dda\u7d04\u675f\uff0c\u6211\u5011\u85c9\u52a9\u5169\u500b\u9663\u5217\u4f86\u5206\u5225\u8a18\u9304\u8a72\u4e3b\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96e3\u9ede\u5728\u65bc\u627e\u8655\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5c0d\u89d2\u7dda\u4e0a\u683c\u5b50\u6eff\u8db3\u7684\u884c\u5217\u7d22\u5f15\u898f\u5f8b\u3002
"},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u600e\u9ebc\u7406\u89e3\u56de\u6eaf\u548c\u905e\u8ff4\u7684\u95dc\u4fc2\uff1f

\u7e3d\u7684\u4f86\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u7a2e\u201c\u6f14\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u905e\u8ff4\u66f4\u50cf\u662f\u4e00\u500b\u201c\u5de5\u5177\u201d\u3002

  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u905e\u8ff4\u7684\u61c9\u7528\u5834\u666f\u4e4b\u4e00\uff0c\u662f\u905e\u8ff4\u5728\u641c\u5c0b\u554f\u984c\u4e2d\u7684\u61c9\u7528\u3002
  • \u905e\u8ff4\u7684\u7d50\u69cb\u9ad4\u73fe\u4e86\u201c\u5b50\u554f\u984c\u5206\u89e3\u201d\u7684\u89e3\u984c\u7bc4\u5f0f\uff0c\u5e38\u7528\u65bc\u89e3\u6c7a\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\uff08\u8a18\u61b6\u5316\u905e\u8ff4\uff09\u7b49\u554f\u984c\u3002
"},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

Abstract

\u8907\u96dc\u5ea6\u5206\u6790\u7336\u5982\u6d69\u701a\u7684\u6f14\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u6642\u7a7a\u56ae\u5c0e\u3002

\u5b83\u5e36\u9818\u6211\u5011\u5728\u6642\u9593\u8207\u7a7a\u9593\u9019\u5169\u500b\u7dad\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5c0b\u627e\u66f4\u512a\u96c5\u7684\u89e3\u6c7a\u65b9\u6848\u3002

"},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30
  • 2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4
  • 2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6
  • 2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6
  • 2.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4","text":"

\u5728\u6f14\u7b97\u6cd5\u4e2d\uff0c\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u662f\u5f88\u5e38\u898b\u7684\uff0c\u5b83\u8207\u8907\u96dc\u5ea6\u5206\u6790\u606f\u606f\u76f8\u95dc\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7d39\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u4e4b\u524d\uff0c\u6211\u5011\u5148\u4f86\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5f0f\u4e2d\u5be6\u73fe\u91cd\u8907\u57f7\u884c\u4efb\u52d9\uff0c\u5373\u5169\u7a2e\u57fa\u672c\u7684\u7a0b\u5f0f\u63a7\u5236\u7d50\u69cb\uff1a\u8fed\u4ee3\u3001\u905e\u8ff4\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

\u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u7a2e\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u7684\u63a7\u5236\u7d50\u69cb\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5f0f\u6703\u5728\u6eff\u8db3\u4e00\u5b9a\u7684\u689d\u4ef6\u4e0b\u91cd\u8907\u57f7\u884c\u67d0\u6bb5\u7a0b\u5f0f\u78bc\uff0c\u76f4\u5230\u9019\u500b\u689d\u4ef6\u4e0d\u518d\u6eff\u8db3\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u8ff4\u5708","text":"

for \u8ff4\u5708\u662f\u6700\u5e38\u898b\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9069\u5408\u5728\u9810\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6578\u6642\u4f7f\u7528\u3002

\u4ee5\u4e0b\u51fd\u5f0f\u57fa\u65bc for \u8ff4\u5708\u5be6\u73fe\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7d50\u679c\u4f7f\u7528\u8b8a\u6578 res \u8a18\u9304\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5c0d\u61c9\u7684\u5340\u9593\u662f\u201c\u5de6\u9589\u53f3\u958b\u201d\u7684\uff0c\u5c0d\u61c9\u7684\u8d70\u8a2a\u7bc4\u570d\u70ba \\(a, a + 1, \\dots, b-1\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u8ff4\u5708\"\"\"\n    res = 0\n    # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u8ff4\u5708 */\nint ForLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u8ff4\u5708 */\nfunc forLoop(n int) int {\n    res := 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u8ff4\u5708 */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u8ff4\u5708 */\nfunction forLoop(n) {\n    let res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u8ff4\u5708 */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n  int res = 0;\n  // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u8ff4\u5708 */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u8ff4\u5708 */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u8ff4\u5708 ###\ndef for_loop(n)\n  res = 0\n\n  # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u8ff4\u5708\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-1 \u662f\u8a72\u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716\u3002

\u5716 2-1 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716

\u6b64\u6c42\u548c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6210\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u9019\u500b\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u76f8\u95dc\u5167\u5bb9\u5c07\u6703\u5728\u4e0b\u4e00\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u8ff4\u5708","text":"

\u8207 for \u8ff4\u5708\u985e\u4f3c\uff0cwhile \u8ff4\u5708\u4e5f\u662f\u4e00\u7a2e\u5be6\u73fe\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u7a0b\u5f0f\u6bcf\u8f2a\u90fd\u6703\u5148\u6aa2\u67e5\u689d\u4ef6\uff0c\u5982\u679c\u689d\u4ef6\u70ba\u771f\uff0c\u5247\u7e7c\u7e8c\u57f7\u884c\uff0c\u5426\u5247\u5c31\u7d50\u675f\u8ff4\u5708\u3002

\u4e0b\u9762\u6211\u5011\u7528 while \u8ff4\u5708\u4f86\u5be6\u73fe\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u8ff4\u5708\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    return res\n
iteration.cpp
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.java
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.cs
/* while \u8ff4\u5708 */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.go
/* while \u8ff4\u5708 */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    i := 1\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u8ff4\u5708 */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res\n}\n
iteration.js
/* while \u8ff4\u5708 */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.ts
/* while \u8ff4\u5708 */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.dart
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n  // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n  }\n  return res;\n}\n
iteration.rs
/* while \u8ff4\u5708 */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    res\n}\n
iteration.c
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.kt
/* while \u8ff4\u5708 */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res\n}\n
iteration.rb
### while \u8ff4\u5708 ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n  # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n  end\n\n  res\nend\n
iteration.zig
// while \u8ff4\u5708\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

while \u8ff4\u5708\u6bd4 for \u8ff4\u5708\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u81ea\u7531\u5730\u8a2d\u8a08\u689d\u4ef6\u8b8a\u6578\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9a5f\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u689d\u4ef6\u8b8a\u6578 \\(i\\) \u6bcf\u8f2a\u9032\u884c\u5169\u6b21\u66f4\u65b0\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u8ff4\u5708\u5be6\u73fe\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    # \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    i := 1\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n  // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n  # \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u7684\u4f86\u8aaa\uff0cfor \u8ff4\u5708\u7684\u7a0b\u5f0f\u78bc\u66f4\u52a0\u7dca\u6e4a\uff0cwhile \u8ff4\u5708\u66f4\u52a0\u9748\u6d3b\uff0c\u5169\u8005\u90fd\u53ef\u4ee5\u5be6\u73fe\u8fed\u4ee3\u7d50\u69cb\u3002\u9078\u64c7\u4f7f\u7528\u54ea\u4e00\u500b\u61c9\u8a72\u6839\u64da\u7279\u5b9a\u554f\u984c\u7684\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5de2\u72c0\u8ff4\u5708","text":"

\u6211\u5011\u53ef\u4ee5\u5728\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\u5167\u5de2\u72c0\u53e6\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\uff0c\u4e0b\u9762\u4ee5 for \u8ff4\u5708\u70ba\u4f8b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u96d9\u5c64 for \u8ff4\u5708\"\"\"\n    res = \"\"\n    # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u96d9\u5c64 for \u8ff4\u5708 */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u96d9\u5c64 for \u8ff4\u5708 */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u96d9\u5c64 for \u8ff4\u5708 */\nchar *nestedForLoop(int n) {\n    // n * n \u70ba\u5c0d\u61c9\u9ede\u6578\u91cf\uff0c\"(i, j), \" \u5c0d\u61c9\u5b57\u4e32\u9577\u6700\u5927\u70ba 6+10*2\uff0c\u52a0\u4e0a\u6700\u5f8c\u4e00\u500b\u7a7a\u5b57\u5143 \\0 \u7684\u984d\u5916\u7a7a\u9593\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u96d9\u5c64 for \u8ff4\u5708 ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u8ff4\u5708 j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u96d9\u5c64 for \u8ff4\u5708\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-2 \u662f\u8a72\u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716\u3002

\u5716 2-2 \u00a0 \u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716

\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207 \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u548c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u95dc\u4fc2\u201d\u3002

\u6211\u5011\u53ef\u4ee5\u7e7c\u7e8c\u65b0\u589e\u5de2\u72c0\u8ff4\u5708\uff0c\u6bcf\u4e00\u6b21\u5de2\u72c0\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7dad\u201d\uff0c\u5c07\u6703\u4f7f\u6642\u9593\u8907\u96dc\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u95dc\u4fc2\u201d\u201c\u56db\u6b21\u65b9\u95dc\u4fc2\u201d\uff0c\u4ee5\u6b64\u985e\u63a8\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u905e\u8ff4","text":"

\u905e\u8ff4\uff08recursion\uff09\u662f\u4e00\u7a2e\u6f14\u7b97\u6cd5\u7b56\u7565\uff0c\u900f\u904e\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\u4f86\u89e3\u6c7a\u554f\u984c\u3002\u5b83\u4e3b\u8981\u5305\u542b\u5169\u500b\u968e\u6bb5\u3002

  1. \u905e\uff1a\u7a0b\u5f0f\u4e0d\u65b7\u6df1\u5165\u5730\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u50b3\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\uff0c\u76f4\u5230\u9054\u5230\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u3002
  2. \u8ff4\uff1a\u89f8\u767c\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u5f8c\uff0c\u7a0b\u5f0f\u5f9e\u6700\u6df1\u5c64\u7684\u905e\u8ff4\u51fd\u5f0f\u958b\u59cb\u9010\u5c64\u8fd4\u56de\uff0c\u532f\u805a\u6bcf\u4e00\u5c64\u7684\u7d50\u679c\u3002

\u800c\u5f9e\u5be6\u73fe\u7684\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u7a0b\u5f0f\u78bc\u4e3b\u8981\u5305\u542b\u4e09\u500b\u8981\u7d20\u3002

  1. \u7d42\u6b62\u689d\u4ef6\uff1a\u7528\u65bc\u6c7a\u5b9a\u4ec0\u9ebc\u6642\u5019\u7531\u201c\u905e\u201d\u8f49\u201c\u8ff4\u201d\u3002
  2. \u905e\u8ff4\u547c\u53eb\uff1a\u5c0d\u61c9\u201c\u905e\u201d\uff0c\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u8f38\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\u3002
  3. \u8fd4\u56de\u7d50\u679c\uff1a\u5c0d\u61c9\u201c\u8ff4\u201d\uff0c\u5c07\u7576\u524d\u905e\u8ff4\u5c64\u7d1a\u7684\u7d50\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c64\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u53ea\u9700\u547c\u53eb\u51fd\u5f0f recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8a08\u7b97\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 1:\n        return 1\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res = recur(n - 1)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n
recursion.cpp
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.java
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.cs
/* \u905e\u8ff4 */\nint Recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = Recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.go
/* \u905e\u8ff4 */\nfunc recur(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res := recur(n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.swift
/* \u905e\u8ff4 */\nfunc recur(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n: n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.js
/* \u905e\u8ff4 */\nfunction recur(n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.ts
/* \u905e\u8ff4 */\nfunction recur(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.dart
/* \u905e\u8ff4 */\nint recur(int n) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 1) return 1;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  int res = recur(n - 1);\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  return n + res;\n}\n
recursion.rs
/* \u905e\u8ff4 */\nfn recur(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    n + res\n}\n
recursion.c
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.kt
/* \u905e\u8ff4 */\nfun recur(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    val res = recur(n - 1)\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.rb
### \u905e\u8ff4 ###\ndef recur(n)\n  # \u7d42\u6b62\u689d\u4ef6\n  return 1 if n == 1\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  res = recur(n - 1)\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  n + res\nend\n
recursion.zig
// \u905e\u8ff4\u51fd\u5f0f\nfn recur(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var res: i32 = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-3 \u5c55\u793a\u4e86\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b\u3002

\u5716 2-3 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b

\u96d6\u7136\u5f9e\u8a08\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u8207\u905e\u8ff4\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7d50\u679c\uff0c\u4f46\u5b83\u5011\u4ee3\u8868\u4e86\u5169\u7a2e\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u6c7a\u554f\u984c\u7684\u7bc4\u5f0f\u3002

  • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5f9e\u6700\u57fa\u790e\u7684\u6b65\u9a5f\u958b\u59cb\uff0c\u7136\u5f8c\u4e0d\u65b7\u91cd\u8907\u6216\u7d2f\u52a0\u9019\u4e9b\u6b65\u9a5f\uff0c\u76f4\u5230\u4efb\u52d9\u5b8c\u6210\u3002
  • \u905e\u8ff4\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u9019\u4e9b\u5b50\u554f\u984c\u548c\u539f\u554f\u984c\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u4f86\u5c07\u5b50\u554f\u984c\u7e7c\u7e8c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u6cc1\u6642\u505c\u6b62\uff08\u57fa\u672c\u60c5\u6cc1\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

\u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u5f0f\u70ba\u4f8b\uff0c\u8a2d\u554f\u984c \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

  • \u8fed\u4ee3\uff1a\u5728\u8ff4\u5708\u4e2d\u6a21\u64ec\u6c42\u548c\u904e\u7a0b\uff0c\u5f9e \\(1\\) \u8d70\u8a2a\u5230 \\(n\\) \uff0c\u6bcf\u8f2a\u57f7\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
  • \u905e\u8ff4\uff1a\u5c07\u554f\u984c\u5206\u89e3\u70ba\u5b50\u554f\u984c \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65b7\uff08\u905e\u8ff4\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u6cc1 \\(f(1) = 1\\) \u6642\u7d42\u6b62\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u547c\u53eb\u5806\u758a","text":"

\u905e\u8ff4\u51fd\u5f0f\u6bcf\u6b21\u547c\u53eb\u81ea\u8eab\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u70ba\u65b0\u958b\u555f\u7684\u51fd\u5f0f\u5206\u914d\u8a18\u61b6\u9ad4\uff0c\u4ee5\u5132\u5b58\u5340\u57df\u6027\u8b8a\u6578\u3001\u547c\u53eb\u4f4d\u5740\u548c\u5176\u4ed6\u8cc7\u8a0a\u7b49\u3002\u9019\u5c07\u5c0e\u81f4\u5169\u65b9\u9762\u7684\u7d50\u679c\u3002

  • \u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u90fd\u5132\u5b58\u5728\u7a31\u70ba\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u7684\u8a18\u61b6\u9ad4\u5340\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u5f0f\u8fd4\u56de\u5f8c\u624d\u6703\u88ab\u91cb\u653e\u3002\u56e0\u6b64\uff0c\u905e\u8ff4\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u905e\u8ff4\u547c\u53eb\u51fd\u5f0f\u6703\u7522\u751f\u984d\u5916\u7684\u958b\u92b7\u3002\u56e0\u6b64\u905e\u8ff4\u901a\u5e38\u6bd4\u8ff4\u5708\u7684\u6642\u9593\u6548\u7387\u66f4\u4f4e\u3002

\u5982\u5716 2-4 \u6240\u793a\uff0c\u5728\u89f8\u767c\u7d42\u6b62\u689d\u4ef6\u524d\uff0c\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u51fd\u5f0f\uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002

\u5716 2-4 \u00a0 \u905e\u8ff4\u547c\u53eb\u6df1\u5ea6

\u5728\u5be6\u969b\u4e2d\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u5141\u8a31\u7684\u905e\u8ff4\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u904e\u6df1\u7684\u905e\u8ff4\u53ef\u80fd\u5c0e\u81f4\u5806\u758a\u6ea2\u4f4d\u932f\u8aa4\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u905e\u8ff4","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u5f0f\u5728\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u6b65\u624d\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5247\u8a72\u51fd\u5f0f\u53ef\u4ee5\u88ab\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u6700\u4f73\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u9593\u6548\u7387\u4e0a\u8207\u8fed\u4ee3\u76f8\u7576\u3002\u9019\u7a2e\u60c5\u6cc1\u88ab\u7a31\u70ba\u5c3e\u905e\u8ff4\uff08tail recursion\uff09\u3002

  • \u666e\u901a\u905e\u8ff4\uff1a\u7576\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u7684\u51fd\u5f0f\u5f8c\uff0c\u9700\u8981\u7e7c\u7e8c\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u56e0\u6b64\u7cfb\u7d71\u9700\u8981\u5132\u5b58\u4e0a\u4e00\u5c64\u547c\u53eb\u7684\u4e0a\u4e0b\u6587\u3002
  • \u5c3e\u905e\u8ff4\uff1a\u905e\u8ff4\u547c\u53eb\u662f\u51fd\u5f0f\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u500b\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u5f8c\uff0c\u7121\u9808\u7e7c\u7e8c\u57f7\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7d71\u7121\u9808\u5132\u5b58\u4e0a\u4e00\u5c64\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u3002

\u4ee5\u8a08\u7b97 \\(1 + 2 + \\dots + n\\) \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u7d50\u679c\u8b8a\u6578 res \u8a2d\u70ba\u51fd\u5f0f\u53c3\u6578\uff0c\u5f9e\u800c\u5be6\u73fe\u5c3e\u905e\u8ff4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u905e\u8ff4 */\nint TailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n int, res int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n, res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u905e\u8ff4\u547c\u53eb\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u905e\u8ff4 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u905e\u8ff4 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u65b0\u589e tailrec \u95dc\u9375\u8a5e\uff0c\u4ee5\u958b\u555f\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u905e\u8ff4 ###\ndef tail_recur(n, res)\n  # \u7d42\u6b62\u689d\u4ef6\n  return res if n == 0\n  # \u5c3e\u905e\u8ff4\u547c\u53eb\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u905e\u8ff4\u51fd\u5f0f\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5c3e\u905e\u8ff4\u7684\u57f7\u884c\u904e\u7a0b\u5982\u5716 2-5 \u6240\u793a\u3002\u5c0d\u6bd4\u666e\u901a\u905e\u8ff4\u548c\u5c3e\u905e\u8ff4\uff0c\u5169\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u57f7\u884c\u9ede\u662f\u4e0d\u540c\u7684\u3002

  • \u666e\u901a\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u6bcf\u5c64\u8fd4\u56de\u5f8c\u90fd\u8981\u518d\u57f7\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
  • \u5c3e\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u53ea\u9700\u5c64\u5c64\u8fd4\u56de\u3002

\u5716 2-5 \u00a0 \u5c3e\u905e\u8ff4\u904e\u7a0b

Tip

\u8acb\u6ce8\u610f\uff0c\u8a31\u591a\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u4e26\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u3002\u4f8b\u5982\uff0cPython \u9810\u8a2d\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u5f0f\u662f\u5c3e\u905e\u8ff4\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u6703\u9047\u5230\u5806\u758a\u6ea2\u4f4d\u554f\u984c\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u905e\u8ff4\u6a39","text":"

\u7576\u8655\u7406\u8207\u201c\u5206\u6cbb\u201d\u76f8\u95dc\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u905e\u8ff4\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c0\u3001\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6613\u8b80\u3002\u4ee5\u201c\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u201d\u70ba\u4f8b\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u8cbb\u6ce2\u90a3\u5951\u6578\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8a72\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u3002

\u8a2d\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u70ba \\(f(n)\\) \uff0c\u6613\u5f97\u5169\u500b\u7d50\u8ad6\u3002

  • \u6578\u5217\u7684\u524d\u5169\u500b\u6578\u5b57\u70ba \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
  • \u6578\u5217\u4e2d\u7684\u6bcf\u500b\u6578\u5b57\u662f\u524d\u5169\u500b\u6578\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

\u6309\u7167\u905e\u63a8\u95dc\u4fc2\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5c07\u524d\u5169\u500b\u6578\u5b57\u4f5c\u70ba\u7d42\u6b62\u689d\u4ef6\uff0c\u4fbf\u53ef\u5beb\u51fa\u905e\u8ff4\u7a0b\u5f0f\u78bc\u3002\u547c\u53eb fib(n) \u5373\u53ef\u5f97\u5230\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n
recursion.cpp
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint Fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.js
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n  // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7d50\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfn fib(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c\n    res\n}\n
recursion.c
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfun fib(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.rb
### \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 ###\ndef fib(n)\n  # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7d50\u679c f(n)\n  res\nend\n
recursion.zig
// \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\nfn fib(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u5728\u51fd\u5f0f\u5167\u905e\u8ff4\u547c\u53eb\u4e86\u5169\u500b\u51fd\u5f0f\uff0c\u9019\u610f\u5473\u8457\u5f9e\u4e00\u500b\u547c\u53eb\u7522\u751f\u4e86\u5169\u500b\u547c\u53eb\u5206\u652f\u3002\u5982\u5716 2-6 \u6240\u793a\uff0c\u9019\u6a23\u4e0d\u65b7\u905e\u8ff4\u547c\u53eb\u4e0b\u53bb\uff0c\u6700\u7d42\u5c07\u7522\u751f\u4e00\u68f5\u5c64\u6578\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff08recursion tree\uff09\u3002

\u5716 2-6 \u00a0 \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u905e\u8ff4\u6a39

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u905e\u8ff4\u9ad4\u73fe\u4e86\u201c\u5c07\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u5b50\u554f\u984c\u201d\u7684\u601d\u7dad\u7bc4\u5f0f\uff0c\u9019\u7a2e\u5206\u6cbb\u7b56\u7565\u81f3\u95dc\u91cd\u8981\u3002

  • \u5f9e\u6f14\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u7b49\u8a31\u591a\u91cd\u8981\u6f14\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u9593\u63a5\u5730\u61c9\u7528\u4e86\u9019\u7a2e\u601d\u7dad\u65b9\u5f0f\u3002
  • \u5f9e\u8cc7\u6599\u7d50\u69cb\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u5929\u7136\u9069\u5408\u8655\u7406\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u76f8\u95dc\u554f\u984c\uff0c\u56e0\u70ba\u5b83\u5011\u975e\u5e38\u9069\u5408\u7528\u5206\u6cbb\u601d\u60f3\u9032\u884c\u5206\u6790\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u5169\u8005\u5c0d\u6bd4","text":"

\u7e3d\u7d50\u4ee5\u4e0a\u5167\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5be6\u73fe\u3001\u6548\u80fd\u548c\u9069\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

\u8868 2-1 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4\u7279\u9ede\u5c0d\u6bd4

\u8fed\u4ee3 \u905e\u8ff4 \u5be6\u73fe\u65b9\u5f0f \u8ff4\u5708\u7d50\u69cb \u51fd\u5f0f\u547c\u53eb\u81ea\u8eab \u6642\u9593\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f03\u9ad8\uff0c\u7121\u51fd\u5f0f\u547c\u53eb\u958b\u92b7 \u6bcf\u6b21\u51fd\u5f0f\u547c\u53eb\u90fd\u6703\u7522\u751f\u958b\u92b7 \u8a18\u61b6\u9ad4\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593 \u7d2f\u7a4d\u51fd\u5f0f\u547c\u53eb\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u5806\u758a\u5e40\u7a7a\u9593 \u9069\u7528\u554f\u984c \u9069\u7528\u65bc\u7c21\u55ae\u8ff4\u5708\u4efb\u52d9\uff0c\u7a0b\u5f0f\u78bc\u76f4\u89c0\u3001\u53ef\u8b80\u6027\u597d \u9069\u7528\u65bc\u5b50\u554f\u984c\u5206\u89e3\uff0c\u5982\u6a39\u3001\u5716\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u7a0b\u5f0f\u78bc\u7d50\u69cb\u7c21\u6f54\u3001\u6e05\u6670

Tip

\u5982\u679c\u611f\u89ba\u4ee5\u4e0b\u5167\u5bb9\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5728\u8b80\u5b8c\u201c\u5806\u758a\u201d\u7ae0\u7bc0\u5f8c\u518d\u4f86\u8907\u7fd2\u3002

\u90a3\u9ebc\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5177\u6709\u4ec0\u9ebc\u5167\u5728\u95dc\u806f\u5462\uff1f\u4ee5\u4e0a\u8ff0\u905e\u8ff4\u51fd\u5f0f\u70ba\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u905e\u8ff4\u7684\u201c\u8ff4\u201d\u968e\u6bb5\u9032\u884c\u3002\u9019\u610f\u5473\u8457\u6700\u521d\u88ab\u547c\u53eb\u7684\u51fd\u5f0f\u5be6\u969b\u4e0a\u662f\u6700\u5f8c\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u9019\u7a2e\u5de5\u4f5c\u6a5f\u5236\u8207\u5806\u758a\u7684\u201c\u5148\u5165\u5f8c\u51fa\u201d\u539f\u5247\u7570\u66f2\u540c\u5de5\u3002

\u4e8b\u5be6\u4e0a\uff0c\u201c\u547c\u53eb\u5806\u758a\u201d\u548c\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u9019\u985e\u905e\u8ff4\u8853\u8a9e\u5df2\u7d93\u6697\u793a\u4e86\u905e\u8ff4\u8207\u5806\u758a\u4e4b\u9593\u7684\u5bc6\u5207\u95dc\u4fc2\u3002

  1. \u905e\uff1a\u7576\u51fd\u5f0f\u88ab\u547c\u53eb\u6642\uff0c\u7cfb\u7d71\u6703\u5728\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u70ba\u8a72\u51fd\u5f0f\u5206\u914d\u65b0\u7684\u5806\u758a\u5e40\uff0c\u7528\u65bc\u5132\u5b58\u51fd\u5f0f\u7684\u5340\u57df\u6027\u8b8a\u6578\u3001\u53c3\u6578\u3001\u8fd4\u56de\u4f4d\u5740\u7b49\u8cc7\u6599\u3002
  2. \u8ff4\uff1a\u7576\u51fd\u5f0f\u5b8c\u6210\u57f7\u884c\u4e26\u8fd4\u56de\u6642\uff0c\u5c0d\u61c9\u7684\u5806\u758a\u5e40\u6703\u88ab\u5f9e\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u5fa9\u4e4b\u524d\u51fd\u5f0f\u7684\u57f7\u884c\u74b0\u5883\u3002

\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\uff0c\u5f9e\u800c\u5c07\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f62\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\"\"\"\n    # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack = []\n    res = 0\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in range(n, 0, -1):\n        # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while stack:\n        # \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack<int> stack;\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.empty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.isEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<int> stack = new();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.Push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.Count > 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack := list.New()\n    res := 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i := n; i > 0; i-- {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.PushBack(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    for stack.Len() != 0 {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [Int] = []\n    var res = 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1 ... n).reversed() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.isEmpty {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    const stack = [];\n    let res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  List<int> stack = [];\n  int res = 0;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for (int i = n; i > 0; i--) {\n    // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack.add(i);\n  }\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while (!stack.isEmpty) {\n    // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1..=n).rev() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.is_empty() {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u85c9\u52a9\u4e00\u500b\u5927\u9663\u5217\u4f86\u6a21\u64ec\u5806\u758a\n    int top = -1;    // \u5806\u758a\u9802\u7d22\u5f15\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack[1 + top++] = i;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (top >= 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    val stack = Stack<Int>()\n    var res = 0\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    for (i in n downTo 0) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i)\n    }\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    while (stack.isNotEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  stack = []\n  res = 0\n\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for i in n.downto(0)\n    # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack << i\n  end\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7576\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f8c\uff0c\u7a0b\u5f0f\u78bc\u8b8a\u5f97\u66f4\u52a0\u8907\u96dc\u4e86\u3002\u5118\u7ba1\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5f88\u591a\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f49\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u9019\u6a23\u505a\uff0c\u6709\u4ee5\u4e0b\u5169\u9ede\u539f\u56e0\u3002

  • \u8f49\u5316\u5f8c\u7684\u7a0b\u5f0f\u78bc\u53ef\u80fd\u66f4\u52a0\u96e3\u4ee5\u7406\u89e3\uff0c\u53ef\u8b80\u6027\u66f4\u5dee\u3002
  • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\u53ef\u80fd\u975e\u5e38\u56f0\u96e3\u3002

\u7e3d\u4e4b\uff0c\u9078\u64c7\u8fed\u4ee3\u9084\u662f\u905e\u8ff4\u53d6\u6c7a\u65bc\u7279\u5b9a\u554f\u984c\u7684\u6027\u8cea\u3002\u5728\u7a0b\u5f0f\u8a2d\u8a08\u5be6\u8e10\u4e2d\uff0c\u6b0a\u8861\u5169\u8005\u7684\u512a\u52a3\u4e26\u6839\u64da\u60c5\u5883\u9078\u64c7\u5408\u9069\u7684\u65b9\u6cd5\u81f3\u95dc\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30","text":"

\u5728\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u8ffd\u6c42\u4ee5\u4e0b\u5169\u500b\u5c64\u9762\u7684\u76ee\u6a19\u3002

  1. \u627e\u5230\u554f\u984c\u89e3\u6cd5\uff1a\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u898f\u5b9a\u7684\u8f38\u5165\u7bc4\u570d\u5167\u53ef\u9760\u5730\u6c42\u5f97\u554f\u984c\u7684\u6b63\u78ba\u89e3\u3002
  2. \u5c0b\u6c42\u6700\u512a\u89e3\u6cd5\uff1a\u540c\u4e00\u500b\u554f\u984c\u53ef\u80fd\u5b58\u5728\u591a\u7a2e\u89e3\u6cd5\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u5118\u53ef\u80fd\u9ad8\u6548\u7684\u6f14\u7b97\u6cd5\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5728\u80fd\u5920\u89e3\u6c7a\u554f\u984c\u7684\u524d\u63d0\u4e0b\uff0c\u6f14\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u70ba\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u5169\u500b\u7dad\u5ea6\u3002

  • \u6642\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u7684\u5927\u5c0f\u3002

\u7c21\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u8a2d\u8a08\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u81f3\u95dc\u91cd\u8981\uff0c\u56e0\u70ba\u53ea\u6709\u9019\u6a23\uff0c\u6211\u5011\u624d\u80fd\u5c07\u5404\u7a2e\u6f14\u7b97\u6cd5\u9032\u884c\u5c0d\u6bd4\uff0c\u9032\u800c\u6307\u5c0e\u6f14\u7b97\u6cd5\u8a2d\u8a08\u8207\u6700\u4f73\u5316\u904e\u7a0b\u3002

\u6548\u7387\u8a55\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u70ba\u5169\u7a2e\uff1a\u5be6\u969b\u6e2c\u8a66\u3001\u7406\u8ad6\u4f30\u7b97\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5be6\u969b\u6e2c\u8a66","text":"

\u5047\u8a2d\u6211\u5011\u73fe\u5728\u6709\u6f14\u7b97\u6cd5 A \u548c\u6f14\u7b97\u6cd5 B \uff0c\u5b83\u5011\u90fd\u80fd\u89e3\u6c7a\u540c\u4e00\u554f\u984c\uff0c\u73fe\u5728\u9700\u8981\u5c0d\u6bd4\u9019\u5169\u500b\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u81fa\u8a08\u7b97\u6a5f\uff0c\u57f7\u884c\u9019\u5169\u500b\u6f14\u7b97\u6cd5\uff0c\u4e26\u76e3\u63a7\u8a18\u9304\u5b83\u5011\u7684\u57f7\u884c\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u4f54\u7528\u60c5\u6cc1\u3002\u9019\u7a2e\u8a55\u4f30\u65b9\u5f0f\u80fd\u5920\u53cd\u6620\u771f\u5be6\u60c5\u6cc1\uff0c\u4f46\u4e5f\u5b58\u5728\u8f03\u5927\u7684\u4fb7\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u96e3\u4ee5\u6392\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5e72\u64fe\u56e0\u7d20\u3002\u786c\u9ad4\u914d\u7f6e\u6703\u5f71\u97ff\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u81fa\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u81fa\u914d\u7f6e\u4e0d\u540c\u7684\u8a08\u7b97\u6a5f\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6e2c\u8a66\u7d50\u679c\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u9700\u8981\u5728\u5404\u7a2e\u6a5f\u5668\u4e0a\u9032\u884c\u6e2c\u8a66\uff0c\u7d71\u8a08\u5e73\u5747\u6548\u7387\uff0c\u800c\u9019\u662f\u4e0d\u73fe\u5be6\u7684\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u958b\u5b8c\u6574\u6e2c\u8a66\u975e\u5e38\u8017\u8cbb\u8cc7\u6e90\u3002\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u91cf\u7684\u8b8a\u5316\uff0c\u6f14\u7b97\u6cd5\u6703\u8868\u73fe\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5927\u6642\uff0c\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u70ba\u4e86\u5f97\u5230\u6709\u8aaa\u670d\u529b\u7684\u7d50\u8ad6\uff0c\u6211\u5011\u9700\u8981\u6e2c\u8a66\u5404\u7a2e\u898f\u6a21\u7684\u8f38\u5165\u8cc7\u6599\uff0c\u800c\u9019\u9700\u8981\u8017\u8cbb\u5927\u91cf\u7684\u8a08\u7b97\u8cc7\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8ad6\u4f30\u7b97","text":"

\u7531\u65bc\u5be6\u969b\u6e2c\u8a66\u5177\u6709\u8f03\u5927\u7684\u4fb7\u9650\u6027\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u8003\u616e\u50c5\u900f\u904e\u4e00\u4e9b\u8a08\u7b97\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u9019\u7a2e\u4f30\u7b97\u65b9\u6cd5\u88ab\u7a31\u70ba\u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7c21\u7a31\u8907\u96dc\u5ea6\u5206\u6790\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u80fd\u5920\u9ad4\u73fe\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u4e4b\u9593\u7684\u95dc\u4fc2\u3002\u5b83\u63cf\u8ff0\u4e86\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u5b9a\u7fa9\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u5206\u70ba\u4e09\u500b\u91cd\u9ede\u4f86\u7406\u89e3\u3002

  • \u201c\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u201d\u5206\u5225\u5c0d\u61c9\u6642\u9593\u8907\u96dc\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u3002
  • \u201c\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u8457\u8907\u96dc\u5ea6\u53cd\u6620\u4e86\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u8207\u8f38\u5165\u8cc7\u6599\u9ad4\u91cf\u4e4b\u9593\u7684\u95dc\u4fc2\u3002
  • \u201c\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u201d\u8868\u793a\u8907\u96dc\u5ea6\u5206\u6790\u95dc\u6ce8\u7684\u4e0d\u662f\u57f7\u884c\u6642\u9593\u6216\u4f54\u7528\u7a7a\u9593\u7684\u5177\u9ad4\u503c\uff0c\u800c\u662f\u6642\u9593\u6216\u7a7a\u9593\u589e\u9577\u7684\u201c\u5feb\u6162\u201d\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5be6\u969b\u6e2c\u8a66\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5169\u500b\u65b9\u9762\u3002

  • \u5b83\u7368\u7acb\u65bc\u6e2c\u8a66\u74b0\u5883\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\u3002
  • \u5b83\u53ef\u4ee5\u9ad4\u73fe\u4e0d\u540c\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002

Tip

\u5982\u679c\u4f60\u4ecd\u5c0d\u8907\u96dc\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u7121\u9808\u64d4\u5fc3\uff0c\u6211\u5011\u6703\u5728\u5f8c\u7e8c\u7ae0\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u70ba\u6211\u5011\u63d0\u4f9b\u4e86\u4e00\u628a\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6a19\u5c3a\u201d\uff0c\u4f7f\u6211\u5011\u53ef\u4ee5\u8861\u91cf\u57f7\u884c\u67d0\u500b\u6f14\u7b97\u6cd5\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\uff0c\u5c0d\u6bd4\u4e0d\u540c\u6f14\u7b97\u6cd5\u4e4b\u9593\u7684\u6548\u7387\u3002

\u8907\u96dc\u5ea6\u662f\u500b\u6578\u5b78\u6982\u5ff5\uff0c\u5c0d\u65bc\u521d\u5b78\u8005\u53ef\u80fd\u6bd4\u8f03\u62bd\u8c61\uff0c\u5b78\u7fd2\u96e3\u5ea6\u76f8\u5c0d\u8f03\u9ad8\u3002\u5f9e\u9019\u500b\u89d2\u5ea6\u770b\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9069\u5408\u4f5c\u70ba\u6700\u5148\u4ecb\u7d39\u7684\u5167\u5bb9\u3002\u7136\u800c\uff0c\u7576\u6211\u5011\u8a0e\u8ad6\u67d0\u500b\u8cc7\u6599\u7d50\u69cb\u6216\u6f14\u7b97\u6cd5\u7684\u7279\u9ede\u6642\uff0c\u96e3\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u57f7\u884c\u901f\u5ea6\u548c\u7a7a\u9593\u4f7f\u7528\u60c5\u6cc1\u3002

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u5efa\u8b70\u4f60\u5728\u6df1\u5165\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5c0d\u8907\u96dc\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u77ad\u89e3\uff0c\u4ee5\u4fbf\u80fd\u5920\u5b8c\u6210\u7c21\u55ae\u6f14\u7b97\u6cd5\u7684\u8907\u96dc\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6","text":"

\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u6982\u5ff5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u975e\u5e38\u985e\u4f3c\uff0c\u53ea\u9700\u5c07\u201c\u57f7\u884c\u6642\u9593\u201d\u66ff\u63db\u70ba\u201c\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u201d\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u6f14\u7b97\u6cd5\u76f8\u95dc\u7a7a\u9593","text":"

\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u4f7f\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

  • \u8f38\u5165\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u5165\u8cc7\u6599\u3002
  • \u66ab\u5b58\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u8b8a\u6578\u3001\u7269\u4ef6\u3001\u51fd\u5f0f\u4e0a\u4e0b\u6587\u7b49\u8cc7\u6599\u3002
  • \u8f38\u51fa\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u51fa\u8cc7\u6599\u3002

\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u7d71\u8a08\u7bc4\u570d\u662f\u201c\u66ab\u5b58\u7a7a\u9593\u201d\u52a0\u4e0a\u201c\u8f38\u51fa\u7a7a\u9593\u201d\u3002

\u66ab\u5b58\u7a7a\u9593\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

  • \u66ab\u5b58\u8cc7\u6599\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u5404\u7a2e\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u7b49\u3002
  • \u5806\u758a\u5e40\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u547c\u53eb\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u3002\u7cfb\u7d71\u5728\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\u90fd\u6703\u5728\u5806\u758a\u9802\u90e8\u5efa\u7acb\u4e00\u500b\u5806\u758a\u5e40\uff0c\u51fd\u5f0f\u8fd4\u56de\u5f8c\uff0c\u5806\u758a\u5e40\u7a7a\u9593\u6703\u88ab\u91cb\u653e\u3002
  • \u6307\u4ee4\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u7de8\u8b6f\u5f8c\u7684\u7a0b\u5f0f\u6307\u4ee4\uff0c\u5728\u5be6\u969b\u7d71\u8a08\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8a08\u3002

\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6642\uff0c\u6211\u5011\u901a\u5e38\u7d71\u8a08\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u8f38\u51fa\u8cc7\u6599\u4e09\u90e8\u5206\uff0c\u5982\u5716 2-15 \u6240\u793a\u3002

\u5716 2-15 \u00a0 \u6f14\u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u95dc\u7a7a\u9593

\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class Node:\n    \"\"\"\u985e\u5225\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u7bc0\u9ede\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f38\u5165\u8cc7\u6599\n    A = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff0c\u4e00\u822c\u7528\u5927\u5beb\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node(0)        # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function()        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return A + b + c      # \u8f38\u51fa\u8cc7\u6599\n
/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node* node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = func();           // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    final int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new(0);       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = Function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u7d50\u69cb\u9ad4 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u5efa\u7acb node \u7d50\u69cb\u9ad4  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f38\u5165\u8cc7\u6599\n    const a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b := 0                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    newNode(0)              // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c := function()         // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c        // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u5f0f */\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f38\u5165\u8cc7\u6599\n    let a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node(x: 0) // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function()    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c      // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f38\u5165\u8cc7\u6599\n    const a = 0;              // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f38\u5165\u8cc7\u6599\n    const a = 0;                        // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                          // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0);           // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();              // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;                   // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f38\u5165\u8cc7\u6599\n  const int a = 0;      // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n  int b = 0;            // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n  Node node = Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n  int c = function();   // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n  return a + b + c;     // \u8f38\u51fa\u8cc7\u6599\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u5efa\u7acb Node \u7d50\u69cb\u9ad4 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u5f0f */\nfn function() -> i32 {      \n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f38\u5165\u8cc7\u6599\n    const a: i32 = 0;               // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let mut b = 0;                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node::new(0);        // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function();             // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;               // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;   // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;         // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    int c = func();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;  // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f38\u5165\u8cc7\u6599\n    val a = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    val node = Node(0)       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    val c = function()       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c         // \u8f38\u51fa\u8cc7\u6599\n}\n
### \u985e\u5225 ###\nclass Node\n    attr_accessor :val      # \u7bc0\u9ede\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u5f0f ###\ndef function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u6f14\u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f38\u5165\u8cc7\u6599\n    a = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node.new(0)  # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    a + b + c           # \u8f38\u51fa\u8cc7\u6599\nend\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c07\u7d71\u8a08\u7269\u4ef6\u5f9e\u201c\u64cd\u4f5c\u6578\u91cf\u201d\u8f49\u70ba\u201c\u4f7f\u7528\u7a7a\u9593\u5927\u5c0f\u201d\u3002

\u800c\u8207\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u3002\u9019\u662f\u56e0\u70ba\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u4e00\u9805\u786c\u6027\u8981\u6c42\uff0c\u6211\u5011\u5fc5\u9808\u78ba\u4fdd\u5728\u6240\u6709\u8f38\u5165\u8cc7\u6599\u4e0b\u90fd\u6709\u8db3\u5920\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u9810\u7559\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u5169\u5c64\u542b\u7fa9\u3002

  1. \u4ee5\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u70ba\u6e96\uff1a\u7576 \\(n < 10\\) \u6642\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1b\u4f46\u7576 \\(n > 10\\) \u6642\uff0c\u521d\u59cb\u5316\u7684\u9663\u5217 nums \u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
  2. \u4ee5\u6f14\u7b97\u6cd5\u57f7\u884c\u4e2d\u7684\u5cf0\u503c\u8a18\u61b6\u9ad4\u70ba\u6e96\uff1a\u4f8b\u5982\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6700\u5f8c\u4e00\u884c\u4e4b\u524d\uff0c\u4f54\u7528 \\(O(1)\\) \u7a7a\u9593\uff1b\u7576\u521d\u59cb\u5316\u9663\u5217 nums \u6642\uff0c\u7a0b\u5f0f\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
\n

\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7d71\u8a08\u5806\u758a\u5e40\u7a7a\u9593\u3002\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def function() -> int:\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
fun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
def function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
\n

\u51fd\u5f0f loop() \u548c recur() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u4f46\u7a7a\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u3002

  • \u51fd\u5f0f loop() \u5728\u8ff4\u5708\u4e2d\u547c\u53eb\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f2a\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u4e26\u91cb\u653e\u4e86\u5806\u758a\u5e40\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \u3002
  • \u905e\u8ff4\u51fd\u5f0f recur() \u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u6703\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 recur() \uff0c\u5f9e\u800c\u4f54\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
"},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u898b\u578b\u5225","text":"

\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5716 2-16 \u5c55\u793a\u4e86\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\uff08\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} \\end{aligned} \\]

\u5716 2-16 \u00a0 \u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225

"},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6578\u968e \\(O(1)\\)","text":"

\u5e38\u6578\u968e\u5e38\u898b\u65bc\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u7684\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u8ff4\u5708\u4e2d\u521d\u59cb\u5316\u8b8a\u6578\u6216\u547c\u53eb\u51fd\u5f0f\u800c\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\uff0c\u5728\u9032\u5165\u4e0b\u4e00\u8ff4\u5708\u5f8c\u5c31\u6703\u88ab\u91cb\u653e\uff0c\u56e0\u6b64\u4e0d\u6703\u7d2f\u7a4d\u4f54\u7528\u7a7a\u9593\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        c = 0\n    # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid Constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc spaceConstant(n int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u5f0f */\n@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n: number): void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n  // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u5f0f */\nfn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfun constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u5f0f ###\ndef function\n  # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6578\u968e ###\ndef constant(n)\n  # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { c = 0 }\n  # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u5f0f\nfn function() i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6578\u968e\nfn constant(n: i32) void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7dda\u6027\u968e \\(O(n)\\)","text":"

\u7dda\u6027\u968e\u5e38\u898b\u65bc\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u6b63\u6bd4\u7684\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u7b49\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    nums = [0] * n\n    # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<int> nums(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7dda\u6027\u968e */\nvoid Linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7dda\u6027\u968e */\nfunc spaceLinear(n int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    _ = make([]int, n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7dda\u6027\u968e */\nfunc linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nums = Array(repeating: 0, count: n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7dda\u6027\u968e */\nfunction linear(n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7dda\u6027\u968e */\nfunction linear(n: number): void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n  // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<int> nums = List.filled(n, 0);\n  // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7dda\u6027\u968e */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nums = vec![0; n as usize];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7dda\u6027\u968e */\nfun linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nums = Array(n) { 0 }\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7dda\u6027\u968e ###\ndef linear(n)\n  # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  nums = Array.new(n, 0)\n\n  # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7dda\u6027\u968e\nfn linear(comptime n: i32) !void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nums = [_]i32{0}**n;\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5373\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u5f0f\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    print(\"\u905e\u8ff4 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u905e\u8ff4 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u905e\u8ff4 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u905e\u8ff4 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u905e\u8ff4 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u905e\u8ff4 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u905e\u8ff4 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n  print('\u905e\u8ff4 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u905e\u8ff4 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u905e\u8ff4 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u905e\u8ff4 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef linear_recur(n)\n  puts \"\u905e\u8ff4 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u905e\u8ff4 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-17 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u7dda\u6027\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u968e \\(O(n^2)\\)","text":"

\u5e73\u65b9\u968e\u5e38\u898b\u65bc\u77e9\u9663\u548c\u5716\uff0c\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u5e73\u65b9\u95dc\u4fc2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u968e */\nvoid Quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u968e */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u968e */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u968e */\nfunction quadratic(n: number): void {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n  // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u968e */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u968e */\nfun quadratic(n: Int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u968e ###\ndef quadratic(n)\n  # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u968e\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 2-18 \u6240\u793a\uff0c\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5728\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u500b\u9663\u5217\uff0c\u9577\u5ea6\u5206\u5225\u70ba \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u9577\u5ea6\u70ba \\(n / 2\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u4f54\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u905e\u8ff4 n = \" << n << \" \u4e2d\u7684 nums \u9577\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u905e\u8ff4 n = \\(n) \u4e2d\u7684 nums \u9577\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-18 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u5e73\u65b9\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6578\u968e \\(O(2^n)\\)","text":"

\u6307\u6578\u968e\u5e38\u898b\u65bc\u4e8c\u5143\u6a39\u3002\u89c0\u5bdf\u5716 2-19 \uff0c\u5c64\u6578\u70ba \\(n\\) \u7684\u201c\u6eff\u4e8c\u5143\u6a39\u201d\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(2^n - 1\\) \uff0c\u4f54\u7528 \\(O(2^n)\\) \u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-19 \u00a0 \u6eff\u4e8c\u5143\u6a39\u7522\u751f\u7684\u6307\u6578\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

\u5c0d\u6578\u968e\u5e38\u898b\u65bc\u5206\u6cbb\u6f14\u7b97\u6cd5\u3002\u4f8b\u5982\u5408\u4f75\u6392\u5e8f\uff0c\u8f38\u5165\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u6bcf\u8f2a\u905e\u8ff4\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002

\u518d\u4f8b\u5982\u5c07\u6578\u5b57\u8f49\u5316\u70ba\u5b57\u4e32\uff0c\u8f38\u5165\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6578\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5c0d\u61c9\u5b57\u4e32\u9577\u5ea6\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6b0a\u8861\u6642\u9593\u8207\u7a7a\u9593","text":"

\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u80fd\u9054\u5230\u6700\u512a\u3002\u7136\u800c\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u540c\u6642\u6700\u4f73\u5316\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96e3\u3002

\u964d\u4f4e\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba\u4ee3\u50f9\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u5011\u5c07\u72a7\u7272\u8a18\u61b6\u9ad4\u7a7a\u9593\u4f86\u63d0\u5347\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u601d\u8def\u7a31\u70ba\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff1b\u53cd\u4e4b\uff0c\u5247\u7a31\u70ba\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002

\u9078\u64c7\u54ea\u7a2e\u601d\u8def\u53d6\u6c7a\u65bc\u6211\u5011\u66f4\u770b\u91cd\u54ea\u500b\u65b9\u9762\u3002\u5728\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u6642\u9593\u6bd4\u7a7a\u9593\u66f4\u5bf6\u8cb4\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u7576\u7136\uff0c\u5728\u8cc7\u6599\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\uff0c\u63a7\u5236\u7a7a\u9593\u8907\u96dc\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"

\u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30

  • \u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u5169\u500b\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\u3002
  • \u6211\u5011\u53ef\u4ee5\u900f\u904e\u5be6\u969b\u6e2c\u8a66\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96e3\u4ee5\u6d88\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5f71\u97ff\uff0c\u4e14\u6703\u8017\u8cbb\u5927\u91cf\u8a08\u7b97\u8cc7\u6e90\u3002
  • \u8907\u96dc\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5be6\u969b\u6e2c\u8a66\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\uff0c\u4e26\u4e14\u80fd\u5920\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u8cc7\u6599\u898f\u6a21\u4e0b\u7684\u6548\u7387\u3002

\u6642\u9593\u8907\u96dc\u5ea6

  • \u6642\u9593\u8907\u96dc\u5ea6\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\uff0c\u53ef\u4ee5\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f38\u5165\u7684\u8cc7\u6599\u91cf\u8f03\u5c0f\u6216\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\u6642\uff0c\u7121\u6cd5\u7cbe\u78ba\u5c0d\u6bd4\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u512a\u52a3\u3002
  • \u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u865f\u8868\u793a\uff0c\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u7576 \\(n\\) \u8da8\u5411\u6b63\u7121\u7aae\u6642\uff0c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u7684\u589e\u9577\u7d1a\u5225\u3002
  • \u63a8\u7b97\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u5169\u6b65\uff0c\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u898b\u6642\u9593\u8907\u96dc\u5ea6\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
  • \u67d0\u4e9b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u5e7e\u4e4e\u4e0d\u7528\uff0c\u56e0\u70ba\u8f38\u5165\u8cc7\u6599\u4e00\u822c\u9700\u8981\u6eff\u8db3\u56b4\u683c\u689d\u4ef6\u624d\u80fd\u9054\u5230\u6700\u4f73\u60c5\u6cc1\u3002
  • \u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53cd\u6620\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8cc7\u6599\u8f38\u5165\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5be6\u969b\u61c9\u7528\u4e2d\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u9700\u8981\u7d71\u8a08\u8f38\u5165\u8cc7\u6599\u5206\u4f48\u4ee5\u53ca\u7d9c\u5408\u5f8c\u7684\u6578\u5b78\u671f\u671b\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6

  • \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u4f5c\u7528\u985e\u4f3c\u65bc\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\u3002
  • \u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u76f8\u95dc\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u5206\u70ba\u8f38\u5165\u7a7a\u9593\u3001\u66ab\u5b58\u7a7a\u9593\u3001\u8f38\u51fa\u7a7a\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u8f38\u5165\u7a7a\u9593\u4e0d\u7d0d\u5165\u7a7a\u9593\u8907\u96dc\u5ea6\u8a08\u7b97\u3002\u66ab\u5b58\u7a7a\u9593\u53ef\u5206\u70ba\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u6307\u4ee4\u7a7a\u9593\uff0c\u5176\u4e2d\u5806\u758a\u5e40\u7a7a\u9593\u901a\u5e38\u50c5\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\u5f71\u97ff\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5373\u7d71\u8a08\u6f14\u7b97\u6cd5\u5728\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u548c\u6700\u5dee\u57f7\u884c\u6642\u523b\u4e0b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u5e38\u898b\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c3e\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u55ce\uff1f

\u7406\u8ad6\u4e0a\uff0c\u5c3e\u905e\u8ff4\u51fd\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u904e\u7d55\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52d5\u6700\u4f73\u5316\u5c3e\u905e\u8ff4\uff0c\u56e0\u6b64\u901a\u5e38\u8a8d\u70ba\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(n)\\) \u3002

Q\uff1a\u51fd\u5f0f\u548c\u65b9\u6cd5\u9019\u5169\u500b\u8853\u8a9e\u7684\u5340\u5225\u662f\u4ec0\u9ebc\uff1f

\u51fd\u5f0f\uff08function\uff09\u53ef\u4ee5\u88ab\u7368\u7acb\u57f7\u884c\uff0c\u6240\u6709\u53c3\u6578\u90fd\u4ee5\u986f\u5f0f\u50b3\u905e\u3002\u65b9\u6cd5\uff08method\uff09\u8207\u4e00\u500b\u7269\u4ef6\u95dc\u806f\uff0c\u88ab\u96b1\u5f0f\u50b3\u905e\u7d66\u547c\u53eb\u5b83\u7684\u7269\u4ef6\uff0c\u80fd\u5920\u5c0d\u985e\u5225\u7684\u4f8b\u9805\u4e2d\u5305\u542b\u7684\u8cc7\u6599\u9032\u884c\u64cd\u4f5c\u3002

\u4e0b\u9762\u4ee5\u5e7e\u7a2e\u5e38\u898b\u7684\u7a0b\u5f0f\u8a9e\u8a00\u70ba\u4f8b\u4f86\u8aaa\u660e\u3002

  • C \u8a9e\u8a00\u662f\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\u8a9e\u8a00\uff0c\u6c92\u6709\u7269\u4ef6\u5c0e\u5411\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u5f0f\u3002\u4f46\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5efa\u7acb\u7d50\u69cb\u9ad4\uff08struct\uff09\u4f86\u6a21\u64ec\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff0c\u8207\u7d50\u69cb\u9ad4\u76f8\u95dc\u806f\u7684\u51fd\u5f0f\u5c31\u76f8\u7576\u65bc\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
  • Java \u548c C# \u662f\u7269\u4ef6\u5c0e\u5411\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u78bc\u584a\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u70ba\u67d0\u500b\u985e\u5225\u7684\u4e00\u90e8\u5206\u3002\u975c\u614b\u65b9\u6cd5\u7684\u884c\u70ba\u985e\u4f3c\u65bc\u51fd\u5f0f\uff0c\u56e0\u70ba\u5b83\u88ab\u7e6b\u7d50\u5728\u985e\u5225\u4e0a\uff0c\u4e0d\u80fd\u8a2a\u554f\u7279\u5b9a\u7684\u4f8b\u9805\u8b8a\u6578\u3002
  • C++ \u548c Python \u65e2\u652f\u6301\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\uff08\u51fd\u5f0f\uff09\uff0c\u4e5f\u652f\u6301\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff08\u65b9\u6cd5\uff09\u3002

Q\uff1a\u5716\u89e3\u201c\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\uff1f

\u4e0d\u662f\uff0c\u8a72\u5716\u5c55\u793a\u7684\u662f\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u9577\u8da8\u52e2\uff0c\u800c\u4e0d\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\u3002

\u5047\u8a2d\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u6bcf\u689d\u66f2\u7dda\u7684\u503c\u8207\u51fd\u5f0f\u5c0d\u61c9\u4e0d\u4e0a\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u689d\u66f2\u7dda\u90fd\u5305\u542b\u4e00\u500b\u5e38\u6578\u9805\uff0c\u7528\u65bc\u5c07\u53d6\u503c\u7bc4\u570d\u58d3\u7e2e\u5230\u4e00\u500b\u8996\u89ba\u8212\u9069\u7684\u7bc4\u570d\u5167\u3002

\u5728\u5be6\u969b\u4e2d\uff0c\u56e0\u70ba\u6211\u5011\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u500b\u65b9\u6cd5\u7684\u201c\u5e38\u6578\u9805\u201d\u8907\u96dc\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u7121\u6cd5\u50c5\u6191\u8907\u96dc\u5ea6\u4f86\u9078\u64c7 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u512a\u89e3\u6cd5\u3002\u4f46\u5c0d\u65bc \\(n = 8^5\\) \u5c31\u5f88\u597d\u9078\u4e86\uff0c\u9019\u6642\u589e\u9577\u8da8\u52e2\u5df2\u7d93\u4f54\u4e3b\u5c0e\u4e86\u3002

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6","text":"

\u57f7\u884c\u6642\u9593\u53ef\u4ee5\u76f4\u89c0\u4e14\u6e96\u78ba\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u5011\u60f3\u6e96\u78ba\u9810\u4f30\u4e00\u6bb5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6642\u9593\uff0c\u61c9\u8a72\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

  1. \u78ba\u5b9a\u57f7\u884c\u5e73\u81fa\uff0c\u5305\u62ec\u786c\u9ad4\u914d\u7f6e\u3001\u7a0b\u5f0f\u8a9e\u8a00\u3001\u7cfb\u7d71\u74b0\u5883\u7b49\uff0c\u9019\u4e9b\u56e0\u7d20\u90fd\u6703\u5f71\u97ff\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6548\u7387\u3002
  2. \u8a55\u4f30\u5404\u7a2e\u8a08\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u57f7\u884c\u6642\u9593\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u5217\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
  3. \u7d71\u8a08\u7a0b\u5f0f\u78bc\u4e2d\u6240\u6709\u7684\u8a08\u7b97\u64cd\u4f5c\uff0c\u4e26\u5c07\u6240\u6709\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u6c42\u548c\uff0c\u5f9e\u800c\u5f97\u5230\u57f7\u884c\u6642\u9593\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u8ff4\u5708 n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n    print(0); // 5 ns\n  }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
# \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u8ff4\u5708 n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

\u6839\u64da\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u70ba \\((6n + 12)\\) ns \uff1a

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

\u4f46\u5be6\u969b\u4e0a\uff0c\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73fe\u5be6\u3002\u9996\u5148\uff0c\u6211\u5011\u4e0d\u5e0c\u671b\u5c07\u9810\u4f30\u6642\u9593\u548c\u57f7\u884c\u5e73\u81fa\u7e6b\u7d50\uff0c\u56e0\u70ba\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u5404\u7a2e\u4e0d\u540c\u7684\u5e73\u81fa\u4e0a\u57f7\u884c\u3002\u5176\u6b21\uff0c\u6211\u5011\u5f88\u96e3\u7372\u77e5\u6bcf\u7a2e\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\uff0c\u9019\u7d66\u9810\u4f30\u904e\u7a0b\u5e36\u4f86\u4e86\u6975\u5927\u7684\u96e3\u5ea6\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7d71\u8a08\u6642\u9593\u589e\u9577\u8da8\u52e2","text":"

\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u7d71\u8a08\u7684\u4e0d\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\uff0c\u800c\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002

\u201c\u6642\u9593\u589e\u9577\u8da8\u52e2\u201d\u9019\u500b\u6982\u5ff5\u6bd4\u8f03\u62bd\u8c61\uff0c\u6211\u5011\u900f\u904e\u4e00\u500b\u4f8b\u5b50\u4f86\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7d66\u5b9a\u4e09\u500b\u6f14\u7b97\u6cd5 A\u3001B \u548c C \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_A(n: int):\n    print(0)\n# \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
# \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

\u5716 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u500b\u6f14\u7b97\u6cd5\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

  • \u6f14\u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u500b\u5217\u5370\u64cd\u4f5c\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u4e0d\u96a8\u8457 \\(n\\) \u589e\u5927\u800c\u589e\u9577\u3002\u6211\u5011\u7a31\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002
  • \u6f14\u7b97\u6cd5 B \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(n\\) \u6b21\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457 \\(n\\) \u589e\u5927\u5448\u7dda\u6027\u589e\u9577\u3002\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u968e\u201d\u3002
  • \u6f14\u7b97\u6cd5 C \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(1000000\\) \u6b21\uff0c\u96d6\u7136\u57f7\u884c\u6642\u9593\u5f88\u9577\uff0c\u4f46\u5b83\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u3002\u56e0\u6b64 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002

\u5716 2-7 \u00a0 \u6f14\u7b97\u6cd5 A\u3001B \u548c C \u7684\u6642\u9593\u589e\u9577\u8da8\u52e2

\u76f8\u8f03\u65bc\u76f4\u63a5\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u9ede\u5462\uff1f

  • \u6642\u9593\u8907\u96dc\u5ea6\u80fd\u5920\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u6f14\u7b97\u6cd5 B \u7684\u57f7\u884c\u6642\u9593\u5448\u7dda\u6027\u589e\u9577\uff0c\u5728 \\(n > 1\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5be6\u4e0a\uff0c\u53ea\u8981\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8db3\u5920\u5927\uff0c\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u7684\u6f14\u7b97\u6cd5\u4e00\u5b9a\u512a\u65bc\u201c\u7dda\u6027\u968e\u201d\u7684\u6f14\u7b97\u6cd5\uff0c\u9019\u6b63\u662f\u6642\u9593\u589e\u9577\u8da8\u52e2\u7684\u542b\u7fa9\u3002
  • \u6642\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7c21\u4fbf\u3002\u986f\u7136\uff0c\u57f7\u884c\u5e73\u81fa\u548c\u8a08\u7b97\u64cd\u4f5c\u578b\u5225\u90fd\u8207\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u7121\u95dc\u3002\u56e0\u6b64\u5728\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u5c07\u6240\u6709\u8a08\u7b97\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u8996\u70ba\u76f8\u540c\u7684\u201c\u55ae\u4f4d\u6642\u9593\u201d\uff0c\u5f9e\u800c\u5c07\u201c\u8a08\u7b97\u64cd\u4f5c\u57f7\u884c\u6642\u9593\u7d71\u8a08\u201d\u7c21\u5316\u70ba\u201c\u8a08\u7b97\u64cd\u4f5c\u6578\u91cf\u7d71\u8a08\u201d\uff0c\u9019\u6a23\u4e00\u4f86\u4f30\u7b97\u96e3\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
  • \u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u4fb7\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 A \u548c C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\uff0c\u4f46\u5be6\u969b\u57f7\u884c\u6642\u9593\u5dee\u5225\u5f88\u5927\u3002\u540c\u6a23\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 B \u660e\u986f\u512a\u65bc\u6f14\u7b97\u6cd5 C \u3002\u5728\u9019\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5f88\u96e3\u50c5\u6191\u6642\u9593\u8907\u96dc\u5ea6\u5224\u65b7\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u7576\u7136\uff0c\u5118\u7ba1\u5b58\u5728\u4e0a\u8ff0\u554f\u984c\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8a55\u5224\u6f14\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
"},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c","text":"

\u7d66\u5b9a\u4e00\u500b\u8f38\u5165\u5927\u5c0f\u70ba \\(n\\) \u7684\u51fd\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u8ff4\u5708 n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u8ff4\u5708 n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u8ff4\u5708 n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

\u8a2d\u6f14\u7b97\u6cd5\u7684\u64cd\u4f5c\u6578\u91cf\u662f\u4e00\u500b\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7684\u51fd\u5f0f\uff0c\u8a18\u70ba \\(T(n)\\) \uff0c\u5247\u4ee5\u4e0a\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u70ba\uff1a

\\[ T(n) = 3 + 2n \\]

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u5f0f\uff0c\u8aaa\u660e\u5176\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u662f\u7dda\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u7dda\u6027\u968e\u3002

\u6211\u5011\u5c07\u7dda\u6027\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8a18\u70ba \\(O(n)\\) \uff0c\u9019\u500b\u6578\u5b78\u7b26\u865f\u7a31\u70ba\u5927 \\(O\\) \u8a18\u865f\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u5f0f \\(T(n)\\) \u7684\u6f38\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u672c\u8cea\u4e0a\u662f\u8a08\u7b97\u201c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\)\u201d\u7684\u6f38\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u78ba\u7684\u6578\u5b78\u5b9a\u7fa9\u3002

\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c

\u82e5\u5b58\u5728\u6b63\u5be6\u6578 \\(c\\) \u548c\u5be6\u6578 \\(n_0\\) \uff0c\u4f7f\u5f97\u5c0d\u65bc\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5247\u53ef\u8a8d\u70ba \\(f(n)\\) \u7d66\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u500b\u6f38\u8fd1\u4e0a\u754c\uff0c\u8a18\u70ba \\(T(n) = O(f(n))\\) \u3002

\u5982\u5716 2-8 \u6240\u793a\uff0c\u8a08\u7b97\u6f38\u8fd1\u4e0a\u754c\u5c31\u662f\u5c0b\u627e\u4e00\u500b\u51fd\u5f0f \\(f(n)\\) \uff0c\u4f7f\u5f97\u7576 \\(n\\) \u8da8\u5411\u65bc\u7121\u7aae\u5927\u6642\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u8655\u65bc\u76f8\u540c\u7684\u589e\u9577\u7d1a\u5225\uff0c\u50c5\u76f8\u5dee\u4e00\u500b\u5e38\u6578\u9805 \\(c\\) \u7684\u500d\u6578\u3002

\u5716 2-8 \u00a0 \u51fd\u5f0f\u7684\u6f38\u8fd1\u4e0a\u754c

"},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u6f38\u8fd1\u4e0a\u754c\u7684\u6578\u5b78\u5473\u5152\u6709\u9ede\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89ba\u6c92\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u7121\u9808\u64d4\u5fc3\u3002\u6211\u5011\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65b7\u7684\u5be6\u8e10\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6f38\u9818\u609f\u5176\u6578\u5b78\u610f\u7fa9\u3002

\u6839\u64da\u5b9a\u7fa9\uff0c\u78ba\u5b9a \\(f(n)\\) \u4e4b\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u9ebc\u5982\u4f55\u78ba\u5b9a\u6f38\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u7e3d\u9ad4\u5206\u70ba\u5169\u6b65\uff1a\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf","text":"

\u91dd\u5c0d\u7a0b\u5f0f\u78bc\uff0c\u9010\u884c\u5f9e\u4e0a\u5230\u4e0b\u8a08\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u65bc\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6578\u9805 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u7a2e\u4fc2\u6578\u3001\u5e38\u6578\u9805\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u64da\u6b64\u539f\u5247\uff0c\u53ef\u4ee5\u7e3d\u7d50\u51fa\u4ee5\u4e0b\u8a08\u6578\u7c21\u5316\u6280\u5de7\u3002

  1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6578\u9805\u3002\u56e0\u70ba\u5b83\u5011\u90fd\u8207 \\(n\\) \u7121\u95dc\uff0c\u6240\u4ee5\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u7522\u751f\u5f71\u97ff\u3002
  2. \u7701\u7565\u6240\u6709\u4fc2\u6578\u3002\u4f8b\u5982\uff0c\u8ff4\u5708 \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7c21\u5316\u8a18\u70ba \\(n\\) \u6b21\uff0c\u56e0\u70ba \\(n\\) \u524d\u9762\u7684\u4fc2\u6578\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u6c92\u6709\u5f71\u97ff\u3002
  3. \u8ff4\u5708\u5de2\u72c0\u6642\u4f7f\u7528\u4e58\u6cd5\u3002\u7e3d\u64cd\u4f5c\u6578\u91cf\u7b49\u65bc\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u64cd\u4f5c\u6578\u91cf\u4e4b\u7a4d\uff0c\u6bcf\u4e00\u5c64\u8ff4\u5708\u4f9d\u7136\u53ef\u4ee5\u5206\u5225\u5957\u7528\u7b2c 1. \u9ede\u548c\u7b2c 2. \u9ede\u7684\u6280\u5de7\u3002

\u7d66\u5b9a\u4e00\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u4f86\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

\u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u5f8c\u7684\u7d71\u8a08\u7d50\u679c\uff0c\u5169\u8005\u63a8\u7b97\u51fa\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7d71\u8a08 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61f6\u7d71\u8a08 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c","text":"

\u6642\u9593\u8907\u96dc\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u968e\u7684\u9805\u4f86\u6c7a\u5b9a\u3002\u9019\u662f\u56e0\u70ba\u5728 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u6700\u9ad8\u968e\u7684\u9805\u5c07\u767c\u63ee\u4e3b\u5c0e\u4f5c\u7528\uff0c\u5176\u4ed6\u9805\u7684\u5f71\u97ff\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

\u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u8a87\u5f35\u7684\u503c\u662f\u70ba\u4e86\u5f37\u8abf\u201c\u4fc2\u6578\u7121\u6cd5\u64bc\u52d5\u968e\u6578\u201d\u9019\u4e00\u7d50\u8ad6\u3002\u7576 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u9019\u4e9b\u5e38\u6578\u8b8a\u5f97\u7121\u8db3\u8f15\u91cd\u3002

\u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6578\u91cf\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u898b\u578b\u5225","text":"

\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225\u5982\u5716 2-9 \u6240\u793a\uff08\u6309\u7167\u5f9e\u4f4e\u5230\u9ad8\u7684\u9806\u5e8f\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u7dda\u6027\u5c0d\u6578\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} < \\text{\u968e\u4e58\u968e} \\end{aligned} \\]

\u5716 2-9 \u00a0 \u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225

"},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6578\u968e \\(O(1)\\)","text":"

\u5e38\u6578\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u5373\u4e0d\u96a8\u8457 \\(n\\) \u7684\u8b8a\u5316\u800c\u8b8a\u5316\u3002

\u5728\u4ee5\u4e0b\u51fd\u5f0f\u4e2d\uff0c\u5118\u7ba1\u64cd\u4f5c\u6578\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u65bc\u5176\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6578\u968e */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6578\u968e */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6578\u968e */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6578\u968e */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6578\u968e */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6578\u968e */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6578\u968e */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6578\u968e ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6578\u968e\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7dda\u6027\u968e \\(O(n)\\)","text":"

\u7dda\u6027\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u7dda\u6027\u7d1a\u5225\u589e\u9577\u3002\u7dda\u6027\u968e\u901a\u5e38\u51fa\u73fe\u5728\u55ae\u5c64\u8ff4\u5708\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u968e */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u968e */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u968e */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u968e */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u968e */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u968e */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u968e */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u968e */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u968e ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u968e\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8d70\u8a2a\u9663\u5217\u548c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u7b49\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u9577\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u9700\u6839\u64da\u8f38\u5165\u8cc7\u6599\u7684\u578b\u5225\u4f86\u5177\u9ad4\u78ba\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u500b\u793a\u4f8b\u4e2d\uff0c\u8b8a\u6578 \\(n\\) \u70ba\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u500b\u793a\u4f8b\u4e2d\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u70ba\u8cc7\u6599\u5927\u5c0f\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u968e \\(O(n^2)\\)","text":"

\u5e73\u65b9\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7d1a\u5225\u589e\u9577\u3002\u5e73\u65b9\u968e\u901a\u5e38\u51fa\u73fe\u5728\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u968e */\nint Quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u968e */\nfunc quadratic(n int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u968e */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u968e */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u968e */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u968e */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u968e ###\ndef quadratic(n)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u968e\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-10 \u5c0d\u6bd4\u4e86\u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u4e09\u7a2e\u6642\u9593\u8907\u96dc\u5ea6\u3002

\u5716 2-10 \u00a0 \u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u4ee5\u6ce1\u6cab\u6392\u5e8f\u70ba\u4f8b\uff0c\u5916\u5c64\u8ff4\u5708\u57f7\u884c \\(n - 1\\) \u6b21\uff0c\u5167\u5c64\u8ff4\u5708\u57f7\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u70ba \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8a08\u6578\u5668\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8a08\u6578\u5668\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8a08\u6578\u5668\n\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8a08\u6578\u5668\n\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8a08\u6578\u5668 \n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6578\u968e \\(O(2^n)\\)","text":"

\u751f\u7269\u5b78\u7684\u201c\u7d30\u80de\u5206\u88c2\u201d\u662f\u6307\u6578\u968e\u589e\u9577\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72c0\u614b\u70ba \\(1\\) \u500b\u7d30\u80de\uff0c\u5206\u88c2\u4e00\u8f2a\u5f8c\u8b8a\u70ba \\(2\\) \u500b\uff0c\u5206\u88c2\u5169\u8f2a\u5f8c\u8b8a\u70ba \\(4\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f2a\u5f8c\u6709 \\(2^n\\) \u500b\u7d30\u80de\u3002

\u5716 2-11 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u7d30\u80de\u5206\u88c2\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-11 \u00a0 \u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u5728\u5be6\u969b\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6307\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u5176\u905e\u8ff4\u5730\u4e00\u5206\u70ba\u4e8c\uff0c\u7d93\u904e \\(n\\) \u6b21\u5206\u88c2\u5f8c\u505c\u6b62\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6307\u6578\u968e\u589e\u9577\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7aae\u8209\u6cd5\uff08\u66b4\u529b\u641c\u5c0b\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f03\u5e38\u898b\u3002\u5c0d\u65bc\u8cc7\u6599\u898f\u6a21\u8f03\u5927\u7684\u554f\u984c\uff0c\u6307\u6578\u968e\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52d5\u614b\u898f\u5283\u6216\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u4f86\u89e3\u6c7a\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

\u8207\u6307\u6578\u968e\u76f8\u53cd\uff0c\u5c0d\u6578\u968e\u53cd\u6620\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u60c5\u6cc1\u3002\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7531\u65bc\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u5f0f\u3002

\u5716 2-12 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_2 n)\\) \uff0c\u7c21\u8a18\u70ba \\(O(\\log n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-12 \u00a0 \u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u8207\u6307\u6578\u968e\u985e\u4f3c\uff0c\u5c0d\u6578\u968e\u4e5f\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(\\log_2 n\\) \u7684\u905e\u8ff4\u6a39\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6f14\u7b97\u6cd5\u4e2d\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u591a\u201d\u548c\u201c\u5316\u7e41\u70ba\u7c21\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u9577\u7de9\u6162\uff0c\u662f\u50c5\u6b21\u65bc\u5e38\u6578\u968e\u7684\u7406\u60f3\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

\\(O(\\log n)\\) \u7684\u5e95\u6578\u662f\u591a\u5c11\uff1f

\u6e96\u78ba\u4f86\u8aaa\uff0c\u201c\u4e00\u5206\u70ba \\(m\\)\u201d\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u900f\u904e\u5c0d\u6578\u63db\u5e95\u516c\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6578\u3001\u76f8\u7b49\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5e95\u6578 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u97ff\u8907\u96dc\u5ea6\u7684\u524d\u63d0\u4e0b\u8f49\u63db\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u7701\u7565\u5e95\u6578 \\(m\\) \uff0c\u5c07\u5c0d\u6578\u968e\u76f4\u63a5\u8a18\u70ba \\(O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7dda\u6027\u5c0d\u6578\u968e \\(O(n \\log n)\\)","text":"

\u7dda\u6027\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5169\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5206\u5225\u70ba \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7dda\u6027\u5c0d\u6578\u968e\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u5c0d\u6578\u968e ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u5c0d\u6578\u968e\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-13 \u5c55\u793a\u4e86\u7dda\u6027\u5c0d\u6578\u968e\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u5143\u6a39\u7684\u6bcf\u4e00\u5c64\u7684\u64cd\u4f5c\u7e3d\u6578\u90fd\u70ba \\(n\\) \uff0c\u6a39\u5171\u6709 \\(\\log_2 n + 1\\) \u5c64\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u5716 2-13 \u00a0 \u7dda\u6027\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u7b49\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u968e\u4e58\u968e \\(O(n!)\\)","text":"

\u968e\u4e58\u968e\u5c0d\u61c9\u6578\u5b78\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u554f\u984c\u3002\u7d66\u5b9a \\(n\\) \u500b\u4e92\u4e0d\u91cd\u8907\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6578\u91cf\u70ba\uff1a

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

\u968e\u4e58\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u5be6\u73fe\u3002\u5982\u5716 2-14 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u7b2c\u4e00\u5c64\u5206\u88c2\u51fa \\(n\\) \u500b\uff0c\u7b2c\u4e8c\u5c64\u5206\u88c2\u51fa \\(n - 1\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c64\u6642\u505c\u6b62\u5206\u88c2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-14 \u00a0 \u968e\u4e58\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u7576 \\(n \\geq 4\\) \u6642\u6046\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u968e\u4e58\u968e\u6bd4\u6307\u6578\u968e\u589e\u9577\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f03\u5927\u6642\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6","text":"

\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u5047\u8a2d\u8f38\u5165\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d nums \u7531\u5f9e \\(1\\) \u81f3 \\(n\\) \u7684\u6578\u5b57\u7d44\u6210\uff0c\u6bcf\u500b\u6578\u5b57\u53ea\u51fa\u73fe\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u9806\u5e8f\u662f\u96a8\u6a5f\u6253\u4e82\u7684\uff0c\u4efb\u52d9\u76ee\u6a19\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

  • \u7576 nums = [?, ?, ..., 1] \uff0c\u5373\u7576\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u6642\uff0c\u9700\u8981\u5b8c\u6574\u8d70\u8a2a\u9663\u5217\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
  • \u7576 nums = [1, ?, ?, ...] \uff0c\u5373\u7576\u9996\u500b\u5143\u7d20\u70ba \\(1\\) \u6642\uff0c\u7121\u8ad6\u9663\u5217\u591a\u9577\u90fd\u4e0d\u9700\u8981\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(\\Omega(1)\\) \u3002

\u201c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8a18\u865f\u8868\u793a\u3002\u76f8\u61c9\u5730\uff0c\u201c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8a18\u865f\u8868\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82\"\"\"\n    # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7d71\u6642\u9593\u751f\u6210\u96a8\u6a5f\u7a2e\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u7a4d\u5340\u8a18\u61b6\u9ad4\uff08\u5efa\u7acb\u4e00\u7dad\u53ef\u8b8a\u9577\u9663\u5217\uff1a\u9663\u5217\u4e2d\u5143\u7d20\u6578\u91cf\u70ba n \uff0c\u5143\u7d20\u578b\u5225\u70ba int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82 ###\ndef random_numbers(n)\n  # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6211\u5011\u5728\u5be6\u969b\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u56e0\u70ba\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6a5f\u7387\u4e0b\u624d\u80fd\u9054\u5230\uff0c\u53ef\u80fd\u6703\u5e36\u4f86\u4e00\u5b9a\u7684\u8aa4\u5c0e\u6027\u3002\u800c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u70ba\u5be6\u7528\uff0c\u56e0\u70ba\u5b83\u7d66\u51fa\u4e86\u4e00\u500b\u6548\u7387\u5b89\u5168\u503c\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u6f14\u7b97\u6cd5\u3002

\u5f9e\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ea\u51fa\u73fe\u65bc\u201c\u7279\u6b8a\u7684\u8cc7\u6599\u5206\u4f48\u201d\uff0c\u9019\u4e9b\u60c5\u6cc1\u7684\u51fa\u73fe\u6a5f\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u4e26\u4e0d\u80fd\u771f\u5be6\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9ad4\u73fe\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8f38\u5165\u8cc7\u6599\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8a18\u865f\u4f86\u8868\u793a\u3002

\u5c0d\u65bc\u90e8\u5206\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u63a8\u7b97\u51fa\u96a8\u6a5f\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u5e73\u5747\u60c5\u6cc1\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u65bc\u8f38\u5165\u9663\u5217\u662f\u88ab\u6253\u4e82\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73fe\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6a5f\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u9ebc\u6f14\u7b97\u6cd5\u7684\u5e73\u5747\u8ff4\u5708\u6b21\u6578\u5c31\u662f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

\u4f46\u5c0d\u65bc\u8f03\u70ba\u8907\u96dc\u7684\u6f14\u7b97\u6cd5\uff0c\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5f80\u5f80\u6bd4\u8f03\u56f0\u96e3\uff0c\u56e0\u70ba\u5f88\u96e3\u5206\u6790\u51fa\u5728\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u6574\u9ad4\u6578\u5b78\u671f\u671b\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f5c\u70ba\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u8a55\u5224\u6a19\u6e96\u3002

\u70ba\u4ec0\u9ebc\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u865f\uff1f

\u53ef\u80fd\u7531\u65bc \\(O\\) \u7b26\u865f\u904e\u65bc\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u5011\u5e38\u5e38\u4f7f\u7528\u5b83\u4f86\u8868\u793a\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u3002\u4f46\u5f9e\u56b4\u683c\u610f\u7fa9\u4e0a\u8b1b\uff0c\u9019\u7a2e\u505a\u6cd5\u4e26\u4e0d\u898f\u7bc4\u3002\u5728\u672c\u66f8\u548c\u5176\u4ed6\u8cc7\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u985e\u4f3c\u201c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8acb\u5c07\u5176\u76f4\u63a5\u7406\u89e3\u70ba \\(\\Theta(n)\\) \u3002

"},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u8cc7\u6599\u7d50\u69cb","text":"

Abstract

\u8cc7\u6599\u7d50\u69cb\u5982\u540c\u4e00\u526f\u7a69\u56fa\u800c\u591a\u6a23\u7684\u6846\u67b6\u3002

\u5b83\u70ba\u8cc7\u6599\u7684\u6709\u5e8f\u7d44\u7e54\u63d0\u4f9b\u4e86\u85cd\u5716\uff0c\u6f14\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u790e\u4e0a\u751f\u52d5\u8d77\u4f86\u3002

"},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e
  • 3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225
  • 3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *
  • 3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *
  • 3.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225","text":"

\u7576\u8ac7\u53ca\u8a08\u7b97\u6a5f\u4e2d\u7684\u8cc7\u6599\u6642\uff0c\u6211\u5011\u6703\u60f3\u5230\u6587\u5b57\u3001\u5716\u7247\u3001\u5f71\u7247\u3001\u8a9e\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u7a2e\u5f62\u5f0f\u3002\u5118\u7ba1\u9019\u4e9b\u8cc7\u6599\u7684\u7d44\u7e54\u5f62\u5f0f\u5404\u7570\uff0c\u4f46\u5b83\u5011\u90fd\u7531\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u69cb\u6210\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u9032\u884c\u904b\u7b97\u7684\u578b\u5225\uff0c\u5728\u6f14\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

  • \u6574\u6578\u578b\u5225 byte\u3001short\u3001int\u3001long \u3002
  • \u6d6e\u9ede\u6578\u578b\u5225 float\u3001double \uff0c\u7528\u65bc\u8868\u793a\u5c0f\u6578\u3002
  • \u5b57\u5143\u578b\u5225 char \uff0c\u7528\u65bc\u8868\u793a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u6bcd\u3001\u6a19\u9ede\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002
  • \u5e03\u6797\u578b\u5225 bool \uff0c\u7528\u65bc\u8868\u793a\u201c\u662f\u201d\u8207\u201c\u5426\u201d\u5224\u65b7\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4ee5\u4e8c\u9032\u4f4d\u5236\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u3002\u4e00\u500b\u4e8c\u9032\u4f4d\u5236\u4f4d\u5373\u70ba \\(1\\) \u4f4d\u5143\u3002\u5728\u7d55\u5927\u591a\u6578\u73fe\u4ee3\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\\(1\\) \u4f4d\u5143\u7d44\uff08byte\uff09\u7531 \\(8\\) \u4f4d\u5143\uff08bit\uff09\u7d44\u6210\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u5176\u4f54\u7528\u7684\u7a7a\u9593\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u70ba\u4f8b\u3002

  • \u6574\u6578\u578b\u5225 byte \u4f54\u7528 \\(1\\) \u4f4d\u5143\u7d44 = \\(8\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u500b\u6578\u5b57\u3002
  • \u6574\u6578\u578b\u5225 int \u4f54\u7528 \\(4\\) \u4f4d\u5143\u7d44 = \\(32\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u500b\u6578\u5b57\u3002

\u8868 3-1 \u5217\u8209\u4e86 Java \u4e2d\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u3002\u6b64\u8868\u683c\u7121\u9808\u6b7b\u8a18\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u6642\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u4f86\u56de\u61b6\u3002

\u8868 3-1 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u548c\u53d6\u503c\u7bc4\u570d

\u578b\u5225 \u7b26\u865f \u4f54\u7528\u7a7a\u9593 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9810\u8a2d\u503c \u6574\u6578 byte 1 \u4f4d\u5143\u7d44 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u4f4d\u5143\u7d44 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u4f4d\u5143\u7d44 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u4f4d\u5143\u7d44 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u9ede\u6578 float 4 \u4f4d\u5143\u7d44 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u4f4d\u5143\u7d44 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u5143 char 2 \u4f4d\u5143\u7d44 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u6797 bool 1 \u4f4d\u5143\u7d44 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

\u8acb\u6ce8\u610f\uff0c\u8868 3-1 \u91dd\u5c0d\u7684\u662f Java \u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u60c5\u6cc1\u3002\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u6709\u5404\u81ea\u7684\u8cc7\u6599\u578b\u5225\u5b9a\u7fa9\uff0c\u5b83\u5011\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002

  • \u5728 Python \u4e2d\uff0c\u6574\u6578\u578b\u5225 int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\uff1b\u6d6e\u9ede\u6578 float \u662f\u96d9\u7cbe\u5ea6 64 \u4f4d\uff1b\u6c92\u6709 char \u578b\u5225\uff0c\u55ae\u500b\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32 str \u3002
  • C \u548c C++ \u672a\u660e\u78ba\u898f\u5b9a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5be6\u73fe\u548c\u5e73\u81fa\u5404\u7570\u3002\u8868 3-1 \u9075\u5faa LP64 \u8cc7\u6599\u6a21\u578b\uff0c\u5176\u7528\u65bc\u5305\u62ec Linux \u548c macOS \u5728\u5167\u7684 Unix 64 \u4f4d\u4f5c\u696d\u7cfb\u7d71\u3002
  • \u5b57\u5143 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u53d6\u6c7a\u65bc\u7279\u5b9a\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\uff0c\u8a73\u898b\u201c\u5b57\u5143\u7de8\u78bc\u201d\u7ae0\u7bc0\u3002
  • \u5373\u4f7f\u8868\u793a\u5e03\u6797\u91cf\u50c5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u8a18\u61b6\u9ad4\u4e2d\u901a\u5e38\u4e5f\u5132\u5b58\u70ba 1 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba\u73fe\u4ee3\u8a08\u7b97\u6a5f CPU \u901a\u5e38\u5c07 1 \u4f4d\u5143\u7d44\u4f5c\u70ba\u6700\u5c0f\u5b9a\u5740\u8a18\u61b6\u9ad4\u55ae\u5143\u3002

\u90a3\u9ebc\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u9593\u6709\u4ec0\u9ebc\u95dc\u806f\u5462\uff1f\u6211\u5011\u77e5\u9053\uff0c\u8cc7\u6599\u7d50\u69cb\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u8207\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002\u9019\u53e5\u8a71\u7684\u4e3b\u8a9e\u662f\u201c\u7d50\u69cb\u201d\u800c\u975e\u201c\u8cc7\u6599\u201d\u3002

\u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6578\u5b57\u201d\uff0c\u6211\u5011\u81ea\u7136\u6703\u60f3\u5230\u4f7f\u7528\u9663\u5217\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u7684\u7dda\u6027\u7d50\u69cb\u53ef\u4ee5\u8868\u793a\u6578\u5b57\u7684\u76f8\u9130\u95dc\u4fc2\u548c\u9806\u5e8f\u95dc\u4fc2\uff0c\u4f46\u81f3\u65bc\u5132\u5b58\u7684\u5167\u5bb9\u662f\u6574\u6578 int\u3001\u5c0f\u6578 float \u9084\u662f\u5b57\u5143 char \uff0c\u5247\u8207\u201c\u8cc7\u6599\u7d50\u69cb\u201d\u7121\u95dc\u3002

\u63db\u53e5\u8a71\u8aaa\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u5167\u5bb9\u578b\u5225\u201d\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u7d44\u7e54\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u7528\u76f8\u540c\u7684\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\uff09\u4f86\u5132\u5b58\u8207\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript \u7684\u9663\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\nconst array = [0, 0.0, 'a', false];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
# Ruby \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *","text":"

\u5728\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6240\u6709\u8cc7\u6599\u90fd\u662f\u4ee5\u4e8c\u9032\u4f4d\u5236\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\uff0c\u5b57\u5143 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u70ba\u4e86\u8868\u793a\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u898f\u5b9a\u6bcf\u500b\u5b57\u5143\u548c\u4e8c\u9032\u4f4d\u5236\u6578\u4e4b\u9593\u7684\u4e00\u4e00\u5c0d\u61c9\u95dc\u4fc2\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u5f8c\uff0c\u8a08\u7b97\u6a5f\u5c31\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u5b8c\u6210\u4e8c\u9032\u4f4d\u5236\u6578\u5230\u5b57\u5143\u7684\u8f49\u63db\u3002

"},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u7a31\u70ba American Standard Code for Information Interchange\uff08\u7f8e\u570b\u6a19\u6e96\u8cc7\u8a0a\u4ea4\u63db\u7a0b\u5f0f\u78bc\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u9032\u4f4d\u5236\u6578\uff08\u4e00\u500b\u4f4d\u5143\u7d44\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6700\u591a\u80fd\u5920\u8868\u793a 128 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002\u5982\u5716 3-6 \u6240\u793a\uff0cASCII \u78bc\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5beb\u3001\u6578\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6a19\u9ede\u7b26\u865f\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u5143\uff08\u5982\u63db\u884c\u7b26\u548c\u88fd\u8868\u7b26\uff09\u3002

\u5716 3-6 \u00a0 ASCII \u78bc

\u7136\u800c\uff0cASCII \u78bc\u50c5\u80fd\u5920\u8868\u793a\u82f1\u6587\u3002\u96a8\u8457\u8a08\u7b97\u6a5f\u7684\u5168\u7403\u5316\uff0c\u8a95\u751f\u4e86\u4e00\u7a2e\u80fd\u5920\u8868\u793a\u66f4\u591a\u8a9e\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u790e\u4e0a\u64f4\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u5920\u8868\u793a 256 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002

\u5728\u4e16\u754c\u7bc4\u570d\u5167\uff0c\u9678\u7e8c\u51fa\u73fe\u4e86\u4e00\u6279\u9069\u7528\u65bc\u4e0d\u540c\u5730\u5340\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u9019\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u500b\u5b57\u5143\u7d71\u4e00\u70ba ASCII \u78bc\uff0c\u5f8c 128 \u500b\u5b57\u5143\u5b9a\u7fa9\u4e0d\u540c\uff0c\u4ee5\u9069\u61c9\u4e0d\u540c\u8a9e\u8a00\u7684\u9700\u6c42\u3002

"},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

\u5f8c\u4f86\u4eba\u5011\u767c\u73fe\uff0cEASCII \u78bc\u4ecd\u7136\u7121\u6cd5\u6eff\u8db3\u8a31\u591a\u8a9e\u8a00\u7684\u5b57\u5143\u6578\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6f22\u5b57\u6709\u8fd1\u5341\u842c\u500b\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u5e7e\u5343\u500b\u3002\u4e2d\u570b\u570b\u5bb6\u6a19\u6e96\u7e3d\u5c40\u65bc 1980 \u5e74\u91cb\u51fa\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u9304\u4e86 6763 \u500b\u6f22\u5b57\uff0c\u57fa\u672c\u6eff\u8db3\u4e86\u6f22\u5b57\u7684\u8a08\u7b97\u6a5f\u8655\u7406\u9700\u8981\u3002

\u7136\u800c\uff0cGB2312 \u7121\u6cd5\u8655\u7406\u90e8\u5206\u7f55\u898b\u5b57\u548c\u7e41\u9ad4\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u790e\u4e0a\u64f4\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u9304\u4e86 21886 \u500b\u6f22\u5b57\u3002\u5728 GBK \u7684\u7de8\u78bc\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u5143\u4f7f\u7528\u4e00\u500b\u4f4d\u5143\u7d44\u8868\u793a\uff0c\u6f22\u5b57\u4f7f\u7528\u5169\u500b\u4f4d\u5143\u7d44\u8868\u793a\u3002

"},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

\u96a8\u8457\u8a08\u7b97\u6a5f\u6280\u8853\u7684\u84ec\u52c3\u767c\u5c55\uff0c\u5b57\u7b26\u96c6\u8207\u7de8\u78bc\u6a19\u6e96\u767e\u82b1\u9f4a\u653e\uff0c\u800c\u9019\u5e36\u4f86\u4e86\u8a31\u591a\u554f\u984c\u3002\u4e00\u65b9\u9762\uff0c\u9019\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u7fa9\u4e86\u7279\u5b9a\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u7121\u6cd5\u5728\u591a\u8a9e\u8a00\u74b0\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u7a2e\u8a9e\u8a00\u5b58\u5728\u591a\u7a2e\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u5982\u679c\u5169\u81fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7de8\u78bc\u6a19\u6e96\uff0c\u5247\u5728\u8cc7\u8a0a\u50b3\u905e\u6642\u5c31\u6703\u51fa\u73fe\u4e82\u78bc\u3002

\u90a3\u500b\u6642\u4ee3\u7684\u7814\u7a76\u4eba\u54e1\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u500b\u8db3\u5920\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c07\u4e16\u754c\u7bc4\u570d\u5167\u7684\u6240\u6709\u8a9e\u8a00\u548c\u7b26\u865f\u90fd\u6536\u9304\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u6c7a\u8de8\u8a9e\u8a00\u74b0\u5883\u548c\u4e82\u78bc\u554f\u984c\u4e86\u55ce\uff1f\u5728\u9019\u7a2e\u60f3\u6cd5\u7684\u9a45\u52d5\u4e0b\uff0c\u4e00\u500b\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u61c9\u904b\u800c\u751f\u3002

Unicode \u7684\u4e2d\u6587\u540d\u7a31\u70ba\u201c\u7d71\u4e00\u78bc\u201d\uff0c\u7406\u8ad6\u4e0a\u80fd\u5bb9\u7d0d 100 \u591a\u842c\u500b\u5b57\u5143\u3002\u5b83\u81f4\u529b\u65bc\u5c07\u5168\u7403\u7bc4\u570d\u5167\u7684\u5b57\u5143\u7d0d\u5165\u7d71\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u7a2e\u901a\u7528\u7684\u5b57\u7b26\u96c6\u4f86\u8655\u7406\u548c\u986f\u793a\u5404\u7a2e\u8a9e\u8a00\u6587\u5b57\uff0c\u6e1b\u5c11\u56e0\u70ba\u7de8\u78bc\u6a19\u6e96\u4e0d\u540c\u800c\u7522\u751f\u7684\u4e82\u78bc\u554f\u984c\u3002

\u81ea 1991 \u5e74\u91cb\u51fa\u4ee5\u4f86\uff0cUnicode \u4e0d\u65b7\u64f4\u5145\u65b0\u7684\u8a9e\u8a00\u8207\u5b57\u5143\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7d93\u5305\u542b 149186 \u500b\u5b57\u5143\uff0c\u5305\u62ec\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\u3001\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002\u5728\u9f90\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u5143\u4f54\u7528 3 \u4f4d\u5143\u7d44\u751a\u81f3 4 \u4f4d\u5143\u7d44\u3002

Unicode \u662f\u4e00\u7a2e\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8cea\u4e0a\u662f\u7d66\u6bcf\u500b\u5b57\u5143\u5206\u914d\u4e00\u500b\u7de8\u865f\uff08\u7a31\u70ba\u201c\u78bc\u9ede\u201d\uff09\uff0c\u4f46\u5b83\u4e26\u6c92\u6709\u898f\u5b9a\u5728\u8a08\u7b97\u6a5f\u4e2d\u5982\u4f55\u5132\u5b58\u9019\u4e9b\u5b57\u5143\u78bc\u9ede\u3002\u6211\u5011\u4e0d\u7981\u6703\u554f\uff1a\u7576\u591a\u7a2e\u9577\u5ea6\u7684 Unicode \u78bc\u9ede\u540c\u6642\u51fa\u73fe\u5728\u4e00\u500b\u6587\u5b57\u4e2d\u6642\uff0c\u7cfb\u7d71\u5982\u4f55\u89e3\u6790\u5b57\u5143\uff1f\u4f8b\u5982\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u7684\u7de8\u78bc\uff0c\u7cfb\u7d71\u5982\u4f55\u78ba\u8a8d\u5b83\u662f\u4e00\u500b 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\u9084\u662f\u5169\u500b 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff1f

\u5c0d\u65bc\u4ee5\u4e0a\u554f\u984c\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u89e3\u6c7a\u65b9\u6848\u662f\u5c07\u6240\u6709\u5b57\u5143\u5132\u5b58\u70ba\u7b49\u9577\u7684\u7de8\u78bc\u3002\u5982\u5716 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff0c\u201c\u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u9ad8\u4f4d\u586b 0 \u5c07\u201cHello \u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u5143\u90fd\u7de8\u78bc\u70ba 2 \u4f4d\u5143\u7d44\u9577\u5ea6\u3002\u9019\u6a23\u7cfb\u7d71\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u4f4d\u5143\u7d44\u89e3\u6790\u4e00\u500b\u5b57\u5143\uff0c\u6062\u5fa9\u9019\u500b\u77ed\u8a9e\u7684\u5167\u5bb9\u4e86\u3002

\u5716 3-7 \u00a0 Unicode \u7de8\u78bc\u793a\u4f8b

\u7136\u800c ASCII \u78bc\u5df2\u7d93\u5411\u6211\u5011\u8b49\u660e\uff0c\u7de8\u78bc\u82f1\u6587\u53ea\u9700 1 \u4f4d\u5143\u7d44\u3002\u82e5\u63a1\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u5b57\u4f54\u7528\u7a7a\u9593\u7684\u5927\u5c0f\u5c07\u6703\u662f ASCII \u7de8\u78bc\u4e0b\u7684\u5169\u500d\uff0c\u975e\u5e38\u6d6a\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7de8\u78bc","text":"

\u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u70ba\u570b\u969b\u4e0a\u4f7f\u7528\u6700\u5ee3\u6cdb\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u7a2e\u53ef\u8b8a\u9577\u5ea6\u7684\u7de8\u78bc\uff0c\u4f7f\u7528 1 \u5230 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6839\u64da\u5b57\u5143\u7684\u8907\u96dc\u6027\u800c\u8b8a\u3002ASCII \u5b57\u5143\u53ea\u9700 1 \u4f4d\u5143\u7d44\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u81d8\u5b57\u6bcd\u9700\u8981 2 \u4f4d\u5143\u7d44\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u5143\u9700\u8981 3 \u4f4d\u5143\u7d44\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u5143\u9700\u8981 4 \u4f4d\u5143\u7d44\u3002

UTF-8 \u7684\u7de8\u78bc\u898f\u5247\u4e26\u4e0d\u8907\u96dc\uff0c\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u5c0d\u65bc\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0c\u5c07\u6700\u9ad8\u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff0c\u5176\u9918 7 \u4f4d\u8a2d\u5b9a\u70ba Unicode \u78bc\u9ede\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u5143\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u4f54\u64da\u4e86\u524d 128 \u500b\u78bc\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0cUTF-8 \u7de8\u78bc\u53ef\u4ee5\u5411\u4e0b\u76f8\u5bb9 ASCII \u78bc\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u4f86\u89e3\u6790\u5e74\u4ee3\u4e45\u9060\u7684 ASCII \u78bc\u6587\u5b57\u3002
  • \u5c0d\u65bc\u9577\u5ea6\u70ba \\(n\\) \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c07\u9996\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff1b\u5f9e\u7b2c\u4e8c\u500b\u4f4d\u5143\u7d44\u958b\u59cb\uff0c\u5c07\u6bcf\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \uff1b\u5176\u9918\u6240\u6709\u4f4d\u7528\u65bc\u586b\u5145\u5b57\u5143\u7684 Unicode \u78bc\u9ede\u3002

\u5716 3-8 \u5c55\u793a\u4e86\u201cHello\u6f14\u7b97\u6cd5\u201d\u5c0d\u61c9\u7684 UTF-8 \u7de8\u78bc\u3002\u89c0\u5bdf\u767c\u73fe\uff0c\u7531\u65bc\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7d71\u53ef\u4ee5\u900f\u904e\u8b80\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u500b\u6578\u4f86\u89e3\u6790\u51fa\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(n\\) \u3002

\u4f46\u70ba\u4ec0\u9ebc\u8981\u5c07\u5176\u9918\u6240\u6709\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \u5462\uff1f\u5be6\u969b\u4e0a\uff0c\u9019\u500b \\(10\\) \u80fd\u5920\u8d77\u5230\u6821\u9a57\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8a2d\u7cfb\u7d71\u5f9e\u4e00\u500b\u932f\u8aa4\u7684\u4f4d\u5143\u7d44\u958b\u59cb\u89e3\u6790\u6587\u5b57\uff0c\u4f4d\u5143\u7d44\u982d\u90e8\u7684 \\(10\\) \u80fd\u5920\u5e6b\u52a9\u7cfb\u7d71\u5feb\u901f\u5224\u65b7\u51fa\u7570\u5e38\u3002

\u4e4b\u6240\u4ee5\u5c07 \\(10\\) \u7576\u4f5c\u6821\u9a57\u7b26\uff0c\u662f\u56e0\u70ba\u5728 UTF-8 \u7de8\u78bc\u898f\u5247\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \u3002\u9019\u500b\u7d50\u8ad6\u53ef\u4ee5\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\uff1a\u5047\u8a2d\u4e00\u500b\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \uff0c\u8aaa\u660e\u8a72\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(1\\) \uff0c\u5c0d\u61c9 ASCII \u78bc\u3002\u800c ASCII \u78bc\u7684\u6700\u9ad8\u4f4d\u61c9\u8a72\u662f \\(0\\) \uff0c\u8207\u5047\u8a2d\u77db\u76fe\u3002

\u5716 3-8 \u00a0 UTF-8 \u7de8\u78bc\u793a\u4f8b

\u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u898b\u7684\u7de8\u78bc\u65b9\u5f0f\u9084\u5305\u62ec\u4ee5\u4e0b\u5169\u7a2e\u3002

  • UTF-16 \u7de8\u78bc\uff1a\u4f7f\u7528 2 \u6216 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\u3002\u6240\u6709\u7684 ASCII \u5b57\u5143\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u5143\uff0c\u90fd\u7528 2 \u4f4d\u5143\u7d44\u8868\u793a\uff1b\u5c11\u6578\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4f4d\u5143\u7d44\u8868\u793a\u3002\u5c0d\u65bc 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0cUTF-16 \u7de8\u78bc\u8207 Unicode \u78bc\u9ede\u76f8\u7b49\u3002
  • UTF-32 \u7de8\u78bc\uff1a\u6bcf\u500b\u5b57\u5143\u90fd\u4f7f\u7528 4 \u4f4d\u5143\u7d44\u3002\u9019\u610f\u5473\u8457 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u4f54\u7528\u7a7a\u9593\uff0c\u7279\u5225\u662f\u5c0d\u65bc ASCII \u5b57\u5143\u4f54\u6bd4\u8f03\u9ad8\u7684\u6587\u5b57\u3002

\u5f9e\u5132\u5b58\u7a7a\u9593\u4f54\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u5143\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 1 \u4f4d\u5143\u7d44\uff1b\u4f7f\u7528 UTF-16 \u7de8\u78bc\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u5143\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u6703\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 2 \u4f4d\u5143\u7d44\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4f4d\u5143\u7d44\u3002

\u5f9e\u76f8\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8a31\u591a\u5de5\u5177\u548c\u5eab\u512a\u5148\u652f\u6301 UTF-8 \u3002

"},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc","text":"

\u5c0d\u65bc\u4ee5\u5f80\u7684\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u57f7\u884c\u4e2d\u7684\u5b57\u4e32\u90fd\u63a1\u7528 UTF-16 \u6216 UTF-32 \u9019\u985e\u7b49\u9577\u7de8\u78bc\u3002\u5728\u7b49\u9577\u7de8\u78bc\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b57\u4e32\u770b\u4f5c\u9663\u5217\u4f86\u8655\u7406\uff0c\u9019\u7a2e\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

  • \u96a8\u6a5f\u8a2a\u554f\uff1aUTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u9032\u884c\u96a8\u6a5f\u8a2a\u554f\u3002UTF-8 \u662f\u4e00\u7a2e\u8b8a\u9577\u7de8\u78bc\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5f9e\u5b57\u4e32\u7684\u958b\u59cb\u8655\u8d70\u8a2a\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u9019\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u3002
  • \u5b57\u5143\u8a08\u6578\uff1a\u8207\u96a8\u6a5f\u8a2a\u554f\u985e\u4f3c\uff0c\u8a08\u7b97 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8a08\u7b97 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u9700\u8981\u8d70\u8a2a\u6574\u500b\u5b57\u4e32\u3002
  • \u5b57\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u9023\u7dda\u3001\u63d2\u5165\u3001\u522a\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u9032\u884c\u3002\u5728 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u9032\u884c\u9019\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u984d\u5916\u7684\u8a08\u7b97\uff0c\u4ee5\u78ba\u4fdd\u4e0d\u6703\u7522\u751f\u7121\u6548\u7684 UTF-8 \u7de8\u78bc\u3002

\u5be6\u969b\u4e0a\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6848\u8a2d\u8a08\u662f\u4e00\u500b\u5f88\u6709\u8da3\u7684\u8a71\u984c\uff0c\u6d89\u53ca\u8a31\u591a\u56e0\u7d20\u3002

  • Java \u7684 String \u578b\u5225\u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba Java \u8a9e\u8a00\u8a2d\u8a08\u4e4b\u521d\uff0c\u4eba\u5011\u8a8d\u70ba 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u5143\u3002\u7136\u800c\uff0c\u9019\u662f\u4e00\u500b\u4e0d\u6b63\u78ba\u7684\u5224\u65b7\u3002\u5f8c\u4f86 Unicode \u898f\u7bc4\u64f4\u5c55\u5230\u4e86\u8d85\u904e 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u5143\u73fe\u5728\u53ef\u80fd\u7531\u4e00\u5c0d 16 \u4f4d\u7684\u503c\uff08\u7a31\u70ba\u201c\u4ee3\u7406\u5c0d\u201d\uff09\u8868\u793a\u3002
  • JavaScript \u548c TypeScript \u7684\u5b57\u4e32\u4f7f\u7528 UTF-16 \u7de8\u78bc\u7684\u539f\u56e0\u8207 Java \u985e\u4f3c\u3002\u7576 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8a9e\u8a00\u6642\uff0cUnicode \u9084\u8655\u65bc\u767c\u5c55\u65e9\u671f\uff0c\u90a3\u6642\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7de8\u78bc\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u5143\u4e86\u3002
  • C# \u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u4e3b\u8981\u662f\u56e0\u70ba .NET \u5e73\u81fa\u662f\u7531 Microsoft \u8a2d\u8a08\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u8853\uff08\u5305\u62ec Windows \u4f5c\u696d\u7cfb\u7d71\uff09\u90fd\u5ee3\u6cdb\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002

\u7531\u65bc\u4ee5\u4e0a\u7a0b\u5f0f\u8a9e\u8a00\u5c0d\u5b57\u5143\u6578\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u5011\u4e0d\u5f97\u4e0d\u63a1\u53d6\u201c\u4ee3\u7406\u5c0d\u201d\u7684\u65b9\u5f0f\u4f86\u8868\u793a\u8d85\u904e 16 \u4f4d\u9577\u5ea6\u7684 Unicode \u5b57\u5143\u3002\u9019\u662f\u4e00\u500b\u4e0d\u5f97\u5df2\u70ba\u4e4b\u7684\u7121\u5948\u4e4b\u8209\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5c0d\u7684\u5b57\u4e32\u4e2d\uff0c\u4e00\u500b\u5b57\u5143\u53ef\u80fd\u4f54\u7528 2 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\uff0c\u5f9e\u800c\u55aa\u5931\u4e86\u7b49\u9577\u7de8\u78bc\u7684\u512a\u52e2\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u8655\u7406\u4ee3\u7406\u5c0d\u9700\u8981\u984d\u5916\u589e\u52a0\u7a0b\u5f0f\u78bc\uff0c\u9019\u63d0\u9ad8\u4e86\u7a0b\u5f0f\u8a2d\u8a08\u7684\u8907\u96dc\u6027\u548c\u9664\u932f\u96e3\u5ea6\u3002

\u51fa\u65bc\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7de8\u78bc\u65b9\u6848\u3002

  • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7de8\u78bc\uff0c\u4e26\u63a1\u7528\u4e00\u7a2e\u9748\u6d3b\u7684\u5b57\u4e32\u8868\u793a\uff0c\u5132\u5b58\u7684\u5b57\u5143\u9577\u5ea6\u53d6\u6c7a\u65bc\u5b57\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u78bc\u9ede\u3002\u82e5\u5b57\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u5b57\u5143\u8d85\u51fa\u4e86 ASCII \u7bc4\u570d\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8a9e\u8a00\u5e73\u9762\uff08BMP\uff09\u5167\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 4 \u4f4d\u5143\u7d44\u3002
  • Go \u8a9e\u8a00\u7684 string \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Go \u8a9e\u8a00\u9084\u63d0\u4f9b\u4e86 rune \u578b\u5225\uff0c\u5b83\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002
  • Rust \u8a9e\u8a00\u7684 str \u548c String \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u578b\u5225\uff0c\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8a0e\u8ad6\u7684\u90fd\u662f\u5b57\u4e32\u5728\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u9019\u548c\u5b57\u4e32\u5982\u4f55\u5728\u6a94\u6848\u4e2d\u5132\u5b58\u6216\u5728\u7db2\u8def\u4e2d\u50b3\u8f38\u662f\u4e0d\u540c\u7684\u554f\u984c\u3002\u5728\u6a94\u6848\u5132\u5b58\u6216\u7db2\u8def\u50b3\u8f38\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u5b57\u4e32\u7de8\u78bc\u70ba UTF-8 \u683c\u5f0f\uff0c\u4ee5\u9054\u5230\u6700\u512a\u7684\u76f8\u5bb9\u6027\u548c\u7a7a\u9593\u6548\u7387\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e","text":"

\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\u5305\u62ec\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\uff0c\u5b83\u5011\u53ef\u4ee5\u5f9e\u201c\u908f\u8f2f\u7d50\u69cb\u201d\u548c\u201c\u7269\u7406\u7d50\u69cb\u201d\u5169\u500b\u7dad\u5ea6\u9032\u884c\u5206\u985e\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u908f\u8f2f\u7d50\u69cb\uff1a\u7dda\u6027\u8207\u975e\u7dda\u6027","text":"

\u908f\u8f2f\u7d50\u69cb\u63ed\u793a\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\u3002\u5728\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u8cc7\u6599\u6309\u7167\u4e00\u5b9a\u9806\u5e8f\u6392\u5217\uff0c\u9ad4\u73fe\u4e86\u8cc7\u6599\u4e4b\u9593\u7684\u7dda\u6027\u95dc\u4fc2\uff1b\u800c\u5728\u6a39\u4e2d\uff0c\u8cc7\u6599\u5f9e\u9802\u90e8\u5411\u4e0b\u6309\u5c64\u6b21\u6392\u5217\uff0c\u8868\u73fe\u51fa\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff1b\u5716\u5247\u7531\u7bc0\u9ede\u548c\u908a\u69cb\u6210\uff0c\u53cd\u6620\u4e86\u8907\u96dc\u7684\u7db2\u8def\u95dc\u4fc2\u3002

\u5982\u5716 3-1 \u6240\u793a\uff0c\u908f\u8f2f\u7d50\u69cb\u53ef\u5206\u70ba\u201c\u7dda\u6027\u201d\u548c\u201c\u975e\u7dda\u6027\u201d\u5169\u5927\u985e\u3002\u7dda\u6027\u7d50\u69cb\u6bd4\u8f03\u76f4\u89c0\uff0c\u6307\u8cc7\u6599\u5728\u908f\u8f2f\u95dc\u4fc2\u4e0a\u5448\u7dda\u6027\u6392\u5217\uff1b\u975e\u7dda\u6027\u7d50\u69cb\u5247\u76f8\u53cd\uff0c\u5448\u975e\u7dda\u6027\u6392\u5217\u3002

  • \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u4e00\u7684\u9806\u5e8f\u95dc\u4fc2\u3002
  • \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u96dc\u6e4a\u8868\u3002

\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u6a39\u5f62\u7d50\u69cb\u548c\u7db2\u72c0\u7d50\u69cb\u3002

  • \u6a39\u5f62\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u591a\u7684\u95dc\u4fc2\u3002
  • \u7db2\u72c0\u7d50\u69cb\uff1a\u5716\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u591a\u5c0d\u591a\u7684\u95dc\u4fc2\u3002

\u5716 3-1 \u00a0 \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u8207\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb

"},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7d50\u69cb\uff1a\u9023\u7e8c\u8207\u5206\u6563","text":"

\u7576\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u5716 3-2 \u5c55\u793a\u4e86\u4e00\u500b\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u689d\uff0c\u5176\u4e2d\u6bcf\u500b\u9ed1\u8272\u65b9\u584a\u90fd\u5305\u542b\u4e00\u584a\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u8a18\u61b6\u9ad4\u60f3\u8c61\u6210\u4e00\u500b\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u500b\u55ae\u5143\u683c\u90fd\u53ef\u4ee5\u5132\u5b58\u4e00\u5b9a\u5927\u5c0f\u7684\u8cc7\u6599\u3002

\u7cfb\u7d71\u900f\u904e\u8a18\u61b6\u9ad4\u4f4d\u5740\u4f86\u8a2a\u554f\u76ee\u6a19\u4f4d\u7f6e\u7684\u8cc7\u6599\u3002\u5982\u5716 3-2 \u6240\u793a\uff0c\u8a08\u7b97\u6a5f\u6839\u64da\u7279\u5b9a\u898f\u5247\u70ba\u8868\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5206\u914d\u7de8\u865f\uff0c\u78ba\u4fdd\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u6709\u552f\u4e00\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u3002\u6709\u4e86\u9019\u4e9b\u4f4d\u5740\uff0c\u7a0b\u5f0f\u4fbf\u53ef\u4ee5\u8a2a\u554f\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u3002

\u5716 3-2 \u00a0 \u8a18\u61b6\u9ad4\u689d\u3001\u8a18\u61b6\u9ad4\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u4f4d\u5740

Tip

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5c07\u8a18\u61b6\u9ad4\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u500b\u7c21\u5316\u7684\u985e\u6bd4\uff0c\u5be6\u969b\u8a18\u61b6\u9ad4\u7684\u5de5\u4f5c\u6a5f\u5236\u6bd4\u8f03\u8907\u96dc\uff0c\u6d89\u53ca\u4f4d\u5740\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u7ba1\u7406\u3001\u5feb\u53d6\u6a5f\u5236\u3001\u865b\u64ec\u8a18\u61b6\u9ad4\u548c\u7269\u7406\u8a18\u61b6\u9ad4\u7b49\u6982\u5ff5\u3002

\u8a18\u61b6\u9ad4\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u5171\u4eab\u8cc7\u6e90\uff0c\u7576\u67d0\u584a\u8a18\u61b6\u9ad4\u88ab\u67d0\u500b\u7a0b\u5f0f\u4f54\u7528\u6642\uff0c\u5247\u7121\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5f0f\u540c\u6642\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u4e2d\uff0c\u8a18\u61b6\u9ad4\u8cc7\u6e90\u662f\u4e00\u500b\u91cd\u8981\u7684\u8003\u616e\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u6f14\u7b97\u6cd5\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u5cf0\u503c\u4e0d\u61c9\u8d85\u904e\u7cfb\u7d71\u5269\u9918\u7a7a\u9592\u8a18\u61b6\u9ad4\uff1b\u5982\u679c\u7f3a\u5c11\u9023\u7e8c\u5927\u584a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u90a3\u9ebc\u6240\u9078\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u5fc5\u9808\u80fd\u5920\u5132\u5b58\u5728\u5206\u6563\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\u3002

\u5982\u5716 3-3 \u6240\u793a\uff0c\u7269\u7406\u7d50\u69cb\u53cd\u6620\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u53ef\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u7269\u7406\u7d50\u69cb\u5f9e\u5e95\u5c64\u6c7a\u5b9a\u4e86\u8cc7\u6599\u7684\u8a2a\u554f\u3001\u66f4\u65b0\u3001\u589e\u522a\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u65b9\u9762\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u9ede\u3002

\u5716 3-3 \u00a0 \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u8207\u5206\u6563\u7a7a\u9593\u5132\u5b58

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u57fa\u65bc\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u4e8c\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002\u4f8b\u5982\uff0c\u5806\u758a\u548c\u4f47\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u5be6\u73fe\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1b\u800c\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u3002

  • \u57fa\u65bc\u9663\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u77e9\u9663\u3001\u5f35\u91cf\uff08\u7dad\u5ea6 \\(\\geq 3\\) \u7684\u9663\u5217\uff09\u7b49\u3002
  • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u3002

\u93c8\u7d50\u4e32\u5217\u5728\u521d\u59cb\u5316\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u5c0d\u5176\u9577\u5ea6\u9032\u884c\u8abf\u6574\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u52d5\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u9663\u5217\u53ef\u900f\u904e\u91cd\u65b0\u5206\u914d\u8a18\u61b6\u9ad4\u5be6\u73fe\u9577\u5ea6\u8b8a\u5316\uff0c\u5f9e\u800c\u5177\u5099\u4e00\u5b9a\u7684\u201c\u52d5\u614b\u6027\u201d\u3002

Tip

\u5982\u679c\u4f60\u611f\u89ba\u7269\u7406\u7d50\u69cb\u7406\u89e3\u8d77\u4f86\u6709\u56f0\u96e3\uff0c\u5efa\u8b70\u5148\u95b1\u8b80\u4e0b\u4e00\u7ae0\uff0c\u7136\u5f8c\u518d\u56de\u9867\u672c\u7bc0\u5167\u5bb9\u3002

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *","text":"

Tip

\u5728\u672c\u66f8\u4e2d\uff0c\u6a19\u984c\u5e36\u6709 * \u7b26\u865f\u7684\u662f\u9078\u8b80\u7ae0\u7bc0\u3002\u5982\u679c\u4f60\u6642\u9593\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\uff0c\u7b49\u5b78\u5b8c\u5fc5\u8b80\u7ae0\u7bc0\u5f8c\u518d\u55ae\u7368\u653b\u514b\u3002

"},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578","text":"

\u5728\u4e0a\u4e00\u7bc0\u7684\u8868\u683c\u4e2d\u6211\u5011\u767c\u73fe\uff0c\u6240\u6709\u6574\u6578\u578b\u5225\u80fd\u5920\u8868\u793a\u7684\u8ca0\u6578\u90fd\u6bd4\u6b63\u6578\u591a\u4e00\u500b\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \u3002\u9019\u500b\u73fe\u8c61\u6bd4\u8f03\u53cd\u76f4\u89ba\uff0c\u5b83\u7684\u5167\u5728\u539f\u56e0\u6d89\u53ca\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u76f8\u95dc\u77e5\u8b58\u3002

\u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6578\u5b57\u662f\u4ee5\u201c\u4e8c\u88dc\u6578\u201d\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u7684\u3002\u5728\u5206\u6790\u9019\u6a23\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7d66\u51fa\u4e09\u8005\u7684\u5b9a\u7fa9\u3002

  • \u539f\u78bc\uff1a\u6211\u5011\u5c07\u6578\u5b57\u7684\u4e8c\u9032\u4f4d\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u8996\u70ba\u7b26\u865f\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6578\uff0c\\(1\\) \u8868\u793a\u8ca0\u6578\uff0c\u5176\u9918\u4f4d\u8868\u793a\u6578\u5b57\u7684\u503c\u3002
  • \u4e00\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e00\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e00\u88dc\u6578\u662f\u5c0d\u5176\u539f\u78bc\u9664\u7b26\u865f\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
  • \u4e8c\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e8c\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e8c\u88dc\u6578\u662f\u5728\u5176\u4e00\u88dc\u6578\u7684\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u3002

\u5716 3-4 \u5c55\u793a\u4e86\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u8f49\u63db\u65b9\u6cd5\u3002

\u5716 3-4 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u8207\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u76f8\u4e92\u8f49\u63db

\u539f\u78bc\uff08sign-magnitude\uff09\u96d6\u7136\u6700\u76f4\u89c0\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8ca0\u6578\u7684\u539f\u78bc\u4e0d\u80fd\u76f4\u63a5\u7528\u65bc\u904b\u7b97\u3002\u4f8b\u5982\u5728\u539f\u78bc\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7d50\u679c\u662f \\(-3\\) \uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u8a08\u7b97\u6a5f\u5f15\u5165\u4e86\u4e00\u88dc\u6578\uff081's complement\uff09\u3002\u5982\u679c\u6211\u5011\u5148\u5c07\u539f\u78bc\u8f49\u63db\u70ba\u4e00\u88dc\u6578\uff0c\u4e26\u5728\u4e00\u88dc\u6578\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5f9e\u4e00\u88dc\u6578\u8f49\u63db\u56de\u539f\u78bc\uff0c\u5247\u53ef\u5f97\u5230\u6b63\u78ba\u7d50\u679c \\(-1\\) \u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0010 \\; \\text{(\u539f\u78bc)} \\newline & = 0000 \\; 0001 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1101 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & \\rightarrow -1 \\end{aligned} \\]

\u53e6\u4e00\u65b9\u9762\uff0c\u6578\u5b57\u96f6\u7684\u539f\u78bc\u6709 \\(+0\\) \u548c \\(-0\\) \u5169\u7a2e\u8868\u793a\u65b9\u5f0f\u3002\u9019\u610f\u5473\u8457\u6578\u5b57\u96f6\u5c0d\u61c9\u5169\u500b\u4e0d\u540c\u7684\u4e8c\u9032\u4f4d\u5236\u7de8\u78bc\uff0c\u9019\u53ef\u80fd\u6703\u5e36\u4f86\u6b67\u7fa9\u3002\u6bd4\u5982\u5728\u689d\u4ef6\u5224\u65b7\u4e2d\uff0c\u5982\u679c\u6c92\u6709\u5340\u5206\u6b63\u96f6\u548c\u8ca0\u96f6\uff0c\u5247\u53ef\u80fd\u6703\u5c0e\u81f4\u5224\u65b7\u7d50\u679c\u51fa\u932f\u3002\u800c\u5982\u679c\u6211\u5011\u60f3\u8655\u7406\u6b63\u96f6\u548c\u8ca0\u96f6\u6b67\u7fa9\uff0c\u5247\u9700\u8981\u5f15\u5165\u984d\u5916\u7684\u5224\u65b7\u64cd\u4f5c\uff0c\u9019\u53ef\u80fd\u6703\u964d\u4f4e\u8a08\u7b97\u6a5f\u7684\u904b\u7b97\u6548\u7387\u3002

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

\u8207\u539f\u78bc\u4e00\u6a23\uff0c\u4e00\u88dc\u6578\u4e5f\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u554f\u984c\uff0c\u56e0\u6b64\u8a08\u7b97\u6a5f\u9032\u4e00\u6b65\u5f15\u5165\u4e86\u4e8c\u88dc\u6578\uff082's complement\uff09\u3002\u6211\u5011\u5148\u4f86\u89c0\u5bdf\u4e00\u4e0b\u8ca0\u96f6\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u8f49\u63db\u904e\u7a0b\uff1a

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u78bc)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u4e00\u88dc\u6578)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline \\end{aligned} \\]

\u5728\u8ca0\u96f6\u7684\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u6703\u7522\u751f\u9032\u4f4d\uff0c\u4f46 byte \u578b\u5225\u7684\u9577\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u4f4d\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u6703\u88ab\u6368\u68c4\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8ca0\u96f6\u7684\u4e8c\u88dc\u6578\u70ba \\(0000 \\; 0000\\) \uff0c\u8207\u6b63\u96f6\u7684\u4e8c\u88dc\u6578\u76f8\u540c\u3002\u9019\u610f\u5473\u8457\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u500b\u96f6\uff0c\u6b63\u8ca0\u96f6\u6b67\u7fa9\u5f9e\u800c\u5f97\u5230\u89e3\u6c7a\u3002

\u9084\u5269\u6700\u5f8c\u4e00\u500b\u7591\u60d1\uff1abyte \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u4f86\u7684\u4e00\u500b\u8ca0\u6578 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u5011\u6ce8\u610f\u5230\uff0c\u5340\u9593 \\([-127, +127]\\) \u5167\u7684\u6240\u6709\u6574\u6578\u90fd\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\uff0c\u4e26\u4e14\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u53ef\u4ee5\u4e92\u76f8\u8f49\u63db\u3002

\u7136\u800c\uff0c\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u662f\u4e00\u500b\u4f8b\u5916\uff0c\u5b83\u4e26\u6c92\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3002\u6839\u64da\u8f49\u63db\u65b9\u6cd5\uff0c\u6211\u5011\u5f97\u5230\u8a72\u4e8c\u88dc\u6578\u7684\u539f\u78bc\u70ba \\(0000 \\; 0000\\) \u3002\u9019\u986f\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u70ba\u8a72\u539f\u78bc\u8868\u793a\u6578\u5b57 \\(0\\) \uff0c\u5b83\u7684\u4e8c\u88dc\u6578\u61c9\u8a72\u662f\u81ea\u8eab\u3002\u8a08\u7b97\u6a5f\u898f\u5b9a\u9019\u500b\u7279\u6b8a\u7684\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5be6\u969b\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u4e8c\u88dc\u6578\u4e0b\u7684\u8a08\u7b97\u7d50\u679c\u5c31\u662f \\(-128\\) \u3002

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u4e8c\u88dc\u6578)} + 1111 \\; 1111 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & \\rightarrow -128 \\end{aligned} \\]

\u4f60\u53ef\u80fd\u5df2\u7d93\u767c\u73fe\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8a08\u7b97\u90fd\u662f\u52a0\u6cd5\u904b\u7b97\u3002\u9019\u6697\u793a\u8457\u4e00\u500b\u91cd\u8981\u4e8b\u5be6\uff1a\u8a08\u7b97\u6a5f\u5167\u90e8\u7684\u786c\u9ad4\u96fb\u8def\u4e3b\u8981\u662f\u57fa\u65bc\u52a0\u6cd5\u904b\u7b97\u8a2d\u8a08\u7684\u3002\u9019\u662f\u56e0\u70ba\u52a0\u6cd5\u904b\u7b97\u76f8\u5c0d\u65bc\u5176\u4ed6\u904b\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u6e1b\u6cd5\uff09\u4f86\u8aaa\uff0c\u786c\u9ad4\u5be6\u73fe\u8d77\u4f86\u66f4\u7c21\u55ae\uff0c\u66f4\u5bb9\u6613\u9032\u884c\u4e26\u884c\u5316\u8655\u7406\uff0c\u904b\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

\u8acb\u6ce8\u610f\uff0c\u9019\u4e26\u4e0d\u610f\u5473\u8457\u8a08\u7b97\u6a5f\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u900f\u904e\u5c07\u52a0\u6cd5\u8207\u4e00\u4e9b\u57fa\u672c\u908f\u8f2f\u904b\u7b97\u7d50\u5408\uff0c\u8a08\u7b97\u6a5f\u80fd\u5920\u5be6\u73fe\u5404\u7a2e\u5176\u4ed6\u7684\u6578\u5b78\u904b\u7b97\u3002\u4f8b\u5982\uff0c\u8a08\u7b97\u6e1b\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8a08\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u6e1b\u6cd5\u3002

\u73fe\u5728\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u4e8c\u88dc\u6578\u7684\u539f\u56e0\uff1a\u57fa\u65bc\u4e8c\u88dc\u6578\u8868\u793a\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u7528\u540c\u6a23\u7684\u96fb\u8def\u548c\u64cd\u4f5c\u4f86\u8655\u7406\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\u4f86\u8655\u7406\u6e1b\u6cd5\uff0c\u4e26\u4e14\u7121\u9808\u7279\u5225\u8655\u7406\u6b63\u8ca0\u96f6\u7684\u6b67\u7fa9\u554f\u984c\u3002\u9019\u5927\u5927\u7c21\u5316\u4e86\u786c\u9ad4\u8a2d\u8a08\uff0c\u63d0\u9ad8\u4e86\u904b\u7b97\u6548\u7387\u3002

\u4e8c\u88dc\u6578\u7684\u8a2d\u8a08\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u95dc\u4fc2\u6211\u5011\u5c31\u5148\u4ecb\u7d39\u5230\u9019\u88e1\uff0c\u5efa\u8b70\u6709\u8208\u8da3\u7684\u8b80\u8005\u9032\u4e00\u6b65\u6df1\u5165\u77ad\u89e3\u3002

"},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u9ede\u6578\u7de8\u78bc","text":"

\u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u6703\u767c\u73fe\uff1aint \u548c float \u9577\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u4f4d\u5143\u7d44 \uff0c\u4f46\u70ba\u4ec0\u9ebc float \u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \uff1f\u9019\u975e\u5e38\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u6309\u7406\u8aaa float \u9700\u8981\u8868\u793a\u5c0f\u6578\uff0c\u53d6\u503c\u7bc4\u570d\u61c9\u8a72\u8b8a\u5c0f\u624d\u5c0d\u3002

\u5be6\u969b\u4e0a\uff0c\u9019\u662f\u56e0\u70ba\u6d6e\u9ede\u6578 float \u63a1\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8a18\u4e00\u500b 32 \u4f4d\u5143\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u70ba\uff1a

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

\u6839\u64da IEEE 754 \u6a19\u6e96\uff0c32-bit \u9577\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u500b\u90e8\u5206\u69cb\u6210\u3002

  • \u7b26\u865f\u4f4d \\(\\mathrm{S}\\) \uff1a\u4f54 1 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{31}\\) \u3002
  • \u6307\u6578\u4f4d \\(\\mathrm{E}\\) \uff1a\u4f54 8 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
  • \u5206\u6578\u4f4d \\(\\mathrm{N}\\) \uff1a\u4f54 23 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

\u4e8c\u9032\u4f4d\u5236\u6578 float \u5c0d\u61c9\u503c\u7684\u8a08\u7b97\u65b9\u6cd5\u70ba\uff1a

\\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

\u8f49\u5316\u5230\u5341\u9032\u4f4d\u5236\u4e0b\u7684\u8a08\u7b97\u516c\u5f0f\u70ba\uff1a

\\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

\u5176\u4e2d\u5404\u9805\u7684\u53d6\u503c\u7bc4\u570d\u70ba\uff1a

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

\u5716 3-5 \u00a0 IEEE 754 \u6a19\u6e96\u4e0b\u7684 float \u7684\u8a08\u7b97\u793a\u4f8b

\u89c0\u5bdf\u5716 3-5 \uff0c\u7d66\u5b9a\u4e00\u500b\u793a\u4f8b\u8cc7\u6599 \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5247\u6709\uff1a

\\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

\u73fe\u5728\u6211\u5011\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u554f\u984c\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6578\u4f4d\uff0c\u5c0e\u81f4\u5176\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \u3002\u6839\u64da\u4ee5\u4e0a\u8a08\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6578\u70ba \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u63db\u7b26\u865f\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8ca0\u6578\u3002

\u5118\u7ba1\u6d6e\u9ede\u6578 float \u64f4\u5c55\u4e86\u53d6\u503c\u7bc4\u570d\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6578\u578b\u5225 int \u5c07\u5168\u90e8 32 \u4f4d\u5143\u7528\u65bc\u8868\u793a\u6578\u5b57\uff0c\u6578\u5b57\u662f\u5747\u52fb\u5206\u4f48\u7684\uff1b\u800c\u7531\u65bc\u6307\u6578\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u9ede\u6578 float \u7684\u6578\u503c\u8d8a\u5927\uff0c\u76f8\u9130\u5169\u500b\u6578\u5b57\u4e4b\u9593\u7684\u5dee\u503c\u5c31\u6703\u8da8\u5411\u8d8a\u5927\u3002

\u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6578\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u7fa9\uff0c\u7528\u65bc\u8868\u793a\u96f6\u3001\u7121\u7aae\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\u8868 3-2 \u00a0 \u6307\u6578\u4f4d\u542b\u7fa9

\u6307\u6578\u4f4d E \u5206\u6578\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6578\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8a08\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u898f\u6578 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u898f\u6578 \u6b63\u898f\u6578 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6b21\u6b63\u898f\u6578\u986f\u8457\u63d0\u5347\u4e86\u6d6e\u9ede\u6578\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u898f\u6578\u70ba \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u898f\u6578\u70ba \\(2^{-126} \\times 2^{-23}\\) \u3002

\u96d9\u7cbe\u5ea6 double \u4e5f\u63a1\u7528\u985e\u4f3c\u65bc float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d05\u8ff0\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u5f9e\u908f\u8f2f\u7d50\u69cb\u548c\u7269\u7406\u7d50\u69cb\u5169\u500b\u89d2\u5ea6\u9032\u884c\u5206\u985e\u3002\u908f\u8f2f\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\uff0c\u800c\u7269\u7406\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\u3002
  • \u5e38\u898b\u7684\u908f\u8f2f\u7d50\u69cb\u5305\u62ec\u7dda\u6027\u3001\u6a39\u72c0\u548c\u7db2\u72c0\u7b49\u3002\u901a\u5e38\u6211\u5011\u6839\u64da\u908f\u8f2f\u7d50\u69cb\u5c07\u8cc7\u6599\u7d50\u69cb\u5206\u70ba\u7dda\u6027\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\uff09\u548c\u975e\u7dda\u6027\uff08\u6a39\u3001\u5716\u3001\u5806\u7a4d\uff09\u5169\u7a2e\u3002\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002
  • \u7576\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u88ab\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u3002\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u64c1\u6709\u5c0d\u61c9\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u7a0b\u5f0f\u900f\u904e\u9019\u4e9b\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a2a\u554f\u8cc7\u6599\u3002
  • \u7269\u7406\u7d50\u69cb\u4e3b\u8981\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u7531\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u5169\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002
  • \u8a08\u7b97\u6a5f\u4e2d\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u5305\u62ec\u6574\u6578 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u9ede\u6578 float\u3001double \uff0c\u5b57\u5143 char \u548c\u5e03\u6797 bool \u3002\u5b83\u5011\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u4f54\u7528\u7a7a\u9593\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
  • \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7de8\u78bc\u6578\u5b57\u7684\u4e09\u7a2e\u65b9\u6cd5\uff0c\u5b83\u5011\u4e4b\u9593\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\u3002\u6574\u6578\u7684\u539f\u78bc\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u865f\u4f4d\uff0c\u5176\u9918\u4f4d\u662f\u6578\u5b57\u7684\u503c\u3002
  • \u6574\u6578\u5728\u8a08\u7b97\u6a5f\u4e2d\u662f\u4ee5\u4e8c\u88dc\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\u3002\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e0b\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u5c0d\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\u4e00\u8996\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u70ba\u6e1b\u6cd5\u64cd\u4f5c\u55ae\u7368\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\uff0c\u4e26\u4e14\u4e0d\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u7684\u554f\u984c\u3002
  • \u6d6e\u9ede\u6578\u7684\u7de8\u78bc\u7531 1 \u4f4d\u7b26\u865f\u4f4d\u30018 \u4f4d\u6307\u6578\u4f4d\u548c 23 \u4f4d\u5206\u6578\u4f4d\u69cb\u6210\u3002\u7531\u65bc\u5b58\u5728\u6307\u6578\u4f4d\uff0c\u56e0\u6b64\u6d6e\u9ede\u6578\u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc\u6574\u6578\uff0c\u4ee3\u50f9\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002
  • ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5171\u6536\u9304 127 \u500b\u5b57\u5143\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u9304\u5169\u842c\u591a\u500b\u6f22\u5b57\u3002Unicode \u81f4\u529b\u65bc\u63d0\u4f9b\u4e00\u500b\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u6536\u9304\u4e16\u754c\u4e0a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u5f9e\u800c\u89e3\u6c7a\u7531\u65bc\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5c0e\u81f4\u7684\u4e82\u78bc\u554f\u984c\u3002
  • UTF-8 \u662f\u6700\u53d7\u6b61\u8fce\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u7a2e\u8b8a\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u64f4\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5132\u5b58\u7a7a\u9593\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\u3002\u5728\u7de8\u78bc\u4e2d\u6587\u6642\uff0cUTF-16 \u4f54\u7528\u7684\u7a7a\u9593\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7a0b\u5f0f\u8a9e\u8a00\u9810\u8a2d\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1f

\u96dc\u6e4a\u8868\u5e95\u5c64\u662f\u9663\u5217\uff0c\u800c\u70ba\u4e86\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\uff0c\u6211\u5011\u53ef\u80fd\u6703\u4f7f\u7528\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\uff08\u5f8c\u7e8c\u201c\u96dc\u6e4a\u885d\u7a81\u201d\u7ae0\u7bc0\u6703\u8b1b\uff09\uff1a\u9663\u5217\u4e2d\u6bcf\u500b\u6876\u6307\u5411\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u8d85\u904e\u4e00\u5b9a\u95be\u503c\u6642\uff0c\u53c8\u53ef\u80fd\u88ab\u8f49\u5316\u70ba\u6a39\uff08\u901a\u5e38\u70ba\u7d05\u9ed1\u6a39\uff09\u3002

\u5f9e\u5132\u5b58\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u96dc\u6e4a\u8868\u7684\u5e95\u5c64\u662f\u9663\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u500b\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u6216\u4e00\u68f5\u6a39\u3002\u56e0\u6b64\uff0c\u96dc\u6e4a\u8868\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\uff09\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u6a39\uff09\u3002

Q\uff1achar \u578b\u5225\u7684\u9577\u5ea6\u662f 1 \u4f4d\u5143\u7d44\u55ce\uff1f

char \u578b\u5225\u7684\u9577\u5ea6\u7531\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u7528\u7684\u7de8\u78bc\u65b9\u6cd5\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u63a1\u7528 UTF-16 \u7de8\u78bc\uff08\u5132\u5b58 Unicode \u78bc\u9ede\uff09\uff0c\u56e0\u6b64 char \u578b\u5225\u7684\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u3002

Q\uff1a\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d \u662f\u5426\u6709\u6b67\u7fa9\uff1f\u5806\u758a\u4e5f\u53ef\u4ee5\u9032\u884c\u51fa\u5806\u758a\u548c\u5165\u5806\u758a\u7b49\u64cd\u4f5c\uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52d5\u614b\u201d\u7684\u3002

\u5806\u758a\u78ba\u5be6\u53ef\u4ee5\u5be6\u73fe\u52d5\u614b\u7684\u8cc7\u6599\u64cd\u4f5c\uff0c\u4f46\u8cc7\u6599\u7d50\u69cb\u4ecd\u7136\u662f\u201c\u975c\u614b\u201d\uff08\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff09\u7684\u3002\u5118\u7ba1\u57fa\u65bc\u9663\u5217\u7684\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u52d5\u614b\u5730\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u5011\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u8cc7\u6599\u91cf\u8d85\u51fa\u4e86\u9810\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u66f4\u5927\u7684\u9663\u5217\uff0c\u4e26\u5c07\u820a\u9663\u5217\u7684\u5167\u5bb9\u8907\u88fd\u5230\u65b0\u9663\u5217\u4e2d\u3002

Q\uff1a\u5728\u69cb\u5efa\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u6642\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u70ba\u4ec0\u9ebc\u5b83\u5011\u662f\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u5462\uff1f

\u5728\u9ad8\u968e\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u7121\u9808\u4eba\u5de5\u6307\u5b9a\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u9019\u500b\u5de5\u4f5c\u7531\u985e\u5225\u5167\u90e8\u81ea\u52d5\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u70ba 10\u3002\u53e6\u5916\uff0c\u64f4\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52d5\u5be6\u73fe\u7684\u3002\u8a73\u898b\u5f8c\u7e8c\u7684\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u3002

Q\uff1a\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\uff0c\u90a3\u9ebc\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u61c9\u8a72\u662f\u9006\u904b\u7b97\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff0c\u800c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u4e5f\u4e00\u6a23\u53ef\u4ee5\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff0c\u9019\u662f\u70ba\u4ec0\u9ebc\u5462\uff1f

A\uff1a\u9019\u662f\u56e0\u70ba\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u76f8\u4e92\u8f49\u63db\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u201c\u88dc\u6578\u201d\u7684\u904e\u7a0b\u3002\u6211\u5011\u5148\u7d66\u51fa\u88dc\u6578\u7684\u5b9a\u7fa9\uff1a\u5047\u8a2d \\(a + b = c\\) \uff0c\u90a3\u9ebc\u6211\u5011\u7a31 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u88dc\u6578\uff0c\u53cd\u4e4b\u4e5f\u7a31 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u88dc\u6578\u3002

\u7d66\u5b9a\u4e00\u500b \\(n = 4\\) \u4f4d\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578 \\(0010\\) \uff0c\u5982\u679c\u5c07\u9019\u500b\u6578\u5b57\u770b\u4f5c\u539f\u78bc\uff08\u4e0d\u8003\u616e\u7b26\u865f\u4f4d\uff09\uff0c\u90a3\u9ebc\u5b83\u7684\u4e8c\u88dc\u6578\u9700\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff1a

\\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

\u6211\u5011\u6703\u767c\u73fe\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8aaa\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u662f\u539f\u78bc \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u3002\u9019\u610f\u5473\u8457\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\u7684\u904e\u7a0b\u3002

\u90a3\u9ebc\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u5011\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

\\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

\u63db\u53e5\u8a71\u8aaa\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e92\u70ba\u5c0d\u65b9\u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\uff0c\u56e0\u6b64\u201c\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u201d\u548c\u201c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u5f8c\u52a0 1 \uff09\u5be6\u73fe\u3002

\u7576\u7136\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u7528\u9006\u904b\u7b97\u4f86\u6c42\u4e8c\u88dc\u6578 \\(1110\\) \u7684\u539f\u78bc\uff0c\u5373\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff1a

\\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

\u7e3d\u7d50\u4f86\u770b\uff0c\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u548c\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\u9019\u5169\u7a2e\u904b\u7b97\u90fd\u662f\u5728\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\uff0c\u5b83\u5011\u662f\u7b49\u50f9\u7684\u3002

\u672c\u8cea\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u88dc\u6578\uff08\u56e0\u70ba\u6046\u6709 \u539f\u78bc + \u4e00\u88dc\u6578 = 1111\uff09\uff1b\u800c\u5728\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u4e8c\u88dc\u6578\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u88dc\u6578\u3002

\u4e0a\u8ff0 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u63a8\u5ee3\u81f3\u4efb\u610f\u4f4d\u6578\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u3002

"},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

Abstract

\u96e3\u984c\u88ab\u9010\u5c64\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u8b8a\u5f97\u66f4\u70ba\u7c21\u55ae\u3002

\u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u500b\u91cd\u8981\u7684\u4e8b\u5be6\uff1a\u5f9e\u7c21\u55ae\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u8907\u96dc\u3002

"},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5
  • 12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565
  • 12.3 \u00a0 \u69cb\u5efa\u6a39\u554f\u984c
  • 12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c
  • 12.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565","text":"

\u6211\u5011\u5df2\u7d93\u5b78\u904e\uff0c\u641c\u5c0b\u6f14\u7b97\u6cd5\u5206\u70ba\u5169\u5927\u985e\u3002

  • \u66b4\u529b\u641c\u5c0b\uff1a\u5b83\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
  • \u81ea\u9069\u61c9\u641c\u5c0b\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u8cc7\u6599\u7d44\u7e54\u5f62\u5f0f\u6216\u5148\u9a57\u8cc7\u8a0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u548c\u6a39\u3002

  • \u4e8c\u5206\u641c\u5c0b\u7684\u6bcf\u4e00\u6b65\u90fd\u5c07\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\u5206\u89e3\u70ba\u4e00\u500b\u5c0f\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\uff0c\u9019\u500b\u904e\u7a0b\u4e00\u76f4\u6301\u7e8c\u5230\u9663\u5217\u70ba\u7a7a\u6216\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
  • \u6a39\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u5806\u7a4d\u7b49\u8cc7\u6599\u7d50\u69cb\u4e2d\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7686\u70ba \\(O(\\log n)\\) \u3002

\u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

  • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u641c\u5c0b\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u9032\u884c\u67e5\u8a62\uff09\u5206\u89e3\u70ba\u5b50\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u9032\u884c\u67e5\u8a62\uff09\uff0c\u9019\u662f\u900f\u904e\u6bd4\u8f03\u4e2d\u9593\u5143\u7d20\u548c\u76ee\u6a19\u5143\u7d20\u4f86\u5be6\u73fe\u7684\u3002
  • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u8655\u7406\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u554f\u984c\u7684\u5f71\u97ff\u3002
  • \u5b50\u554f\u984c\u7684\u89e3\u7121\u9808\u5408\u4f75\uff1a\u4e8c\u5206\u641c\u5c0b\u65e8\u5728\u67e5\u8a62\u4e00\u500b\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u3002\u7576\u5b50\u554f\u984c\u5f97\u5230\u89e3\u6c7a\u6642\uff0c\u539f\u554f\u984c\u4e5f\u6703\u540c\u6642\u5f97\u5230\u89e3\u6c7a\u3002

\u5206\u6cbb\u80fd\u5920\u63d0\u5347\u641c\u5c0b\u6548\u7387\uff0c\u672c\u8cea\u4e0a\u662f\u56e0\u70ba\u66b4\u529b\u641c\u5c0b\u6bcf\u8f2a\u53ea\u80fd\u6392\u9664\u4e00\u500b\u9078\u9805\uff0c\u800c\u5206\u6cbb\u641c\u5c0b\u6bcf\u8f2a\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9078\u9805\u3002

"},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u65bc\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b","text":"

\u5728\u4e4b\u524d\u7684\u7ae0\u7bc0\u4e2d\uff0c\u4e8c\u5206\u641c\u5c0b\u662f\u57fa\u65bc\u905e\u63a8\uff08\u8fed\u4ee3\uff09\u5be6\u73fe\u7684\u3002\u73fe\u5728\u6211\u5011\u57fa\u65bc\u5206\u6cbb\uff08\u905e\u8ff4\uff09\u4f86\u5be6\u73fe\u5b83\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8acb\u67e5\u8a62\u5143\u7d20 target \u3002

\u5f9e\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u5011\u5c07\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u8a18\u70ba \\(f(i, j)\\) \u3002

\u4ee5\u539f\u554f\u984c \\(f(0, n-1)\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u900f\u904e\u4ee5\u4e0b\u6b65\u9a5f\u9032\u884c\u4e8c\u5206\u641c\u5c0b\u3002

  1. \u8a08\u7b97\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u7684\u4e2d\u9ede \\(m\\) \uff0c\u6839\u64da\u5b83\u6392\u9664\u4e00\u534a\u641c\u5c0b\u5340\u9593\u3002
  2. \u905e\u8ff4\u6c42\u89e3\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\u7684\u5b50\u554f\u984c\uff0c\u53ef\u80fd\u70ba \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
  3. \u8ff4\u5708\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u5340\u9593\u70ba\u7a7a\u6642\u8fd4\u56de\u3002

\u5716 12-4 \u5c55\u793a\u4e86\u5728\u9663\u5217\u4e2d\u4e8c\u5206\u641c\u5c0b\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u904e\u7a0b\u3002

\u5716 12-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u904e\u7a0b

\u5728\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \u4f86\u6c42\u89e3\u554f\u984c \\(f(i, j)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j)\"\"\"\n    # \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
binary_search_recur.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.java
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.cs
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
binary_search_recur.go
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u6c92\u6709\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8a08\u7b97\u7d22\u5f15\u4e2d\u9ede\n    m := i + ((j - i) >> 1)\n    //\u5224\u65b7\u4e2d\u9ede\u8207\u76ee\u6a19\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u53f3\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u5de6\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
binary_search_recur.swift
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
binary_search_recur.js
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.ts
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.dart
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u554f\u984c f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.rs
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.c
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.kt
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
binary_search_recur.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \uff0c\u8acb\u5f9e\u4e2d\u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u8fd4\u56de\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5047\u8a2d\u4e8c\u5143\u6a39\u4e2d\u6c92\u6709\u503c\u91cd\u8907\u7684\u7bc0\u9ede\uff08\u5982\u5716 12-5 \u6240\u793a\uff09\u3002

\u5716 12-5 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65b7\u662f\u5426\u70ba\u5206\u6cbb\u554f\u984c","text":"

\u539f\u554f\u984c\u5b9a\u7fa9\u70ba\u5f9e preorder \u548c inorder \u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u662f\u4e00\u500b\u5178\u578b\u7684\u5206\u6cbb\u554f\u984c\u3002

  • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u5f9e\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\u3001\u69cb\u5efa\u53f3\u5b50\u6a39\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u7bc0\u9ede\u3002\u800c\u5c0d\u65bc\u6bcf\u68f5\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u8907\u7528\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u5c07\u5176\u5283\u5206\u70ba\u66f4\u5c0f\u7684\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c\uff08\u7a7a\u5b50\u6a39\uff09\u6642\u7d42\u6b62\u3002
  • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u4ea4\u96c6\u3002\u5728\u69cb\u5efa\u5de6\u5b50\u6a39\u6642\uff0c\u6211\u5011\u53ea\u9700\u95dc\u6ce8\u4e2d\u5e8f\u8d70\u8a2a\u548c\u524d\u5e8f\u8d70\u8a2a\u4e2d\u8207\u5de6\u5b50\u6a39\u5c0d\u61c9\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6a39\u540c\u7406\u3002
  • \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5b83\u5011\u9023\u7d50\u5230\u6839\u7bc0\u9ede\u4e0a\uff0c\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5283\u5206\u5b50\u6a39","text":"

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u9019\u9053\u984c\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u4f86\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u900f\u904e\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u4f86\u5283\u5206\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u5462\uff1f

\u6839\u64da\u5b9a\u7fa9\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

  • \u524d\u5e8f\u8d70\u8a2a\uff1a[ \u6839\u7bc0\u9ede | \u5de6\u5b50\u6a39 | \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 3 | 9 | 2 1 7 ] \u3002
  • \u4e2d\u5e8f\u8d70\u8a2a\uff1a[ \u5de6\u5b50\u6a39 | \u6839\u7bc0\u9ede \uff5c \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 9 | 3 | 1 2 7 ] \u3002

\u4ee5\u4e0a\u5716\u8cc7\u6599\u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5716 12-6 \u6240\u793a\u7684\u6b65\u9a5f\u5f97\u5230\u5283\u5206\u7d50\u679c\u3002

  1. \u524d\u5e8f\u8d70\u8a2a\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u7bc0\u9ede\u7684\u503c\u3002
  2. \u67e5\u8a62\u6839\u7bc0\u9ede 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8a72\u7d22\u5f15\u53ef\u5c07 inorder \u5283\u5206\u70ba [ 9 | 3 \uff5c 1 2 7 ] \u3002
  3. \u6839\u64da inorder \u7684\u5283\u5206\u7d50\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u5206\u5225\u70ba 1 \u548c 3 \uff0c\u5f9e\u800c\u53ef\u5c07 preorder \u5283\u5206\u70ba [ 3 | 9 | 2 1 7 ] \u3002

\u5716 12-6 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5283\u5206\u5b50\u6a39

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u65bc\u8b8a\u6578\u63cf\u8ff0\u5b50\u6a39\u5340\u9593","text":"

\u6839\u64da\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u6211\u5011\u5df2\u7d93\u5f97\u5230\u6839\u7bc0\u9ede\u3001\u5de6\u5b50\u6a39\u3001\u53f3\u5b50\u6a39\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002\u800c\u70ba\u4e86\u63cf\u8ff0\u9019\u4e9b\u7d22\u5f15\u5340\u9593\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u3002

  • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(i\\) \u3002
  • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(m\\) \u3002
  • \u5c07\u7576\u524d\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u8a18\u70ba \\([l, r]\\) \u3002

\u5982\u8868 12-1 \u6240\u793a\uff0c\u900f\u904e\u4ee5\u4e0a\u8b8a\u6578\u5373\u53ef\u8868\u793a\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002

\u8868 12-1 \u00a0 \u6839\u7bc0\u9ede\u548c\u5b50\u6a39\u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u7684\u7d22\u5f15

\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593 \u7576\u524d\u6a39 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6a39 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6a39 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

\u8acb\u6ce8\u610f\uff0c\u53f3\u5b50\u6a39\u6839\u7bc0\u9ede\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u7fa9\u662f\u201c\u5de6\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u201d\uff0c\u5efa\u8b70\u7d50\u5408\u5716 12-7 \u7406\u89e3\u3002

\u5716 12-7 \u00a0 \u6839\u7bc0\u9ede\u548c\u5de6\u53f3\u5b50\u6a39\u7684\u7d22\u5f15\u5340\u9593\u8868\u793a

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u70ba\u4e86\u63d0\u5347\u67e5\u8a62 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u5011\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 hmap \u4f86\u5132\u5b58\u9663\u5217 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root = TreeNode(preorder[i])\n    # \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m = inorder_map[preorder[i]]\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\"\"\"\n    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
build_tree.cpp
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
build_tree.java
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.cs
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
build_tree.go
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m := inorderMap[preorder[i]]\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
build_tree.swift
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
build_tree.js
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.ts
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.dart
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u7bc0\u9ede\n  return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
build_tree.rs
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    Some(root)\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
build_tree.c
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
build_tree.kt
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
build_tree.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
build_tree.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 12-8 \u5c55\u793a\u4e86\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5404\u500b\u7bc0\u9ede\u662f\u5728\u5411\u4e0b\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u689d\u908a\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

<1><2><3><4><5><6><7><8><9>

\u5716 12-8 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b

\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u5167\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u7684\u5283\u5206\u7d50\u679c\u5982\u5716 12-9 \u6240\u793a\u3002

\u5716 12-9 \u00a0 \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u7684\u5283\u5206\u7d50\u679c

\u8a2d\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u500b\u7bc0\u9ede\uff08\u57f7\u884c\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u96dc\u6e4a\u8868\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5","text":"

\u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u7a31\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u7a2e\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u5169\u500b\u6b65\u9a5f\u3002

  1. \u5206\uff08\u5283\u5206\u968e\u6bb5\uff09\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u6216\u591a\u500b\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c\u6642\u7d42\u6b62\u3002
  2. \u6cbb\uff08\u5408\u4f75\u968e\u6bb5\uff09\uff1a\u5f9e\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u554f\u984c\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

\u5982\u5716 12-1 \u6240\u793a\uff0c\u201c\u5408\u4f75\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\u4e4b\u4e00\u3002

  1. \u5206\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u5230\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u554f\u984c\uff09\u3002
  2. \u6cbb\uff1a\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u6709\u5e8f\u7684\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002

\u5716 12-1 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65b7\u5206\u6cbb\u554f\u984c","text":"

\u4e00\u500b\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u6c7a\uff0c\u901a\u5e38\u53ef\u4ee5\u53c3\u8003\u4ee5\u4e0b\u5e7e\u500b\u5224\u65b7\u4f9d\u64da\u3002

  1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u554f\u984c\u53ef\u4ee5\u5206\u89e3\u6210\u898f\u6a21\u66f4\u5c0f\u3001\u985e\u4f3c\u7684\u5b50\u554f\u984c\uff0c\u4ee5\u53ca\u80fd\u5920\u4ee5\u76f8\u540c\u65b9\u5f0f\u905e\u8ff4\u5730\u9032\u884c\u5283\u5206\u3002
  2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5b50\u554f\u984c\u4e4b\u9593\u6c92\u6709\u91cd\u758a\uff0c\u4e92\u4e0d\u4f9d\u8cf4\uff0c\u53ef\u4ee5\u7368\u7acb\u89e3\u6c7a\u3002
  3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u539f\u554f\u984c\u7684\u89e3\u900f\u904e\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\u5f97\u4f86\u3002

\u986f\u7136\uff0c\u5408\u4f75\u6392\u5e8f\u6eff\u8db3\u4ee5\u4e0a\u4e09\u500b\u5224\u65b7\u4f9d\u64da\u3002

  1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u905e\u8ff4\u5730\u5c07\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\u3002
  2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u53ef\u4ee5\u7368\u7acb\u5730\u9032\u884c\u6392\u5e8f\uff08\u5b50\u554f\u984c\u53ef\u4ee5\u7368\u7acb\u9032\u884c\u6c42\u89e3\uff09\u3002
  3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u5169\u500b\u6709\u5e8f\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002
"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u900f\u904e\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u5f80\u5f80\u9084\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u76f8\u8f03\u65bc\u9078\u64c7\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u70ba\u5b83\u5011\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

\u90a3\u9ebc\uff0c\u6211\u5011\u4e0d\u7981\u767c\u554f\uff1a\u70ba\u4ec0\u9ebc\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c64\u908f\u8f2f\u662f\u4ec0\u9ebc\uff1f\u63db\u53e5\u8a71\u8aaa\uff0c\u5c07\u5927\u554f\u984c\u5206\u89e3\u70ba\u591a\u500b\u5b50\u554f\u984c\u3001\u89e3\u6c7a\u5b50\u554f\u984c\u3001\u5c07\u5b50\u554f\u984c\u7684\u89e3\u5408\u4f75\u70ba\u539f\u554f\u984c\u7684\u89e3\uff0c\u9019\u5e7e\u6b65\u7684\u6548\u7387\u70ba\u4ec0\u9ebc\u6bd4\u76f4\u63a5\u89e3\u6c7a\u539f\u554f\u984c\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u9019\u500b\u554f\u984c\u53ef\u4ee5\u5f9e\u64cd\u4f5c\u6578\u91cf\u548c\u5e73\u884c\u8a08\u7b97\u5169\u65b9\u9762\u4f86\u8a0e\u8ad6\u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6578\u91cf\u6700\u4f73\u5316","text":"

\u4ee5\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u70ba\u4f8b\uff0c\u5176\u8655\u7406\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u9700\u8981 \\(O(n^2)\\) \u6642\u9593\u3002\u5047\u8a2d\u6211\u5011\u6309\u7167\u5716 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u5247\u5283\u5206\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6bcf\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O((n / 2)^2)\\) \u6642\u9593\uff0c\u5408\u4f75\u5169\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

\\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

\u5716 12-2 \u00a0 \u5283\u5206\u9663\u5217\u524d\u5f8c\u7684\u6ce1\u6cab\u6392\u5e8f

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8a08\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u908a\u548c\u53f3\u908a\u5206\u5225\u70ba\u5283\u5206\u524d\u548c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u7e3d\u6578\uff1a

\\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

\u9019\u610f\u5473\u8457\u7576 \\(n > 4\\) \u6642\uff0c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u6578\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u61c9\u8a72\u66f4\u9ad8\u3002\u8acb\u6ce8\u610f\uff0c\u5283\u5206\u5f8c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u968e \\(O(n^2)\\) \uff0c\u53ea\u662f\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\u4e86\u3002

\u9032\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u5011\u628a\u5b50\u9663\u5217\u4e0d\u65b7\u5730\u518d\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u505c\u6b62\u5283\u5206\u5462\uff1f\u9019\u7a2e\u601d\u8def\u5be6\u969b\u4e0a\u5c31\u662f\u201c\u5408\u4f75\u6392\u5e8f\u201d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u5011\u591a\u8a2d\u5b9a\u5e7e\u500b\u5283\u5206\u9ede\uff0c\u5c07\u539f\u9663\u5217\u5e73\u5747\u5283\u5206\u70ba \\(k\\) \u500b\u5b50\u9663\u5217\u5462\uff1f\u9019\u7a2e\u60c5\u6cc1\u8207\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u985e\u4f3c\uff0c\u5b83\u975e\u5e38\u9069\u5408\u6392\u5e8f\u6d77\u91cf\u8cc7\u6599\uff0c\u7406\u8ad6\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230 \\(O(n + k)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e73\u884c\u8a08\u7b97\u6700\u4f73\u5316","text":"

\u6211\u5011\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u4e26\u884c\u89e3\u6c7a\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u9084\u6709\u5229\u65bc\u4f5c\u696d\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002

\u4e26\u884c\u6700\u4f73\u5316\u5728\u591a\u6838\u6216\u591a\u8655\u7406\u5668\u7684\u74b0\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u70ba\u7cfb\u7d71\u53ef\u4ee5\u540c\u6642\u8655\u7406\u591a\u500b\u5b50\u554f\u984c\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8a08\u7b97\u8cc7\u6e90\uff0c\u5f9e\u800c\u986f\u8457\u6e1b\u5c11\u7e3d\u9ad4\u7684\u57f7\u884c\u6642\u9593\u3002

\u6bd4\u5982\u5728\u5716 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u5011\u5c07\u6d77\u91cf\u7684\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u5247\u53ef\u5c07\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52d9\u5206\u6563\u5230\u5404\u500b\u8a08\u7b97\u55ae\u5143\uff0c\u5b8c\u6210\u5f8c\u518d\u5408\u4f75\u7d50\u679c\u3002

\u5716 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e73\u884c\u8a08\u7b97

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u898b\u61c9\u7528","text":"

\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u4f86\u89e3\u6c7a\u8a31\u591a\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\u3002

  • \u5c0b\u627e\u6700\u8fd1\u9ede\u5c0d\uff1a\u8a72\u6f14\u7b97\u6cd5\u9996\u5148\u5c07\u9ede\u96c6\u5206\u6210\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u5206\u5225\u627e\u51fa\u5169\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u9ede\u5c0d\uff0c\u6700\u5f8c\u627e\u51fa\u8de8\u8d8a\u5169\u90e8\u5206\u7684\u6700\u8fd1\u9ede\u5c0d\u3002
  • \u5927\u6574\u6578\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u6574\u6578\u4e58\u6cd5\u5206\u89e3\u70ba\u5e7e\u500b\u8f03\u5c0f\u7684\u6574\u6578\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u77e9\u9663\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u77e9\u9663\u4e58\u6cd5\u5206\u89e3\u70ba\u591a\u500b\u5c0f\u77e9\u9663\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u6cb3\u5167\u5854\u554f\u984c\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u89e3\u6c7a\uff0c\u9019\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u61c9\u7528\u3002
  • \u6c42\u89e3\u9006\u5e8f\u5c0d\uff1a\u5728\u4e00\u500b\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6578\u5b57\u5927\u65bc\u5f8c\u9762\u7684\u6578\u5b57\uff0c\u90a3\u9ebc\u9019\u5169\u500b\u6578\u5b57\u69cb\u6210\u4e00\u500b\u9006\u5e8f\u5c0d\u3002\u6c42\u89e3\u9006\u5e8f\u5c0d\u554f\u984c\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u85c9\u52a9\u5408\u4f75\u6392\u5e8f\u9032\u884c\u6c42\u89e3\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u8a2d\u8a08\u4e2d\u61c9\u7528\u5f97\u975e\u5e38\u5ee3\u6cdb\u3002

  • \u4e8c\u5206\u641c\u5c0b\uff1a\u4e8c\u5206\u641c\u5c0b\u662f\u5c07\u6709\u5e8f\u9663\u5217\u5f9e\u4e2d\u9ede\u7d22\u5f15\u8655\u5206\u70ba\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u6839\u64da\u76ee\u6a19\u503c\u8207\u4e2d\u9593\u5143\u7d20\u503c\u6bd4\u8f03\u7d50\u679c\uff0c\u6c7a\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u5340\u9593\uff0c\u4e26\u5728\u5269\u9918\u5340\u9593\u57f7\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
  • \u5408\u4f75\u6392\u5e8f\uff1a\u672c\u7bc0\u958b\u982d\u5df2\u4ecb\u7d39\uff0c\u4e0d\u518d\u8d05\u8ff0\u3002
  • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9078\u53d6\u4e00\u500b\u57fa\u6e96\u503c\uff0c\u7136\u5f8c\u628a\u9663\u5217\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u4e00\u500b\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5927\uff0c\u518d\u5c0d\u9019\u5169\u90e8\u5206\u9032\u884c\u76f8\u540c\u7684\u5283\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e0b\u4e00\u500b\u5143\u7d20\u3002
  • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c07\u8cc7\u6599\u5206\u6563\u5230\u591a\u500b\u6876\uff0c\u7136\u5f8c\u5c0d\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u5404\u500b\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u5f9e\u800c\u5f97\u5230\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002
  • \u6a39\uff1a\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u7d05\u9ed1\u6a39\u3001B \u6a39\u3001B+ \u6a39\u7b49\uff0c\u5b83\u5011\u7684\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u8996\u70ba\u5206\u6cbb\u7b56\u7565\u7684\u61c9\u7528\u3002
  • \u5806\u7a4d\uff1a\u5806\u7a4d\u662f\u4e00\u7a2e\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u5176\u5404\u7a2e\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u522a\u9664\u548c\u5806\u7a4d\u5316\uff0c\u5be6\u969b\u4e0a\u90fd\u96b1\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
  • \u96dc\u6e4a\u8868\uff1a\u96d6\u7136\u96dc\u6e4a\u8868\u4e26\u4e0d\u76f4\u63a5\u61c9\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u96dc\u6e4a\u885d\u7a81\u89e3\u6c7a\u65b9\u6848\u9593\u63a5\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u93c8\u5f0f\u4f4d\u5740\u4e2d\u7684\u9577\u93c8\u7d50\u4e32\u5217\u6703\u88ab\u8f49\u5316\u70ba\u7d05\u9ed1\u6a39\uff0c\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002

\u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u7a2e\u201c\u6f64\u7269\u7d30\u7121\u8072\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\uff0c\u96b1\u542b\u5728\u5404\u7a2e\u6f14\u7b97\u6cd5\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u4e2d\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c","text":"

\u5728\u5408\u4f75\u6392\u5e8f\u548c\u69cb\u5efa\u4e8c\u5143\u6a39\u4e2d\uff0c\u6211\u5011\u90fd\u662f\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u898f\u6a21\u70ba\u539f\u554f\u984c\u4e00\u534a\u7684\u5b50\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u6cb3\u5167\u5854\u554f\u984c\uff0c\u6211\u5011\u63a1\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

Question

\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8a18\u70ba A\u3001B \u548c C \u3002\u8d77\u59cb\u72c0\u614b\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u8457 \\(n\\) \u500b\u5713\u76e4\uff0c\u5b83\u5011\u5f9e\u4e0a\u5230\u4e0b\u6309\u7167\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u3002\u6211\u5011\u7684\u4efb\u52d9\u662f\u8981\u628a\u9019 \\(n\\) \u500b\u5713\u76e4\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u4e26\u4fdd\u6301\u5b83\u5011\u7684\u539f\u6709\u9806\u5e8f\u4e0d\u8b8a\uff08\u5982\u5716 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52d5\u5713\u76e4\u7684\u904e\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u898f\u5247\u3002

  1. \u5713\u76e4\u53ea\u80fd\u5f9e\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u62ff\u51fa\uff0c\u5f9e\u53e6\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u653e\u5165\u3002
  2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\u3002
  3. \u5c0f\u5713\u76e4\u5fc5\u9808\u6642\u523b\u4f4d\u65bc\u5927\u5713\u76e4\u4e4b\u4e0a\u3002

\u5716 12-10 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u793a\u4f8b

\u6211\u5011\u5c07\u898f\u6a21\u70ba \\(i\\) \u7684\u6cb3\u5167\u5854\u554f\u984c\u8a18\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c07 \\(3\\) \u500b\u5713\u76e4\u5f9e A \u79fb\u52d5\u81f3 C \u7684\u6cb3\u5167\u5854\u554f\u984c\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u616e\u57fa\u672c\u60c5\u6cc1","text":"

\u5982\u5716 12-11 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(1)\\) \uff0c\u5373\u7576\u53ea\u6709\u4e00\u500b\u5713\u76e4\u6642\uff0c\u6211\u5011\u5c07\u5b83\u76f4\u63a5\u5f9e A \u79fb\u52d5\u81f3 C \u5373\u53ef\u3002

<1><2>

\u5716 12-11 \u00a0 \u898f\u6a21\u70ba 1 \u7684\u554f\u984c\u7684\u89e3

\u5982\u5716 12-12 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(2)\\) \uff0c\u5373\u7576\u6709\u5169\u500b\u5713\u76e4\u6642\uff0c\u7531\u65bc\u8981\u6642\u523b\u6eff\u8db3\u5c0f\u5713\u76e4\u5728\u5927\u5713\u76e4\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u85c9\u52a9 B \u4f86\u5b8c\u6210\u79fb\u52d5\u3002

  1. \u5148\u5c07\u4e0a\u9762\u7684\u5c0f\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
  2. \u518d\u5c07\u5927\u5713\u76e4\u5f9e A \u79fb\u81f3 C \u3002
  3. \u6700\u5f8c\u5c07\u5c0f\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u5716 12-12 \u00a0 \u898f\u6a21\u70ba 2 \u7684\u554f\u984c\u7684\u89e3

\u89e3\u6c7a\u554f\u984c \\(f(2)\\) \u7684\u904e\u7a0b\u53ef\u7e3d\u7d50\u70ba\uff1a\u5c07\u5169\u500b\u5713\u76e4\u85c9\u52a9 B \u5f9e A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u7a31\u70ba\u76ee\u6a19\u67f1\u3001B \u7a31\u70ba\u7de9\u885d\u67f1\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u554f\u984c\u5206\u89e3","text":"

\u5c0d\u65bc\u554f\u984c \\(f(3)\\) \uff0c\u5373\u7576\u6709\u4e09\u500b\u5713\u76e4\u6642\uff0c\u60c5\u6cc1\u8b8a\u5f97\u7a0d\u5fae\u8907\u96dc\u4e86\u4e00\u4e9b\u3002

\u56e0\u70ba\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u5011\u53ef\u5f9e\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c07 A \u9802\u90e8\u7684\u5169\u500b\u5713\u76e4\u770b\u4f5c\u4e00\u500b\u6574\u9ad4\uff0c\u57f7\u884c\u5716 12-13 \u6240\u793a\u7684\u6b65\u9a5f\u3002\u9019\u6a23\u4e09\u500b\u5713\u76e4\u5c31\u88ab\u9806\u5229\u5730\u5f9e A \u79fb\u81f3 C \u4e86\u3002

  1. \u4ee4 B \u70ba\u76ee\u6a19\u67f1\u3001C \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
  2. \u5c07 A \u4e2d\u5269\u9918\u7684\u4e00\u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u52d5\u81f3 C \u3002
  3. \u4ee4 C \u70ba\u76ee\u6a19\u67f1\u3001A \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u5716 12-13 \u00a0 \u898f\u6a21\u70ba 3 \u7684\u554f\u984c\u7684\u89e3

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u5c07\u554f\u984c \\(f(3)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(2)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u4e4b\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002\u9019\u8aaa\u660e\u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u4f75\u3002

\u81f3\u6b64\uff0c\u6211\u5011\u53ef\u7e3d\u7d50\u51fa\u5716 12-14 \u6240\u793a\u7684\u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c07\u539f\u554f\u984c \\(f(n)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \uff0c\u4e26\u6309\u7167\u4ee5\u4e0b\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u3002

  1. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 C \u5f9e A \u79fb\u81f3 B \u3002
  2. \u5c07\u5269\u9918 \\(1\\) \u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u81f3 C \u3002
  3. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 A \u5f9e B \u79fb\u81f3 C \u3002

\u5c0d\u65bc\u9019\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u900f\u904e\u76f8\u540c\u7684\u65b9\u5f0f\u9032\u884c\u905e\u8ff4\u5283\u5206\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52d5\u64cd\u4f5c\u5373\u53ef\u3002

\u5716 12-14 \u00a0 \u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c07\u67f1 src \u9802\u90e8\u7684 \\(i\\) \u500b\u5713\u76e4\u85c9\u52a9\u7de9\u885d\u67f1 buf \u79fb\u52d5\u81f3\u76ee\u6a19\u67f1 tar \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52d5\u4e00\u500b\u5713\u76e4\"\"\"\n    # \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan = src.pop()\n    # \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c\"\"\"\n    n = len(A)\n    # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
hanota.cpp
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src.back();\n    src.pop_back();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.java
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.cs
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
hanota.go
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src, tar *list.List) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan := src.Back()\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9802\u90e8\u5713\u76e4\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
hanota.swift
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.popLast()!\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u4e32\u5217\u5c3e\u90e8\u662f\u67f1\u5b50\u9802\u90e8\n    // \u5c07 src \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
hanota.js
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src, tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.ts
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src: number[], tar: number[]): void {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.dart
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<int> src, List<int> tar) {\n  // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n  int pan = src.removeLast();\n  // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
hanota.rs
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.remove(src.len() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.c
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
hanota.kt
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    val pan = src.removeAt(src.size - 1)\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
hanota.rb
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
hanota.zig
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 12-15 \u6240\u793a\uff0c\u6cb3\u5167\u5854\u554f\u984c\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5c0d\u61c9\u4e00\u500b\u958b\u555f\u7684 dfs() \u51fd\u5f0f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u5716 12-15 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u7684\u905e\u8ff4\u6a39

Quote

\u6cb3\u5167\u5854\u554f\u984c\u6e90\u81ea\u4e00\u500b\u53e4\u8001\u7684\u50b3\u8aaa\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u500b\u5bfa\u5edf\u88e1\uff0c\u50e7\u4fb6\u5011\u6709\u4e09\u6839\u9ad8\u5927\u7684\u947d\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u500b\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5713\u76e4\u3002\u50e7\u4fb6\u5011\u4e0d\u65b7\u5730\u79fb\u52d5\u5713\u76e4\uff0c\u4ed6\u5011\u76f8\u4fe1\u5728\u6700\u5f8c\u4e00\u500b\u5713\u76e4\u88ab\u6b63\u78ba\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u9019\u500b\u4e16\u754c\u5c31\u6703\u7d50\u675f\u3002

\u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fb6\u5011\u6bcf\u79d2\u9418\u79fb\u52d5\u4e00\u6b21\uff0c\u7e3d\u5171\u9700\u8981\u5927\u7d04 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7d04 \\(5850\\) \u5104\u5e74\uff0c\u9060\u9060\u8d85\u904e\u4e86\u73fe\u5728\u5c0d\u5b87\u5b99\u5e74\u9f61\u7684\u4f30\u8a08\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u9019\u500b\u50b3\u8aaa\u662f\u771f\u7684\uff0c\u6211\u5011\u61c9\u8a72\u4e0d\u9700\u8981\u64d4\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u4f86\u3002

"},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7d50","text":"
  • \u5206\u6cbb\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u8a2d\u8a08\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5283\u5206\uff09\u548c\u6cbb\uff08\u5408\u4f75\uff09\u5169\u500b\u968e\u6bb5\uff0c\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002
  • \u5224\u65b7\u662f\u5426\u662f\u5206\u6cbb\u6f14\u7b97\u6cd5\u554f\u984c\u7684\u4f9d\u64da\u5305\u62ec\uff1a\u554f\u984c\u80fd\u5426\u5206\u89e3\u3001\u5b50\u554f\u984c\u662f\u5426\u7368\u7acb\u3001\u5b50\u554f\u984c\u80fd\u5426\u5408\u4f75\u3002
  • \u5408\u4f75\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\uff0c\u5176\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5283\u5206\u70ba\u7b49\u9577\u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u958b\u59cb\u9010\u5c64\u5408\u4f75\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002
  • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u6e1b\u5c11\u4e86\u64cd\u4f5c\u6578\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5f8c\u6709\u5229\u65bc\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002
  • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u6c7a\u8a31\u591a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u4e5f\u5ee3\u6cdb\u61c9\u7528\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u8655\u8655\u53ef\u898b\u5176\u8eab\u5f71\u3002
  • \u76f8\u8f03\u65bc\u66b4\u529b\u641c\u5c0b\uff0c\u81ea\u9069\u61c9\u641c\u5c0b\u6548\u7387\u66f4\u9ad8\u3002\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\u3002
  • \u4e8c\u5206\u641c\u5c0b\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u500b\u5178\u578b\u61c9\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u7684\u6b65\u9a5f\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b\u3002
  • \u5728\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u554f\u984c\u4e2d\uff0c\u69cb\u5efa\u6a39\uff08\u539f\u554f\u984c\uff09\u53ef\u4ee5\u5283\u5206\u70ba\u69cb\u5efa\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5283\u5206\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u7684\u7d22\u5f15\u5340\u9593\u4f86\u5be6\u73fe\u3002
  • \u5728\u6cb3\u5167\u5854\u554f\u984c\u4e2d\uff0c\u4e00\u500b\u898f\u6a21\u70ba \\(n\\) \u7684\u554f\u984c\u53ef\u4ee5\u5283\u5206\u70ba\u5169\u500b\u898f\u6a21\u70ba \\(n-1\\) \u7684\u5b50\u554f\u984c\u548c\u4e00\u500b\u898f\u6a21\u70ba \\(1\\) \u7684\u5b50\u554f\u984c\u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002
"},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52d5\u614b\u898f\u5283","text":"

Abstract

\u5c0f\u6eaa\u532f\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u532f\u5165\u5927\u6d77\u3002

\u52d5\u614b\u898f\u5283\u5c07\u5c0f\u554f\u984c\u7684\u89e3\u5f59\u96c6\u6210\u5927\u554f\u984c\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9818\u6211\u5011\u8d70\u5411\u89e3\u6c7a\u554f\u984c\u7684\u5f7c\u5cb8\u3002

"},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283
  • 14.2 \u00a0 DP \u554f\u984c\u7279\u6027
  • 14.3 \u00a0 DP \u89e3\u984c\u601d\u8def
  • 14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c
  • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c
  • 14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c
  • 14.7 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52d5\u614b\u898f\u5283\u554f\u984c\u7279\u6027","text":"

\u5728\u4e0a\u4e00\u7bc0\u4e2d\uff0c\u6211\u5011\u5b78\u7fd2\u4e86\u52d5\u614b\u898f\u5283\u662f\u5982\u4f55\u900f\u904e\u5b50\u554f\u984c\u5206\u89e3\u4f86\u6c42\u89e3\u539f\u554f\u984c\u7684\u3002\u5be6\u969b\u4e0a\uff0c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u7684\u5074\u91cd\u9ede\u4e0d\u540c\u3002

  • \u5206\u6cbb\u6f14\u7b97\u6cd5\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u591a\u500b\u76f8\u4e92\u7368\u7acb\u7684\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u554f\u984c\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\uff0c\u6700\u7d42\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
  • \u52d5\u614b\u898f\u5283\u4e5f\u5c0d\u554f\u984c\u9032\u884c\u905e\u8ff4\u5206\u89e3\uff0c\u4f46\u8207\u5206\u6cbb\u6f14\u7b97\u6cd5\u7684\u4e3b\u8981\u5340\u5225\u662f\uff0c\u52d5\u614b\u898f\u5283\u4e2d\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u4f9d\u8cf4\u7684\uff0c\u5728\u5206\u89e3\u904e\u7a0b\u4e2d\u6703\u51fa\u73fe\u8a31\u591a\u91cd\u758a\u5b50\u554f\u984c\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u5728\u5617\u8a66\u548c\u56de\u9000\u4e2d\u7aae\u8209\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u4e26\u900f\u904e\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\u3002\u539f\u554f\u984c\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\u69cb\u6210\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6bcf\u500b\u6c7a\u7b56\u6b65\u9a5f\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u500b\u5b50\u554f\u984c\u3002

\u5be6\u969b\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u5e38\u7528\u4f86\u6c42\u89e3\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5b83\u5011\u4e0d\u50c5\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u9084\u5177\u6709\u53e6\u5916\u5169\u5927\u7279\u6027\uff1a\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb","text":"

\u6211\u5011\u5c0d\u722c\u6a13\u68af\u554f\u984c\u7a0d\u4f5c\u6539\u52d5\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9069\u5408\u5c55\u793a\u6700\u512a\u5b50\u7d50\u69cb\u6982\u5ff5\u3002

\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9

\u7d66\u5b9a\u4e00\u500b\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u6bcf\u4e00\u968e\u6a13\u68af\u4e0a\u90fd\u8cbc\u6709\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u4f60\u5728\u8a72\u81fa\u968e\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\u3002\u7d66\u5b9a\u4e00\u500b\u975e\u8ca0\u6574\u6578\u9663\u5217 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u500b\u81fa\u968e\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\\(cost[0]\\) \u70ba\u5730\u9762\uff08\u8d77\u59cb\u9ede\uff09\u3002\u8acb\u8a08\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u50f9\u624d\u80fd\u5230\u9054\u9802\u90e8\uff1f

\u5982\u5716 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u968e\u7684\u4ee3\u50f9\u5206\u5225\u70ba \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5247\u5f9e\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u968e\u7684\u6700\u5c0f\u4ee3\u50f9\u70ba \\(2\\) \u3002

\u5716 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u6700\u5c0f\u4ee3\u50f9

\u8a2d \\(dp[i]\\) \u70ba\u722c\u5230\u7b2c \\(i\\) \u968e\u7d2f\u8a08\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\u7531\u65bc\u7b2c \\(i\\) \u968e\u53ea\u53ef\u80fd\u5f9e \\(i - 1\\) \u968e\u6216 \\(i - 2\\) \u968e\u8d70\u4f86\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u65bc \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u70ba\u4e86\u5118\u53ef\u80fd\u6e1b\u5c11\u4ee3\u50f9\uff0c\u6211\u5011\u61c9\u8a72\u9078\u64c7\u5169\u8005\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\uff1a

\\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

\u9019\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u7684\u542b\u7fa9\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u662f\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\u7684\u3002

\u672c\u984c\u986f\u7136\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6211\u5011\u5f9e\u5169\u500b\u5b50\u554f\u984c\u6700\u512a\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9078\u51fa\u8f03\u512a\u7684\u90a3\u4e00\u500b\uff0c\u4e26\u7528\u5b83\u69cb\u5efa\u51fa\u539f\u554f\u984c \\(dp[i]\\) \u7684\u6700\u512a\u89e3\u3002

\u90a3\u9ebc\uff0c\u4e0a\u4e00\u7bc0\u7684\u722c\u6a13\u68af\u984c\u76ee\u6709\u6c92\u6709\u6700\u512a\u5b50\u7d50\u69cb\u5462\uff1f\u5b83\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u500b\u8a08\u6578\u554f\u984c\uff0c\u4f46\u5982\u679c\u63db\u4e00\u7a2e\u554f\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6578\u91cf\u201d\u3002\u6211\u5011\u610f\u5916\u5730\u767c\u73fe\uff0c\u96d6\u7136\u984c\u76ee\u4fee\u6539\u524d\u5f8c\u662f\u7b49\u50f9\u7684\uff0c\u4f46\u6700\u512a\u5b50\u7d50\u69cb\u6d6e\u73fe\u51fa\u4f86\u4e86\uff1a\u7b2c \\(n\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u7b49\u65bc\u7b2c \\(n-1\\) \u968e\u548c\u7b2c \\(n-2\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8aaa\uff0c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u89e3\u91cb\u65b9\u5f0f\u6bd4\u8f03\u9748\u6d3b\uff0c\u5728\u4e0d\u540c\u554f\u984c\u4e2d\u6703\u6709\u4e0d\u540c\u7684\u542b\u7fa9\u3002

\u6839\u64da\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72c0\u614b \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f97\u5230\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\u3002

\u5716 14-7 \u00a0 \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u672c\u984c\u4e5f\u53ef\u4ee5\u9032\u884c\u7a7a\u9593\u6700\u4f73\u5316\uff0c\u5c07\u4e00\u7dad\u58d3\u7e2e\u81f3\u96f6\u7dad\uff0c\u4f7f\u5f97\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u7121\u5f8c\u6548\u6027","text":"

\u7121\u5f8c\u6548\u6027\u662f\u52d5\u614b\u898f\u5283\u80fd\u5920\u6709\u6548\u89e3\u6c7a\u554f\u984c\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u7fa9\u70ba\uff1a\u7d66\u5b9a\u4e00\u500b\u78ba\u5b9a\u7684\u72c0\u614b\uff0c\u5b83\u7684\u672a\u4f86\u767c\u5c55\u53ea\u8207\u7576\u524d\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002

\u4ee5\u722c\u6a13\u68af\u554f\u984c\u70ba\u4f8b\uff0c\u7d66\u5b9a\u72c0\u614b \\(i\\) \uff0c\u5b83\u6703\u767c\u5c55\u51fa\u72c0\u614b \\(i+1\\) \u548c\u72c0\u614b \\(i+2\\) \uff0c\u5206\u5225\u5c0d\u61c9\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u9019\u5169\u7a2e\u9078\u64c7\u6642\uff0c\u6211\u5011\u7121\u9808\u8003\u616e\u72c0\u614b \\(i\\) \u4e4b\u524d\u7684\u72c0\u614b\uff0c\u5b83\u5011\u5c0d\u72c0\u614b \\(i\\) \u7684\u672a\u4f86\u6c92\u6709\u5f71\u97ff\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u7d66\u722c\u6a13\u68af\u554f\u984c\u65b0\u589e\u4e00\u500b\u7d04\u675f\uff0c\u60c5\u6cc1\u5c31\u4e0d\u4e00\u6a23\u4e86\u3002

\u5e36\u7d04\u675f\u722c\u6a13\u68af

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u4f46\u4e0d\u80fd\u9023\u7e8c\u5169\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5982\u5716 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u968e\u50c5\u5269 \\(2\\) \u7a2e\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u9023\u7e8c\u4e09\u6b21\u8df3 \\(1\\) \u968e\u7684\u65b9\u6848\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\uff0c\u56e0\u6b64\u88ab\u6368\u68c4\u3002

\u5716 14-8 \u00a0 \u5e36\u7d04\u675f\u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

\u5728\u8a72\u554f\u984c\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\uff0c\u90a3\u9ebc\u4e0b\u4e00\u8f2a\u5c31\u5fc5\u9808\u8df3 \\(2\\) \u968e\u3002\u9019\u610f\u5473\u8457\uff0c\u4e0b\u4e00\u6b65\u9078\u64c7\u4e0d\u80fd\u7531\u7576\u524d\u72c0\u614b\uff08\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u7368\u7acb\u6c7a\u5b9a\uff0c\u9084\u548c\u524d\u4e00\u500b\u72c0\u614b\uff08\u4e0a\u4e00\u8f2a\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u6709\u95dc\u3002

\u4e0d\u96e3\u767c\u73fe\uff0c\u6b64\u554f\u984c\u5df2\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u70ba \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8a31\u591a\u201c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\u201d\u65b9\u6848\uff0c\u800c\u70ba\u4e86\u6eff\u8db3\u7d04\u675f\uff0c\u6211\u5011\u5c31\u4e0d\u80fd\u5c07 \\(dp[i-1]\\) \u76f4\u63a5\u8a08\u5165 \\(dp[i]\\) \u4e2d\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u9700\u8981\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff1a\u72c0\u614b \\([i, j]\\) \u8868\u793a\u8655\u5728\u7b2c \\(i\\) \u968e\u4e26\u4e14\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(j\\) \u968e\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72c0\u614b\u5b9a\u7fa9\u6709\u6548\u5730\u5340\u5206\u4e86\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u9084\u662f \\(2\\) \u968e\uff0c\u6211\u5011\u53ef\u4ee5\u64da\u6b64\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5f9e\u4f55\u800c\u4f86\u7684\u3002

  • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ea\u80fd\u9078\u64c7\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u5f9e \\(dp[i-1, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002
  • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(2\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ef\u9078\u64c7\u8df3 \\(1\\) \u968e\u6216\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u5f9e \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002

\u5982\u5716 14-9 \u6240\u793a\uff0c\u5728\u8a72\u5b9a\u7fa9\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u65b9\u6848\u6578\u3002\u6b64\u6642\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

\u5716 14-9 \u00a0 \u8003\u616e\u7d04\u675f\u4e0b\u7684\u905e\u63a8\u95dc\u4fc2

\u6700\u7d42\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u5169\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
climbing_stairs_constraint_dp.cpp
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.java
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.cs
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
climbing_stairs_constraint_dp.go
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.swift
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.js
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.ts
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.dart
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.rs
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.c
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
climbing_stairs_constraint_dp.kt
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.rb
[class]{}-[func]{climbing_stairs_constraint_dp}\n
climbing_stairs_constraint_dp.zig
// \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u65bc\u50c5\u9700\u591a\u8003\u616e\u524d\u9762\u4e00\u500b\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u900f\u904e\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff0c\u4f7f\u5f97\u554f\u984c\u91cd\u65b0\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u554f\u984c\u5177\u6709\u975e\u5e38\u56b4\u91cd\u7684\u201c\u6709\u5f8c\u6548\u6027\u201d\u3002

\u722c\u6a13\u68af\u8207\u969c\u7919\u751f\u6210

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\u3002\u898f\u5b9a\u7576\u722c\u5230\u7b2c \\(i\\) \u968e\u6642\uff0c\u7cfb\u7d71\u81ea\u52d5\u6703\u5728\u7b2c \\(2i\\) \u968e\u4e0a\u653e\u4e0a\u969c\u7919\u7269\uff0c\u4e4b\u5f8c\u6240\u6709\u8f2a\u90fd\u4e0d\u5141\u8a31\u8df3\u5230\u7b2c \\(2i\\) \u968e\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u5169\u8f2a\u5206\u5225\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u968e\u4e0a\uff0c\u5247\u4e4b\u5f8c\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u968e\u4e0a\u3002\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5728\u9019\u500b\u554f\u984c\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8e8d\u4f9d\u8cf4\u904e\u53bb\u6240\u6709\u7684\u72c0\u614b\uff0c\u56e0\u70ba\u6bcf\u4e00\u6b21\u8df3\u8e8d\u90fd\u6703\u5728\u66f4\u9ad8\u7684\u968e\u68af\u4e0a\u8a2d\u5b9a\u969c\u7919\uff0c\u4e26\u5f71\u97ff\u672a\u4f86\u7684\u8df3\u8e8d\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u52d5\u614b\u898f\u5283\u5f80\u5f80\u96e3\u4ee5\u89e3\u6c7a\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u8907\u96dc\u7684\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff08\u4f8b\u5982\u65c5\u884c\u5546\u554f\u984c\uff09\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u555f\u767c\u5f0f\u641c\u5c0b\u3001\u907a\u50b3\u6f14\u7b97\u6cd5\u3001\u5f37\u5316\u5b78\u7fd2\u7b49\uff0c\u5f9e\u800c\u5728\u6709\u9650\u6642\u9593\u5167\u5f97\u5230\u53ef\u7528\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52d5\u614b\u898f\u5283\u89e3\u984c\u601d\u8def","text":"

\u4e0a\u5169\u7bc0\u4ecb\u7d39\u4e86\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4e3b\u8981\u7279\u5fb5\uff0c\u63a5\u4e0b\u4f86\u6211\u5011\u4e00\u8d77\u63a2\u7a76\u5169\u500b\u66f4\u52a0\u5be6\u7528\u7684\u554f\u984c\u3002

  1. \u5982\u4f55\u5224\u65b7\u4e00\u500b\u554f\u984c\u662f\u4e0d\u662f\u52d5\u614b\u898f\u5283\u554f\u984c\uff1f
  2. \u6c42\u89e3\u52d5\u614b\u898f\u5283\u554f\u984c\u8a72\u5f9e\u4f55\u8655\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9a5f\u662f\u4ec0\u9ebc\uff1f
"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u554f\u984c\u5224\u65b7","text":"

\u7e3d\u7684\u4f86\u8aaa\uff0c\u5982\u679c\u4e00\u500b\u554f\u984c\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u90a3\u9ebc\u5b83\u901a\u5e38\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u5011\u5f88\u96e3\u5f9e\u554f\u984c\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u9019\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u653e\u5bec\u689d\u4ef6\uff0c\u5148\u89c0\u5bdf\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7aae\u8209\uff09\u89e3\u6c7a\u3002

\u9069\u5408\u7528\u56de\u6eaf\u89e3\u6c7a\u7684\u554f\u984c\u901a\u5e38\u6eff\u8db3\u201c\u6c7a\u7b56\u6a39\u6a21\u578b\u201d\uff0c\u9019\u7a2e\u554f\u984c\u53ef\u4ee5\u4f7f\u7528\u6a39\u5f62\u7d50\u69cb\u4f86\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\uff0c\u6bcf\u4e00\u689d\u8def\u5f91\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\u3002

\u63db\u53e5\u8a71\u8aaa\uff0c\u5982\u679c\u554f\u984c\u5305\u542b\u660e\u78ba\u7684\u6c7a\u7b56\u6982\u5ff5\uff0c\u4e26\u4e14\u89e3\u662f\u900f\u904e\u4e00\u7cfb\u5217\u6c7a\u7b56\u7522\u751f\u7684\uff0c\u90a3\u9ebc\u5b83\u5c31\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u4f86\u89e3\u6c7a\u3002

\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u554f\u984c\u9084\u6709\u4e00\u4e9b\u5224\u65b7\u7684\u201c\u52a0\u5206\u9805\u201d\u3002

  • \u554f\u984c\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u6700\u4f73\u5316\u63cf\u8ff0\u3002
  • \u554f\u984c\u7684\u72c0\u614b\u80fd\u5920\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u3001\u591a\u7dad\u77e9\u9663\u6216\u6a39\u4f86\u8868\u793a\uff0c\u4e26\u4e14\u4e00\u500b\u72c0\u614b\u8207\u5176\u5468\u570d\u7684\u72c0\u614b\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\u3002

\u76f8\u61c9\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u6e1b\u5206\u9805\u201d\u3002

  • \u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u512a\u89e3\u3002
  • \u554f\u984c\u63cf\u8ff0\u4e2d\u6709\u660e\u986f\u7684\u6392\u5217\u7d44\u5408\u7684\u7279\u5fb5\uff0c\u9700\u8981\u8fd4\u56de\u5177\u9ad4\u7684\u591a\u500b\u65b9\u6848\u3002

\u5982\u679c\u4e00\u500b\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u4e26\u5177\u6709\u8f03\u70ba\u660e\u986f\u7684\u201c\u52a0\u5206\u9805\u201d\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5047\u8a2d\u5b83\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\uff0c\u4e26\u5728\u6c42\u89e3\u904e\u7a0b\u4e2d\u9a57\u8b49\u5b83\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u554f\u984c\u6c42\u89e3\u6b65\u9a5f","text":"

\u52d5\u614b\u898f\u5283\u7684\u89e3\u984c\u6d41\u7a0b\u6703\u56e0\u554f\u984c\u7684\u6027\u8cea\u548c\u96e3\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9a5f\uff1a\u63cf\u8ff0\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5c0e\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u7b49\u3002

\u70ba\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u984c\u6b65\u9a5f\uff0c\u6211\u5011\u4f7f\u7528\u4e00\u500b\u7d93\u5178\u554f\u984c\u201c\u6700\u5c0f\u8def\u5f91\u548c\u201d\u4f86\u8209\u4f8b\u3002

Question

\u7d66\u5b9a\u4e00\u500b \\(n \\times m\\) \u7684\u4e8c\u7dad\u7db2\u683c grid \uff0c\u7db2\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5305\u542b\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u8a72\u55ae\u5143\u683c\u7684\u4ee3\u50f9\u3002\u6a5f\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\u70ba\u8d77\u59cb\u9ede\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52d5\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u9054\u53f3\u4e0b\u89d2\u55ae\u5143\u683c\u3002\u8acb\u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f91\u548c\u3002

\u5716 14-10 \u5c55\u793a\u4e86\u4e00\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u7db2\u683c\u7684\u6700\u5c0f\u8def\u5f91\u548c\u70ba \\(13\\) \u3002

\u5716 14-10 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u793a\u4f8b\u8cc7\u6599

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u672c\u984c\u7684\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u5c31\u662f\u5f9e\u7576\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8a2d\u7576\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\([i, j]\\) \uff0c\u5247\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u5f8c\uff0c\u7d22\u5f15\u8b8a\u70ba \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72c0\u614b\u61c9\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u5169\u500b\u8b8a\u6578\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u5f9e\u8d77\u59cb\u9ede \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\uff0c\u89e3\u8a18\u70ba \\(dp[i, j]\\) \u3002

\u81f3\u6b64\uff0c\u6211\u5011\u5c31\u5f97\u5230\u4e86\u5716 14-11 \u6240\u793a\u7684\u4e8c\u7dad \\(dp\\) \u77e9\u9663\uff0c\u5176\u5c3a\u5bf8\u8207\u8f38\u5165\u7db2\u683c \\(grid\\) \u76f8\u540c\u3002

\u5716 14-11 \u00a0 \u72c0\u614b\u5b9a\u7fa9\u8207 dp \u8868

Note

\u52d5\u614b\u898f\u5283\u548c\u56de\u6eaf\u904e\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u70ba\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\uff0c\u800c\u72c0\u614b\u7531\u6240\u6709\u6c7a\u7b56\u8b8a\u6578\u69cb\u6210\u3002\u5b83\u61c9\u7576\u5305\u542b\u63cf\u8ff0\u89e3\u984c\u9032\u5ea6\u7684\u6240\u6709\u8b8a\u6578\uff0c\u5176\u5305\u542b\u4e86\u8db3\u5920\u7684\u8cc7\u8a0a\uff0c\u80fd\u5920\u7528\u4f86\u63a8\u5c0e\u51fa\u4e0b\u4e00\u500b\u72c0\u614b\u3002

\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\uff0c\u6211\u5011\u6703\u5b9a\u7fa9\u4e00\u500b \\(dp\\) \u8868\u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u72c0\u614b\u7684\u6bcf\u500b\u7368\u7acb\u8b8a\u6578\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\u3002\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72c0\u614b\u548c\u5b50\u554f\u984c\u7684\u89e3\u4e4b\u9593\u7684\u5c0d\u6620\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u5c0d\u65bc\u72c0\u614b \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u5f9e\u4e0a\u908a\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u908a\u683c\u5b50 \\([i, j-1]\\) \u8f49\u79fb\u800c\u4f86\u3002\u56e0\u6b64\u6700\u512a\u5b50\u7d50\u69cb\u70ba\uff1a\u5230\u9054 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u8207 \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\u6c7a\u5b9a\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u5716 14-12 \u6240\u793a\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

\u5716 14-12 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb\u8207\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

Note

\u6839\u64da\u5b9a\u7fa9\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u554f\u984c\u548c\u5b50\u554f\u984c\u7684\u95dc\u4fc2\uff0c\u627e\u51fa\u900f\u904e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u4f86\u69cb\u9020\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u512a\u5b50\u7d50\u69cb\u3002

\u4e00\u65e6\u6211\u5011\u627e\u5230\u4e86\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u5728\u672c\u984c\u4e2d\uff0c\u8655\u5728\u9996\u884c\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u5de6\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u8655\u5728\u9996\u5217\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u4e0a\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u908a\u754c\u689d\u4ef6\u3002

\u5982\u5716 14-13 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u6211\u5011\u4f7f\u7528\u8ff4\u5708\u4f86\u8d70\u8a2a\u77e9\u9663\uff0c\u5916\u8ff4\u5708\u8d70\u8a2a\u5404\u884c\uff0c\u5167\u8ff4\u5708\u8d70\u8a2a\u5404\u5217\u3002

\u5716 14-13 \u00a0 \u908a\u754c\u689d\u4ef6\u8207\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

Note

\u908a\u754c\u689d\u4ef6\u5728\u52d5\u614b\u898f\u5283\u4e2d\u7528\u65bc\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u5c0b\u4e2d\u7528\u65bc\u526a\u679d\u3002

\u72c0\u614b\u8f49\u79fb\u9806\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8b49\u5728\u8a08\u7b97\u7576\u524d\u554f\u984c\u7684\u89e3\u6642\uff0c\u6240\u6709\u5b83\u4f9d\u8cf4\u7684\u66f4\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u90fd\u5df2\u7d93\u88ab\u6b63\u78ba\u5730\u8a08\u7b97\u51fa\u4f86\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u5df2\u7d93\u53ef\u4ee5\u76f4\u63a5\u5beb\u51fa\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\u3002\u7136\u800c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u5c0b \\(\\rightarrow\\) \u8a18\u61b6\u5316\u641c\u5c0b \\(\\rightarrow\\) \u52d5\u614b\u898f\u5283\u201d\u7684\u9806\u5e8f\u5be6\u73fe\u66f4\u52a0\u7b26\u5408\u601d\u7dad\u7fd2\u6163\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u5f9e\u72c0\u614b \\([i, j]\\) \u958b\u59cb\u641c\u5c0b\uff0c\u4e0d\u65b7\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u72c0\u614b \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u905e\u8ff4\u51fd\u5f0f\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, j]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5f9e \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c \\(dp[i, j]\\) \u3002
  • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576 \\(i = 0\\) \u4e14 \\(j = 0\\) \u6642\uff0c\u8fd4\u56de\u4ee3\u50f9 \\(grid[0, 0]\\) \u3002
  • \u526a\u679d\uff1a\u7576 \\(i < 0\\) \u6642\u6216 \\(j < 0\\) \u6642\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u6642\u8fd4\u56de\u4ee3\u50f9 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.Min(left, up) + grid[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  return min(left, up) + grid[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-14 \u7d66\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u70ba\u6839\u7bc0\u9ede\u7684\u905e\u8ff4\u6a39\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5176\u6578\u91cf\u6703\u96a8\u8457\u7db2\u683c grid \u7684\u5c3a\u5bf8\u8b8a\u5927\u800c\u6025\u5287\u589e\u591a\u3002

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u758a\u5b50\u554f\u984c\u7684\u539f\u56e0\u70ba\uff1a\u5b58\u5728\u591a\u689d\u8def\u5f91\u53ef\u4ee5\u5f9e\u5de6\u4e0a\u89d2\u5230\u9054\u67d0\u4e00\u55ae\u5143\u683c\u3002

\u5716 14-14 \u00a0 \u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

\u6bcf\u500b\u72c0\u614b\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u5169\u7a2e\u9078\u64c7\uff0c\u5f9e\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u7e3d\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^{m + n})\\) \u3002\u8acb\u6ce8\u610f\uff0c\u9019\u7a2e\u8a08\u7b97\u65b9\u5f0f\u672a\u8003\u616e\u81e8\u8fd1\u7db2\u683c\u908a\u754c\u7684\u60c5\u6cc1\uff0c\u7576\u5230\u9054\u7db2\u8def\u908a\u754c\u6642\u53ea\u5269\u4e0b\u4e00\u7a2e\u9078\u64c7\uff0c\u56e0\u6b64\u5be6\u969b\u7684\u8def\u5f91\u6578\u91cf\u6703\u5c11\u4e00\u4e9b\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u6211\u5011\u5f15\u5165\u4e00\u500b\u548c\u7db2\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8a18\u61b6\u4e32\u5217 mem \uff0c\u7528\u65bc\u8a18\u9304\u5404\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5c07\u91cd\u758a\u5b50\u554f\u984c\u9032\u884c\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs_mem}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8a18\u61b6\u5316\u5f8c\uff0c\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u72c0\u614b\u7e3d\u6578\uff0c\u5373\u7db2\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

\u5716 14-15 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\u52d5\u614b\u898f\u5283\u89e3\u6cd5\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f91\u548c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\uff0c\u5176\u8d70\u8a2a\u4e86\u6574\u500b\u7db2\u683c\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

\u9663\u5217 dp \u5927\u5c0f\u70ba \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u5716 14-16 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u53ea\u8207\u5176\u5de6\u908a\u548c\u4e0a\u908a\u7684\u683c\u5b50\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u53ea\u7528\u4e00\u500b\u55ae\u884c\u9663\u5217\u4f86\u5be6\u73fe \\(dp\\) \u8868\u3002

\u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u9663\u5217 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72c0\u614b\uff0c\u6240\u4ee5\u6211\u5011\u7121\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72c0\u614b\uff0c\u800c\u662f\u5728\u8d70\u8a2a\u6bcf\u884c\u6642\u66f4\u65b0\u5b83\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ..< n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..<n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp_comp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c","text":"

\u7de8\u8f2f\u8ddd\u96e2\uff0c\u4e5f\u7a31 Levenshtein \u8ddd\u96e2\uff0c\u6307\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u4e92\u76f8\u8f49\u63db\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6578\uff0c\u901a\u5e38\u7528\u65bc\u5728\u8cc7\u8a0a\u6aa2\u7d22\u548c\u81ea\u7136\u8a9e\u8a00\u8655\u7406\u4e2d\u5ea6\u91cf\u5169\u500b\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

Question

\u8f38\u5165\u5169\u500b\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c07 \\(s\\) \u8f49\u63db\u70ba \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

\u4f60\u53ef\u4ee5\u5728\u4e00\u500b\u5b57\u4e32\u4e2d\u9032\u884c\u4e09\u7a2e\u7de8\u8f2f\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u500b\u5b57\u5143\u3001\u522a\u9664\u4e00\u500b\u5b57\u5143\u3001\u5c07\u5b57\u5143\u66ff\u63db\u70ba\u4efb\u610f\u4e00\u500b\u5b57\u5143\u3002

\u5982\u5716 14-27 \u6240\u793a\uff0c\u5c07 kitten \u8f49\u63db\u70ba sitting \u9700\u8981\u7de8\u8f2f 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u8207 1 \u6b21\u65b0\u589e\u64cd\u4f5c\uff1b\u5c07 hello \u8f49\u63db\u70ba algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u548c 1 \u6b21\u522a\u9664\u64cd\u4f5c\u3002

\u5716 14-27 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u793a\u4f8b\u8cc7\u6599

\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u6c7a\u7b56\u6a39\u6a21\u578b\u4f86\u89e3\u91cb\u3002\u5b57\u4e32\u5c0d\u61c9\u6a39\u7bc0\u9ede\uff0c\u4e00\u8f2a\u6c7a\u7b56\uff08\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\uff09\u5c0d\u61c9\u6a39\u7684\u4e00\u689d\u908a\u3002

\u5982\u5716 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u500b\u7bc0\u9ede\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8a31\u591a\u689d\u908a\uff0c\u6bcf\u689d\u908a\u5c0d\u61c9\u4e00\u7a2e\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u5f9e hello \u8f49\u63db\u5230 algo \u6709\u8a31\u591a\u7a2e\u53ef\u80fd\u7684\u8def\u5f91\u3002

\u5f9e\u6c7a\u7b56\u6a39\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u7bc0\u9ede hello \u548c\u7bc0\u9ede algo \u4e4b\u9593\u7684\u6700\u77ed\u8def\u5f91\u3002

\u5716 14-28 \u00a0 \u57fa\u65bc\u6c7a\u7b56\u6a39\u6a21\u578b\u8868\u793a\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u662f\u5c0d\u5b57\u4e32 \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\u3002

\u6211\u5011\u5e0c\u671b\u5728\u7de8\u8f2f\u64cd\u4f5c\u7684\u904e\u7a0b\u4e2d\uff0c\u554f\u984c\u7684\u898f\u6a21\u9010\u6f38\u7e2e\u5c0f\uff0c\u9019\u6a23\u624d\u80fd\u69cb\u5efa\u5b50\u554f\u984c\u3002\u8a2d\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \uff0c\u6211\u5011\u5148\u8003\u616e\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u5011\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u76f4\u63a5\u8003\u616e \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u5011\u9700\u8981\u5c0d \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\uff08\u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\uff09\uff0c\u4f7f\u5f97\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143\u76f8\u540c\uff0c\u5f9e\u800c\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u8003\u616e\u898f\u6a21\u66f4\u5c0f\u7684\u554f\u984c\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u5728\u5b57\u4e32 \\(s\\) \u4e2d\u9032\u884c\u7684\u6bcf\u4e00\u8f2a\u6c7a\u7b56\uff08\u7de8\u8f2f\u64cd\u4f5c\uff09\uff0c\u90fd\u6703\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u9918\u7684\u5f85\u5339\u914d\u5b57\u5143\u767c\u751f\u8b8a\u5316\u3002\u56e0\u6b64\uff0c\u72c0\u614b\u70ba\u7576\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u616e\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u500b\u5b57\u5143\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\uff1a\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

\u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u500b\u5c3a\u5bf8\u70ba \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u8003\u616e\u5b50\u554f\u984c \\(dp[i, j]\\) \uff0c\u5176\u5c0d\u61c9\u7684\u5169\u500b\u5b57\u4e32\u7684\u5c3e\u90e8\u5b57\u5143\u70ba \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u64da\u4e0d\u540c\u7de8\u8f2f\u64cd\u4f5c\u5206\u70ba\u5716 14-29 \u6240\u793a\u7684\u4e09\u7a2e\u60c5\u6cc1\u3002

  1. \u5728 \\(s[i-1]\\) \u4e4b\u5f8c\u65b0\u589e \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i, j-1]\\) \u3002
  2. \u522a\u9664 \\(s[i-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j]\\) \u3002
  3. \u5c07 \\(s[i-1]\\) \u66ff\u63db\u70ba \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j-1]\\) \u3002

\u5716 14-29 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u72c0\u614b\u8f49\u79fb

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u512a\u5b50\u7d50\u69cb\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7de8\u8f2f\u6b65\u6578 \\(1\\) \u3002\u5c0d\u61c9\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

\u8acb\u6ce8\u610f\uff0c\u7576 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\uff0c\u9019\u7a2e\u60c5\u6cc1\u4e0b\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, j] = dp[i-1, j-1] \\]

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u5169\u5b57\u4e32\u90fd\u70ba\u7a7a\u6642\uff0c\u7de8\u8f2f\u6b65\u6578\u70ba \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u7576 \\(s\\) \u70ba\u7a7a\u4f46 \\(t\\) \u4e0d\u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(t\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u7576 \\(s\\) \u4e0d\u70ba\u7a7a\u4f46 \\(t\\) \u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(s\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

\u89c0\u5bdf\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8cf4\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
edit_distance.cpp
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.java
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.cs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
edit_distance.go
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.swift
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.js
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.ts
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.dart
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
edit_distance.rs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
edit_distance.c
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
edit_distance.kt
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp}\n
edit_distance.zig
// \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-30 \u6240\u793a\uff0c\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\u8207\u80cc\u5305\u554f\u984c\u975e\u5e38\u985e\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5beb\u4e00\u500b\u4e8c\u7dad\u7db2\u683c\u7684\u904e\u7a0b\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u5716 14-30 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f49\u79fb\u800c\u4f86\u7684\uff0c\u800c\u6b63\u5e8f\u8d70\u8a2a\u6703\u4e1f\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u8d70\u8a2a\u7121\u6cd5\u63d0\u524d\u69cb\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u5169\u7a2e\u8d70\u8a2a\u9806\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 leftup \u4f86\u66ab\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u5f9e\u800c\u53ea\u9700\u8003\u616e\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u6642\u7684\u60c5\u6cc1\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u8d70\u8a2a\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n + 1):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    return dp[m]\n
edit_distance.cpp
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.java
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.cs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.go
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i := 1; i <= n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.swift
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ... n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.js
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.ts
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.dart
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
edit_distance.rs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..=n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
edit_distance.c
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
edit_distance.kt
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp_comp}\n
edit_distance.zig
// \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n + 1) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283","text":"

\u52d5\u614b\u898f\u5283\uff08dynamic programming\uff09\u662f\u4e00\u500b\u91cd\u8981\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\uff0c\u5b83\u5c07\u4e00\u500b\u554f\u984c\u5206\u89e3\u70ba\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u907f\u514d\u91cd\u8907\u8a08\u7b97\uff0c\u5f9e\u800c\u5927\u5e45\u63d0\u5347\u6642\u9593\u6548\u7387\u3002

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5f9e\u4e00\u500b\u7d93\u5178\u4f8b\u984c\u5165\u624b\uff0c\u5148\u7d66\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c0\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u518d\u9010\u6b65\u5c0e\u51fa\u66f4\u9ad8\u6548\u7684\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

\u722c\u6a13\u68af

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5982\u5716 14-1 \u6240\u793a\uff0c\u5c0d\u65bc\u4e00\u500b \\(3\\) \u968e\u6a13\u68af\uff0c\u5171\u6709 \\(3\\) \u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\u3002

\u5716 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u900f\u904e\u56de\u6eaf\u4f86\u7aae\u8209\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u5c07\u722c\u6a13\u68af\u60f3\u8c61\u70ba\u4e00\u500b\u591a\u8f2a\u9078\u64c7\u7684\u904e\u7a0b\uff1a\u5f9e\u5730\u9762\u51fa\u767c\uff0c\u6bcf\u8f2a\u9078\u64c7\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u6bcf\u7576\u5230\u9054\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u65b9\u6848\u6578\u91cf\u52a0 \\(1\\) \uff0c\u7576\u8d8a\u904e\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u5176\u526a\u679d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    state = 0  # \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
climbing_stairs_backtrack.cpp
/* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;                // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.java
/* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.cs
/* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.go
/* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state+choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    choices := []int{1, 2}\n    // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.swift
/* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
climbing_stairs_backtrack.js
/* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.ts
/* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.dart
/* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n    if (state + choice > n) continue;\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n  int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
climbing_stairs_backtrack.rs
/* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
climbing_stairs_backtrack.c
/* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;           // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
climbing_stairs_backtrack.kt
/* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    val state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
climbing_stairs_backtrack.zig
// \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u6a13\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    var state: i32 = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u4e26\u4e0d\u986f\u5f0f\u5730\u5c0d\u554f\u984c\u9032\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c07\u6c42\u89e3\u554f\u984c\u770b\u4f5c\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\uff0c\u900f\u904e\u8a66\u63a2\u548c\u526a\u679d\uff0c\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

\u6211\u5011\u53ef\u4ee5\u5617\u8a66\u5f9e\u554f\u984c\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u9019\u9053\u984c\u3002\u8a2d\u722c\u5230\u7b2c \\(i\\) \u968e\u5171\u6709 \\(dp[i]\\) \u7a2e\u65b9\u6848\uff0c\u90a3\u9ebc \\(dp[i]\\) \u5c31\u662f\u539f\u554f\u984c\uff0c\u5176\u5b50\u554f\u984c\u5305\u62ec\uff1a

\\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

\u7531\u65bc\u6bcf\u8f2a\u53ea\u80fd\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u56e0\u6b64\u7576\u6211\u5011\u7ad9\u5728\u7b2c \\(i\\) \u968e\u6a13\u68af\u4e0a\u6642\uff0c\u4e0a\u4e00\u8f2a\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u4e0a\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ea\u80fd\u5f9e\u7b2c \\(i -1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u9081\u5411\u7b2c \\(i\\) \u968e\u3002

\u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u63a8\u8ad6\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u968e\u7684\u65b9\u6848\u6578\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u968e\u7684\u65b9\u6848\u6578\u5c31\u7b49\u65bc\u722c\u5230\u7b2c \\(i\\) \u968e\u7684\u65b9\u6848\u6578\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

\\[ dp[i] = dp[i-1] + dp[i-2] \\]

\u9019\u610f\u5473\u8457\u5728\u722c\u6a13\u68af\u554f\u984c\u4e2d\uff0c\u5404\u500b\u5b50\u554f\u984c\u4e4b\u9593\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\uff0c\u539f\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u554f\u984c\u7684\u89e3\u69cb\u5efa\u5f97\u4f86\u3002\u5716 14-2 \u5c55\u793a\u4e86\u8a72\u905e\u63a8\u95dc\u4fc2\u3002

\u5716 14-2 \u00a0 \u65b9\u6848\u6578\u91cf\u905e\u63a8\u95dc\u4fc2

\u6211\u5011\u53ef\u4ee5\u6839\u64da\u905e\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u5c0b\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u905e\u8ff4\u5730\u5c07\u4e00\u500b\u8f03\u5927\u554f\u984c\u62c6\u89e3\u70ba\u5169\u500b\u8f03\u5c0f\u554f\u984c\u7684\u548c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c \\(dp[1]\\) \u548c \\(dp[2]\\) \u6642\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u968e\u5206\u5225\u6709 \\(1\\)\u3001\\(2\\) \u7a2e\u65b9\u6848\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5b83\u548c\u6a19\u6e96\u56de\u6eaf\u7a0b\u5f0f\u78bc\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u4f46\u66f4\u52a0\u7c21\u6f54\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
def dfs(i: int) -> int:\n    \"\"\"\u641c\u5c0b\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u641c\u5c0b\"\"\"\n    return dfs(n)\n
climbing_stairs_dfs.cpp
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.java
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.cs
/* \u641c\u5c0b */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
climbing_stairs_dfs.go
/* \u641c\u5c0b */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.swift
/* \u641c\u5c0b */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
climbing_stairs_dfs.js
/* \u641c\u5c0b */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.ts
/* \u641c\u5c0b */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
climbing_stairs_dfs.dart
/* \u641c\u5c0b */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
climbing_stairs_dfs.rs
/* \u641c\u5c0b */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
climbing_stairs_dfs.c
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.kt
/* \u641c\u5c0b */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
climbing_stairs_dfs.zig
// \u641c\u5c0b\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u641c\u5c0b\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u5c0b\u5f62\u6210\u7684\u905e\u8ff4\u6a39\u3002\u5c0d\u65bc\u554f\u984c \\(dp[n]\\) \uff0c\u5176\u905e\u8ff4\u6a39\u7684\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002\u6307\u6578\u968e\u5c6c\u65bc\u7206\u70b8\u5f0f\u589e\u9577\uff0c\u5982\u679c\u6211\u5011\u8f38\u5165\u4e00\u500b\u6bd4\u8f03\u5927\u7684 \\(n\\) \uff0c\u5247\u6703\u9677\u5165\u6f2b\u9577\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

\u5716 14-3 \u00a0 \u722c\u6a13\u68af\u5c0d\u61c9\u905e\u8ff4\u6a39

\u89c0\u5bdf\u5716 14-3 \uff0c\u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u201c\u91cd\u758a\u5b50\u554f\u984c\u201d\u5c0e\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u70ba \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u70ba \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u5169\u8005\u90fd\u5305\u542b\u5b50\u554f\u984c \\(dp[7]\\) \u3002

\u4ee5\u6b64\u985e\u63a8\uff0c\u5b50\u554f\u984c\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5b50\u5b50\u5b6b\u5b6b\u7121\u7aae\u76e1\u4e5f\u3002\u7d55\u5927\u90e8\u5206\u8a08\u7b97\u8cc7\u6e90\u90fd\u6d6a\u8cbb\u5728\u9019\u4e9b\u91cd\u758a\u7684\u5b50\u554f\u984c\u4e0a\u3002

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u70ba\u4e86\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u5011\u5e0c\u671b\u6240\u6709\u7684\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u9663\u5217 mem \u4f86\u8a18\u9304\u6bcf\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5c07\u91cd\u758a\u5b50\u554f\u984c\u526a\u679d\u3002

  1. \u7576\u9996\u6b21\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u5c07\u5176\u8a18\u9304\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u5f8c\u4f7f\u7528\u3002
  2. \u7576\u518d\u6b21\u9700\u8981\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u4fbf\u53ef\u76f4\u63a5\u5f9e mem[i] \u4e2d\u7372\u53d6\u7d50\u679c\uff0c\u5f9e\u800c\u907f\u514d\u91cd\u8907\u8a08\u7b97\u8a72\u5b50\u554f\u984c\u3002

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
climbing_stairs_dfs_mem.cpp
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.java
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.cs
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
climbing_stairs_dfs_mem.go
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
climbing_stairs_dfs_mem.swift
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
climbing_stairs_dfs_mem.js
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.ts
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.dart
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8a18\u9304 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.rs
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
climbing_stairs_dfs_mem.c
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
climbing_stairs_dfs_mem.kt
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
climbing_stairs_dfs_mem.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
climbing_stairs_dfs_mem.zig
// \u8a18\u61b6\u5316\u641c\u5c0b\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u5716 14-4 \uff0c\u7d93\u904e\u8a18\u61b6\u5316\u8655\u7406\u5f8c\uff0c\u6240\u6709\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u9019\u662f\u4e00\u500b\u5de8\u5927\u7684\u98db\u8e8d\u3002

\u5716 14-4 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u5c0d\u61c9\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u201c\u5f9e\u9802\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u5011\u5f9e\u539f\u554f\u984c\uff08\u6839\u7bc0\u9ede\uff09\u958b\u59cb\uff0c\u905e\u8ff4\u5730\u5c07\u8f03\u5927\u5b50\u554f\u984c\u5206\u89e3\u70ba\u8f03\u5c0f\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u554f\u984c\uff08\u8449\u7bc0\u9ede\uff09\u3002\u4e4b\u5f8c\uff0c\u900f\u904e\u56de\u6eaf\u9010\u5c64\u6536\u96c6\u5b50\u554f\u984c\u7684\u89e3\uff0c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

\u8207\u4e4b\u76f8\u53cd\uff0c\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u7684\u65b9\u6cd5\uff1a\u5f9e\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u958b\u59cb\uff0c\u8fed\u4ee3\u5730\u69cb\u5efa\u66f4\u5927\u5b50\u554f\u984c\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002

\u7531\u65bc\u52d5\u614b\u898f\u5283\u4e0d\u5305\u542b\u56de\u6eaf\u904e\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u8ff4\u5708\u8fed\u4ee3\u5be6\u73fe\uff0c\u7121\u9808\u4f7f\u7528\u905e\u8ff4\u3002\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u521d\u59cb\u5316\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u8207\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u9663\u5217 mem \u76f8\u540c\u7684\u8a18\u9304\u4f5c\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.java
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.go
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.js
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
climbing_stairs_dp.c
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp}\n
climbing_stairs_dp.zig
// \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-5 \u6a21\u64ec\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\u3002

\u5716 14-5 \u00a0 \u722c\u6a13\u68af\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u8207\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u52d5\u614b\u898f\u5283\u4e5f\u4f7f\u7528\u201c\u72c0\u614b\u201d\u6982\u5ff5\u4f86\u8868\u793a\u554f\u984c\u6c42\u89e3\u7684\u7279\u5b9a\u968e\u6bb5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\u4ee5\u53ca\u76f8\u61c9\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u6a13\u68af\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578 \\(i\\) \u3002

\u6839\u64da\u4ee5\u4e0a\u5167\u5bb9\uff0c\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u52d5\u614b\u898f\u5283\u7684\u5e38\u7528\u8853\u8a9e\u3002

  • \u5c07\u9663\u5217 dp \u7a31\u70ba dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72c0\u614b \\(i\\) \u5c0d\u61c9\u5b50\u554f\u984c\u7684\u89e3\u3002
  • \u5c07\u6700\u5c0f\u5b50\u554f\u984c\u5c0d\u61c9\u7684\u72c0\u614b\uff08\u7b2c \\(1\\) \u968e\u548c\u7b2c \\(2\\) \u968e\u6a13\u68af\uff09\u7a31\u70ba\u521d\u59cb\u72c0\u614b\u3002
  • \u5c07\u905e\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u7a31\u70ba\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002
"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u7531\u65bc \\(dp[i]\\) \u53ea\u8207 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u7121\u9808\u4f7f\u7528\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u800c\u53ea\u9700\u5169\u500b\u8b8a\u6578\u6efe\u52d5\u524d\u9032\u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.java
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.go
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
climbing_stairs_dp.js
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
climbing_stairs_dp.c
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp_comp}\n
climbing_stairs_dp.zig
// \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7531\u65bc\u7701\u53bb\u4e86\u9663\u5217 dp \u4f54\u7528\u7684\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

\u5728\u52d5\u614b\u898f\u5283\u554f\u984c\u4e2d\uff0c\u7576\u524d\u72c0\u614b\u5f80\u5f80\u50c5\u8207\u524d\u9762\u6709\u9650\u500b\u72c0\u614b\u6709\u95dc\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72c0\u614b\uff0c\u900f\u904e\u201c\u964d\u7dad\u201d\u4f86\u7bc0\u7701\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u9019\u7a2e\u7a7a\u9593\u6700\u4f73\u5316\u6280\u5de7\u88ab\u7a31\u70ba\u201c\u6efe\u52d5\u8b8a\u6578\u201d\u6216\u201c\u6efe\u52d5\u9663\u5217\u201d\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c","text":"

\u80cc\u5305\u554f\u984c\u662f\u4e00\u500b\u975e\u5e38\u597d\u7684\u52d5\u614b\u898f\u5283\u5165\u9580\u984c\u76ee\uff0c\u662f\u52d5\u614b\u898f\u5283\u4e2d\u6700\u5e38\u898b\u7684\u554f\u984c\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u554f\u984c\u3001\u5b8c\u5168\u80cc\u5305\u554f\u984c\u3001\u591a\u91cd\u80cc\u5305\u554f\u984c\u7b49\u3002

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u4f86\u6c42\u89e3\u6700\u5e38\u898b\u7684 0-1 \u80cc\u5305\u554f\u984c\u3002

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002

\u89c0\u5bdf\u5716 14-17 \uff0c\u7531\u65bc\u7269\u54c1\u7de8\u865f \\(i\\) \u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\uff0c\u9663\u5217\u7d22\u5f15\u5f9e \\(0\\) \u958b\u59cb\u8a08\u6578\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5c0d\u61c9\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u50f9\u503c \\(val[i-1]\\) \u3002

\u5716 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u8cc7\u6599

\u6211\u5011\u53ef\u4ee5\u5c07 0-1 \u80cc\u5305\u554f\u984c\u770b\u4f5c\u4e00\u500b\u7531 \\(n\\) \u8f2a\u6c7a\u7b56\u7d44\u6210\u7684\u904e\u7a0b\uff0c\u5c0d\u65bc\u6bcf\u500b\u7269\u9ad4\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u5169\u7a2e\u6c7a\u7b56\uff0c\u56e0\u6b64\u8a72\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\u3002

\u8a72\u554f\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u201d\uff0c\u56e0\u6b64\u8f03\u5927\u6a5f\u7387\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u5c0d\u65bc\u6bcf\u500b\u7269\u54c1\u4f86\u8aaa\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72c0\u614b\u5b9a\u7fa9\uff1a\u7576\u524d\u7269\u54c1\u7de8\u865f \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8a18\u70ba \\([i, c]\\) \u3002

\u72c0\u614b \\([i, c]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\uff0c\u8a18\u70ba \\(dp[i, c]\\) \u3002

\u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u500b\u5c3a\u5bf8\u70ba \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u7576\u6211\u5011\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u6c7a\u7b56\u5f8c\uff0c\u5269\u9918\u7684\u662f\u524d \\(i-1\\) \u500b\u7269\u54c1\u6c7a\u7b56\u7684\u5b50\u554f\u984c\uff0c\u53ef\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c11 \\(wgt[i-1]\\) \uff0c\u50f9\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c-wgt[i-1]]\\) \u3002

\u4e0a\u8ff0\u5206\u6790\u5411\u6211\u5011\u63ed\u793a\u4e86\u672c\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6700\u5927\u50f9\u503c \\(dp[i, c]\\) \u7b49\u65bc\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\u3002\u7531\u6b64\u53ef\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u9918\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u7121\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u70ba \\(0\\) \u6642\u6700\u5927\u50f9\u503c\u70ba \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

\u7576\u524d\u72c0\u614b \\([i, c]\\) \u5f9e\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c-wgt[i-1]]\\) \u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u6309\u9806\u5e8f\u5be6\u73fe\u66b4\u529b\u641c\u5c0b\u3001\u8a18\u61b6\u5316\u641c\u5c0b\u3001\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u641c\u5c0b\u7a0b\u5f0f\u78bc\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, c]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5b50\u554f\u984c\u7684\u89e3 \\(dp[i, c]\\) \u3002
  • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576\u7269\u54c1\u7de8\u865f\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u9918\u5bb9\u91cf\u70ba \\(0\\) \u6642\uff0c\u7d42\u6b62\u905e\u8ff4\u4e26\u8fd4\u56de\u50f9\u503c \\(0\\) \u3002
  • \u526a\u679d\uff1a\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes);\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.Max(no, yes);\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return int(math.Max(float64(no), float64(yes)))\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  return max(no, yes);\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    std::cmp::max(no, yes)\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return myMax(no, yes);\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return @max(no, yes);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-18 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u7269\u54c1\u90fd\u6703\u7522\u751f\u4e0d\u9078\u548c\u9078\u5169\u689d\u641c\u5c0b\u5206\u652f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002

\u89c0\u5bdf\u905e\u8ff4\u6a39\uff0c\u5bb9\u6613\u767c\u73fe\u5176\u4e2d\u5b58\u5728\u91cd\u758a\u5b50\u554f\u984c\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u7576\u7269\u54c1\u8f03\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f03\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f03\u591a\u6642\uff0c\u91cd\u758a\u5b50\u554f\u984c\u7684\u6578\u91cf\u5c07\u6703\u5927\u5e45\u589e\u591a\u3002

\u5716 14-18 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u70ba\u4e86\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\uff0c\u6211\u5011\u85c9\u52a9\u8a18\u61b6\u4e32\u5217 mem \u4f86\u8a18\u9304\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5c0d\u61c9 \\(dp[i, c]\\) \u3002

\u5f15\u5165\u8a18\u61b6\u5316\u4e4b\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u5b50\u554f\u984c\u6578\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs_mem}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-19 \u5c55\u793a\u4e86\u5728\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u88ab\u526a\u6389\u7684\u641c\u5c0b\u5206\u652f\u3002

\u5716 14-19 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u52d5\u614b\u898f\u5283\u5be6\u8cea\u4e0a\u5c31\u662f\u5728\u72c0\u614b\u8f49\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u904e\u7a0b\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-20 \u6240\u793a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u7531\u9663\u5217 dp \u5927\u5c0f\u6c7a\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14>

\u5716 14-20 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u90fd\u53ea\u8207\u5176\u4e0a\u4e00\u884c\u7684\u72c0\u614b\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5169\u500b\u9663\u5217\u6efe\u52d5\u524d\u9032\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

\u9032\u4e00\u6b65\u601d\u8003\uff0c\u6211\u5011\u80fd\u5426\u50c5\u7528\u4e00\u500b\u9663\u5217\u5be6\u73fe\u7a7a\u9593\u6700\u4f73\u5316\u5462\uff1f\u89c0\u5bdf\u53ef\u77e5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f49\u79fb\u904e\u4f86\u7684\u3002\u5047\u8a2d\u53ea\u6709\u4e00\u500b\u9663\u5217\uff0c\u7576\u958b\u59cb\u8d70\u8a2a\u7b2c \\(i\\) \u884c\u6642\uff0c\u8a72\u9663\u5217\u5132\u5b58\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72c0\u614b\u3002

  • \u5982\u679c\u63a1\u53d6\u6b63\u5e8f\u8d70\u8a2a\uff0c\u90a3\u9ebc\u8d70\u8a2a\u5230 \\(dp[i, j]\\) \u6642\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7d93\u88ab\u8986\u84cb\uff0c\u6b64\u6642\u5c31\u7121\u6cd5\u5f97\u5230\u6b63\u78ba\u7684\u72c0\u614b\u8f49\u79fb\u7d50\u679c\u3002
  • \u5982\u679c\u63a1\u53d6\u5012\u5e8f\u8d70\u8a2a\uff0c\u5247\u4e0d\u6703\u767c\u751f\u8986\u84cb\u554f\u984c\uff0c\u72c0\u614b\u8f49\u79fb\u53ef\u4ee5\u6b63\u78ba\u9032\u884c\u3002

\u5716 14-21 \u5c55\u793a\u4e86\u5728\u55ae\u500b\u9663\u5217\u4e0b\u5f9e\u7b2c \\(i = 1\\) \u884c\u8f49\u63db\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u904e\u7a0b\u3002\u8acb\u601d\u8003\u6b63\u5e8f\u8d70\u8a2a\u548c\u5012\u5e8f\u8d70\u8a2a\u7684\u5340\u5225\u3002

<1><2><3><4><5><6>

\u5716 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad \\(i\\) \u76f4\u63a5\u522a\u9664\uff0c\u4e26\u4e14\u628a\u5167\u8ff4\u5708\u66f4\u6539\u70ba\u5012\u5e8f\u8d70\u8a2a\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u8d70\u8a2a\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u8d70\u8a2a\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp_comp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u8d70\u8a2a\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7d50","text":"
  • \u52d5\u614b\u898f\u5283\u5c0d\u554f\u984c\u9032\u884c\u5206\u89e3\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u898f\u907f\u91cd\u8907\u8a08\u7b97\uff0c\u63d0\u9ad8\u8a08\u7b97\u6548\u7387\u3002
  • \u4e0d\u8003\u616e\u6642\u9593\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52d5\u614b\u898f\u5283\u554f\u984c\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u5c0b\uff09\u9032\u884c\u6c42\u89e3\uff0c\u4f46\u905e\u8ff4\u6a39\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u6548\u7387\u6975\u4f4e\u3002\u900f\u904e\u5f15\u5165\u8a18\u61b6\u5316\u4e32\u5217\uff0c\u53ef\u4ee5\u5132\u5b58\u6240\u6709\u8a08\u7b97\u904e\u7684\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5f9e\u800c\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002
  • \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u905e\u8ff4\u5f0f\u89e3\u6cd5\uff0c\u800c\u8207\u4e4b\u5c0d\u61c9\u7684\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u5f9e\u5e95\u81f3\u9802\u7684\u905e\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5beb\u8868\u683c\u201d\u4e00\u6a23\u3002\u7531\u65bc\u7576\u524d\u72c0\u614b\u50c5\u4f9d\u8cf4\u67d0\u4e9b\u5340\u57df\u6027\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\uff0c\u5f9e\u800c\u964d\u4f4e\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8cea\u3002
  • \u52d5\u614b\u898f\u5283\u554f\u984c\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002
  • \u5982\u679c\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u53ef\u4ee5\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\uff0c\u5247\u5b83\u5c31\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\u3002
  • \u7121\u5f8c\u6548\u6027\u6307\u5c0d\u65bc\u4e00\u500b\u72c0\u614b\uff0c\u5176\u672a\u4f86\u767c\u5c55\u53ea\u8207\u8a72\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u4e0d\u5177\u6709\u7121\u5f8c\u6548\u6027\uff0c\u7121\u6cd5\u4f7f\u7528\u52d5\u614b\u898f\u5283\u5feb\u901f\u6c42\u89e3\u3002

\u80cc\u5305\u554f\u984c

  • \u80cc\u5305\u554f\u984c\u662f\u6700\u5178\u578b\u7684\u52d5\u614b\u898f\u5283\u554f\u984c\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u8b8a\u7a2e\u3002
  • 0-1 \u80cc\u5305\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\u3002\u6839\u64da\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u5169\u7a2e\u6c7a\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\uff0c\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u8d70\u8a2a\u4e32\u5217\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72c0\u614b\u88ab\u8986\u84cb\u3002
  • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u6bcf\u7a2e\u7269\u54c1\u7684\u9078\u53d6\u6578\u91cf\u7121\u9650\u5236\uff0c\u56e0\u6b64\u9078\u64c7\u653e\u5165\u7269\u54c1\u7684\u72c0\u614b\u8f49\u79fb\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\u3002\u7531\u65bc\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\u61c9\u7576\u6b63\u5e8f\u8d70\u8a2a\u3002
  • \u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u500b\u8b8a\u7a2e\u3002\u5b83\u5f9e\u6c42\u201c\u6700\u5927\u201d\u50f9\u503c\u8b8a\u70ba\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e63\u6578\u91cf\uff0c\u56e0\u6b64\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u61c9\u6539\u70ba \\(\\min()\\) \u3002\u5f9e\u8ffd\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u4f86\u8868\u793a\u201c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u201d\u7684\u7121\u6548\u89e3\u3002
  • \u96f6\u9322\u514c\u63db\u554f\u984c II \u5f9e\u6c42\u201c\u6700\u5c11\u786c\u5e63\u6578\u91cf\u201d\u6539\u70ba\u6c42\u201c\u786c\u5e63\u7d44\u5408\u6578\u91cf\u201d\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u76f8\u61c9\u5730\u5f9e \\(\\min()\\) \u6539\u70ba\u6c42\u548c\u904b\u7b97\u5b50\u3002

\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

  • \u7de8\u8f2f\u8ddd\u96e2\uff08Levenshtein \u8ddd\u96e2\uff09\u7528\u65bc\u8861\u91cf\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u7fa9\u70ba\u5f9e\u4e00\u500b\u5b57\u4e32\u5230\u53e6\u4e00\u500b\u5b57\u4e32\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u7de8\u8f2f\u64cd\u4f5c\u5305\u62ec\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\u3002
  • \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002\u7576 \\(s[i] \\ne t[j]\\) \u6642\uff0c\u5177\u6709\u4e09\u7a2e\u6c7a\u7b56\uff1a\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\uff0c\u5b83\u5011\u90fd\u6709\u76f8\u61c9\u7684\u5269\u9918\u5b50\u554f\u984c\u3002\u64da\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u8207\u69cb\u5efa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u800c\u7576 \\(s[i] = t[j]\\) \u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\u3002
  • \u5728\u7de8\u8f2f\u8ddd\u96e2\u4e2d\uff0c\u72c0\u614b\u4f9d\u8cf4\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u6b63\u5e8f\u6216\u5012\u5e8f\u8d70\u8a2a\u90fd\u7121\u6cd5\u6b63\u78ba\u5730\u9032\u884c\u72c0\u614b\u8f49\u79fb\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u8b8a\u6578\u66ab\u5b58\u5de6\u4e0a\u65b9\u72c0\u614b\uff0c\u5f9e\u800c\u8f49\u5316\u5230\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7b49\u50f9\u7684\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002
"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u6c42\u89e3\u53e6\u4e00\u500b\u5e38\u898b\u7684\u80cc\u5305\u554f\u984c\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u77ad\u89e3\u5b83\u7684\u4e00\u7a2e\u7279\u4f8b\uff1a\u96f6\u9322\u514c\u63db\u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 14-22 \u6240\u793a\u3002

\u5716 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u5b8c\u5168\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\uff0c\u5340\u5225\u50c5\u5728\u65bc\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9078\u64c7\u6b21\u6578\u3002

  • \u5728 0-1 \u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u53ea\u6709\u4e00\u500b\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u53ea\u80fd\u5f9e\u524d \\(i-1\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002
  • \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u7684\u6578\u91cf\u662f\u7121\u9650\u7684\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5f9e\u524d \\(i\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002

\u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u898f\u5b9a\u4e0b\uff0c\u72c0\u614b \\([i, c]\\) \u7684\u8b8a\u5316\u5206\u70ba\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u8f49\u79fb\u81f3 \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\uff0c\u8f49\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

\u5f9e\u800c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u8b8a\u70ba\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5c0d\u6bd4\u5169\u9053\u984c\u76ee\u7684\u7a0b\u5f0f\u78bc\uff0c\u72c0\u614b\u8f49\u79fb\u4e2d\u6709\u4e00\u8655\u5f9e \\(i-1\\) \u8b8a\u70ba \\(i\\) \uff0c\u5176\u9918\u5b8c\u5168\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u7576\u524d\u72c0\u614b\u662f\u5f9e\u5de6\u908a\u548c\u4e0a\u908a\u7684\u72c0\u614b\u8f49\u79fb\u800c\u4f86\u7684\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u61c9\u8a72\u5c0d \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002

\u9019\u500b\u8d70\u8a2a\u9806\u5e8f\u8207 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8acb\u85c9\u52a9\u5716 14-23 \u4f86\u7406\u89e3\u5169\u8005\u7684\u5340\u5225\u3002

<1><2><3><4><5><6>

\u5716 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u7a0b\u5f0f\u78bc\u5be6\u73fe\u6bd4\u8f03\u7c21\u55ae\uff0c\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad\u522a\u9664\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp_comp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c","text":"

\u80cc\u5305\u554f\u984c\u662f\u4e00\u5927\u985e\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4ee3\u8868\uff0c\u5176\u64c1\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 14-24 \u6240\u793a\u3002

\u5716 14-24 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u96f6\u9322\u514c\u63db\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u7a2e\u7279\u6b8a\u60c5\u6cc1\uff0c\u5169\u8005\u5177\u6709\u4ee5\u4e0b\u95dc\u806f\u8207\u4e0d\u540c\u9ede\u3002

  • \u5169\u9053\u984c\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\uff0c\u201c\u7269\u54c1\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5c0d\u61c9\u201c\u76ee\u6a19\u91d1\u984d\u201d\u3002
  • \u6700\u4f73\u5316\u76ee\u6a19\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u50f9\u503c\uff0c\u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e63\u6578\u91cf\u3002
  • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u9322\u514c\u63db\u662f\u6c42\u201c\u6070\u597d\u201d\u6e4a\u5230\u76ee\u6a19\u91d1\u984d\u7684\u89e3\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u72c0\u614b \\([i, a]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\uff0c\u8a18\u70ba \\(dp[i, a]\\) \u3002

\u4e8c\u7dad \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt+1)\\) \u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u672c\u984c\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u5169\u9ede\u5dee\u7570\u3002

  • \u672c\u984c\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c07\u904b\u7b97\u5b50 \\(\\max()\\) \u66f4\u6539\u70ba \\(\\min()\\) \u3002
  • \u6700\u4f73\u5316\u4e3b\u9ad4\u662f\u786c\u5e63\u6578\u91cf\u800c\u975e\u5546\u54c1\u50f9\u503c\uff0c\u56e0\u6b64\u5728\u9078\u4e2d\u786c\u5e63\u6642\u57f7\u884c \\(+1\\) \u5373\u53ef\u3002
\\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u6e4a\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u70ba \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u5373\u662f\u7121\u6548\u89e3\u3002\u70ba\u4f7f\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u5f0f\u80fd\u5920\u8b58\u5225\u4e26\u904e\u6ffe\u7121\u6548\u89e3\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528 \\(+ \\infty\\) \u4f86\u8868\u793a\u5b83\u5011\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(+ \\infty\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e26\u672a\u63d0\u4f9b \\(+ \\infty\\) \u8b8a\u6578\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u4f86\u4ee3\u66ff\u3002\u800c\u9019\u53c8\u6703\u5c0e\u81f4\u5927\u6578\u8d8a\u754c\uff1a\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u767c\u751f\u6ea2\u4f4d\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u6578\u5b57 \\(amt + 1\\) \u4f86\u8868\u793a\u7121\u6548\u89e3\uff0c\u56e0\u70ba\u6e4a\u51fa \\(amt\\) \u7684\u786c\u5e63\u6578\u91cf\u6700\u591a\u70ba \\(amt\\) \u3002\u6700\u5f8c\u8fd4\u56de\u524d\uff0c\u5224\u65b7 \\(dp[n, amt]\\) \u662f\u5426\u7b49\u65bc \\(amt + 1\\) \uff0c\u82e5\u662f\u5247\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.java
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
coin_change.go
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
coin_change.js
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp}\n
coin_change.zig
// \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-25 \u5c55\u793a\u4e86\u96f6\u9322\u514c\u63db\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u5716 14-25 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u96f6\u9322\u514c\u63db\u7684\u7a7a\u9593\u6700\u4f73\u5316\u7684\u8655\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.java
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.go
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
coin_change.js
/* \u96f6\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp_comp}\n
coin_change.zig
// \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II","text":"

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u786c\u5e63\u7d44\u5408\u6578\u91cf\u3002\u793a\u4f8b\u5982\u5716 14-26 \u6240\u793a\u3002

\u5716 14-26 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II \u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u76f8\u6bd4\u65bc\u4e0a\u4e00\u984c\uff0c\u672c\u984c\u76ee\u6a19\u662f\u6c42\u7d44\u5408\u6578\u91cf\uff0c\u56e0\u6b64\u5b50\u554f\u984c\u8b8a\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u7d44\u5408\u6578\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7dad\u77e9\u9663\u3002

\u7576\u524d\u72c0\u614b\u7684\u7d44\u5408\u6578\u91cf\u7b49\u65bc\u4e0d\u9078\u7576\u524d\u786c\u5e63\u8207\u9078\u7576\u524d\u786c\u5e63\u9019\u5169\u7a2e\u6c7a\u7b56\u7684\u7d44\u5408\u6578\u91cf\u4e4b\u548c\u3002\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

\u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u7121\u9808\u9078\u64c7\u4efb\u4f55\u786c\u5e63\u5373\u53ef\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u61c9\u5c07\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u70ba \\(1\\) \u3002\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
coin_change_ii.cpp
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.java
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.cs
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
coin_change_ii.go
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.swift
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.js
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.ts
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.dart
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
coin_change_ii.rs
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
coin_change_ii.c
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp}\n
coin_change_ii.zig
// \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7a7a\u9593\u6700\u4f73\u5316\u8655\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u522a\u9664\u786c\u5e63\u7dad\u5ea6\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
coin_change_ii.cpp
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.java
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.cs
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.go
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.swift
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.js
/* \u96f6\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.ts
/* \u96f6\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.dart
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
coin_change_ii.rs
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
coin_change_ii.c
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp_comp}\n
coin_change_ii.zig
// \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u5716","text":"

Abstract

\u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u5011\u5c31\u50cf\u662f\u4e00\u500b\u500b\u7bc0\u9ede\uff0c\u88ab\u7121\u6578\u770b\u4e0d\u898b\u7684\u908a\u76f8\u9023\u3002

\u6bcf\u4e00\u6b21\u7684\u76f8\u8b58\u8207\u76f8\u96e2\uff0c\u90fd\u5728\u9019\u5f35\u5de8\u5927\u7684\u7db2\u8def\u5716\u4e2d\u7559\u4e0b\u7368\u7279\u7684\u5370\u8a18\u3002

"},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 9.1 \u00a0 \u5716
  • 9.2 \u00a0 \u5716\u57fa\u790e\u64cd\u4f5c
  • 9.3 \u00a0 \u5716\u7684\u8d70\u8a2a
  • 9.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u5716","text":"

\u5716\uff08graph\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u7531\u9802\u9ede\uff08vertex\uff09\u548c\u908a\uff08edge\uff09\u7d44\u6210\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u5716 \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede \\(V\\) \u548c\u4e00\u7d44\u908a \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u500b\u5305\u542b 5 \u500b\u9802\u9ede\u548c 7 \u689d\u908a\u7684\u5716\u3002

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

\u5982\u679c\u5c07\u9802\u9ede\u770b\u4f5c\u7bc0\u9ede\uff0c\u5c07\u908a\u770b\u4f5c\u9023\u7dda\u5404\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5716\u770b\u4f5c\u4e00\u7a2e\u5f9e\u93c8\u7d50\u4e32\u5217\u62d3\u5c55\u800c\u4f86\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5982\u5716 9-1 \u6240\u793a\uff0c\u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002

\u5716 9-1 \u00a0 \u93c8\u7d50\u4e32\u5217\u3001\u6a39\u3001\u5716\u4e4b\u9593\u7684\u95dc\u4fc2

"},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u5716\u7684\u5e38\u898b\u578b\u5225\u8207\u8853\u8a9e","text":"

\u6839\u64da\u908a\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u70ba\u7121\u5411\u5716\uff08undirected graph\uff09\u548c\u6709\u5411\u5716\uff08directed graph\uff09\uff0c\u5982\u5716 9-2 \u6240\u793a\u3002

  • \u5728\u7121\u5411\u5716\u4e2d\uff0c\u908a\u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7684\u201c\u96d9\u5411\u201d\u9023\u7dda\u95dc\u4fc2\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u95dc\u4fc2\u201d\u3002
  • \u5728\u6709\u5411\u5716\u4e2d\uff0c\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u5169\u500b\u65b9\u5411\u7684\u908a\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u95dc\u6ce8\u201d\u8207\u201c\u88ab\u95dc\u6ce8\u201d\u95dc\u4fc2\u3002

\u5716 9-2 \u00a0 \u6709\u5411\u5716\u8207\u7121\u5411\u5716

\u6839\u64da\u6240\u6709\u9802\u9ede\u662f\u5426\u9023\u901a\uff0c\u53ef\u5206\u70ba\u9023\u901a\u5716\uff08connected graph\uff09\u548c\u975e\u9023\u901a\u5716\uff08disconnected graph\uff09\uff0c\u5982\u5716 9-3 \u6240\u793a\u3002

  • \u5c0d\u65bc\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u53ef\u4ee5\u5230\u9054\u5176\u9918\u4efb\u610f\u9802\u9ede\u3002
  • \u5c0d\u65bc\u975e\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002

\u5716 9-3 \u00a0 \u9023\u901a\u5716\u8207\u975e\u9023\u901a\u5716

\u6211\u5011\u9084\u53ef\u4ee5\u70ba\u908a\u65b0\u589e\u201c\u6b0a\u91cd\u201d\u8b8a\u6578\uff0c\u5f9e\u800c\u5f97\u5230\u5982\u5716 9-4 \u6240\u793a\u7684\u6709\u6b0a\u5716\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u69ae\u8000\u300b\u7b49\u624b\u904a\u4e2d\uff0c\u7cfb\u7d71\u6703\u6839\u64da\u5171\u540c\u904a\u6232\u6642\u9593\u4f86\u8a08\u7b97\u73a9\u5bb6\u4e4b\u9593\u7684\u201c\u89aa\u5bc6\u5ea6\u201d\uff0c\u9019\u7a2e\u89aa\u5bc6\u5ea6\u7db2\u8def\u5c31\u53ef\u4ee5\u7528\u6709\u6b0a\u5716\u4f86\u8868\u793a\u3002

\u5716 9-4 \u00a0 \u6709\u6b0a\u5716\u8207\u7121\u6b0a\u5716

\u5716\u8cc7\u6599\u7d50\u69cb\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u8853\u8a9e\u3002

  • \u9130\u63a5\uff08adjacency\uff09\uff1a\u7576\u5169\u9802\u9ede\u4e4b\u9593\u5b58\u5728\u908a\u76f8\u9023\u6642\uff0c\u7a31\u9019\u5169\u9802\u9ede\u201c\u9130\u63a5\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u9802\u9ede 1 \u7684\u9130\u63a5\u9802\u9ede\u70ba\u9802\u9ede 2\u30013\u30015\u3002
  • \u8def\u5f91\uff08path\uff09\uff1a\u5f9e\u9802\u9ede A \u5230\u9802\u9ede B \u7d93\u904e\u7684\u908a\u69cb\u6210\u7684\u5e8f\u5217\u88ab\u7a31\u70ba\u5f9e A \u5230 B \u7684\u201c\u8def\u5f91\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u908a\u5e8f\u5217 1-5-2-4 \u662f\u9802\u9ede 1 \u5230\u9802\u9ede 4 \u7684\u4e00\u689d\u8def\u5f91\u3002
  • \u5ea6\uff08degree\uff09\uff1a\u4e00\u500b\u9802\u9ede\u64c1\u6709\u7684\u908a\u6578\u3002\u5c0d\u65bc\u6709\u5411\u5716\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u6307\u5411\u8a72\u9802\u9ede\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u5f9e\u8a72\u9802\u9ede\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u5716\u7684\u8868\u793a","text":"

\u5716\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u7121\u5411\u5716\u9032\u884c\u8209\u4f8b\u3002

"},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u9130\u63a5\u77e9\u9663","text":"

\u8a2d\u5716\u7684\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u9130\u63a5\u77e9\u9663\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u662f\u5426\u5b58\u5728\u908a\u3002

\u5982\u5716 9-5 \u6240\u793a\uff0c\u8a2d\u9130\u63a5\u77e9\u9663\u70ba \\(M\\)\u3001\u9802\u9ede\u4e32\u5217\u70ba \\(V\\) \uff0c\u90a3\u9ebc\u77e9\u9663\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9802\u9ede \\(V[i]\\) \u5230\u9802\u9ede \\(V[j]\\) \u4e4b\u9593\u5b58\u5728\u908a\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7121\u908a\u3002

\u5716 9-5 \u00a0 \u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a

\u9130\u63a5\u77e9\u9663\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u56e0\u6b64\u9130\u63a5\u77e9\u9663\u4e3b\u5c0d\u89d2\u7dda\u5143\u7d20\u6c92\u6709\u610f\u7fa9\u3002
  • \u5c0d\u65bc\u7121\u5411\u5716\uff0c\u5169\u500b\u65b9\u5411\u7684\u908a\u7b49\u50f9\uff0c\u6b64\u6642\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\u3002
  • \u5c07\u9130\u63a5\u77e9\u9663\u7684\u5143\u7d20\u5f9e \\(1\\) \u548c \\(0\\) \u66ff\u63db\u70ba\u6b0a\u91cd\uff0c\u5247\u53ef\u8868\u793a\u6709\u6b0a\u5716\u3002

\u4f7f\u7528\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u8a2a\u554f\u77e9\u9663\u5143\u7d20\u4ee5\u7372\u53d6\u908a\uff0c\u56e0\u6b64\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9663\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u8a18\u61b6\u9ad4\u4f54\u7528\u8f03\u591a\u3002

"},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u9130\u63a5\u8868","text":"

\u9130\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u8868\u793a\u9802\u9ede\u3002\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff08\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u9802\u9ede\uff09\u3002\u5716 9-6 \u5c55\u793a\u4e86\u4e00\u500b\u4f7f\u7528\u9130\u63a5\u8868\u5132\u5b58\u7684\u5716\u7684\u793a\u4f8b\u3002

\u5716 9-6 \u00a0 \u5716\u7684\u9130\u63a5\u8868\u8868\u793a

\u9130\u63a5\u8868\u50c5\u5132\u5b58\u5be6\u969b\u5b58\u5728\u7684\u908a\uff0c\u800c\u908a\u7684\u7e3d\u6578\u901a\u5e38\u9060\u5c0f\u65bc \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002\u7136\u800c\uff0c\u5728\u9130\u63a5\u8868\u4e2d\u9700\u8981\u900f\u904e\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u5176\u6642\u9593\u6548\u7387\u4e0d\u5982\u9130\u63a5\u77e9\u9663\u3002

\u89c0\u5bdf\u5716 9-6 \uff0c\u9130\u63a5\u8868\u7d50\u69cb\u8207\u96dc\u6e4a\u8868\u4e2d\u7684\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u5011\u4e5f\u53ef\u4ee5\u63a1\u7528\u985e\u4f3c\u7684\u65b9\u6cd5\u4f86\u6700\u4f73\u5316\u6548\u7387\u3002\u6bd4\u5982\u7576\u93c8\u7d50\u4e32\u5217\u8f03\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u6548\u7387\u5f9e \\(O(n)\\) \u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u9084\u53ef\u4ee5\u628a\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u5716\u7684\u5e38\u898b\u61c9\u7528","text":"

\u5982\u8868 9-1 \u6240\u793a\uff0c\u8a31\u591a\u73fe\u5be6\u7cfb\u7d71\u53ef\u4ee5\u7528\u5716\u4f86\u5efa\u6a21\uff0c\u76f8\u61c9\u7684\u554f\u984c\u4e5f\u53ef\u4ee5\u7d04\u5316\u70ba\u5716\u8a08\u7b97\u554f\u984c\u3002

\u8868 9-1 \u00a0 \u73fe\u5be6\u751f\u6d3b\u4e2d\u5e38\u898b\u7684\u5716

\u9802\u9ede \u908a \u5716\u8a08\u7b97\u554f\u984c \u793e\u4ea4\u7db2\u8def \u4f7f\u7528\u8005 \u597d\u53cb\u95dc\u4fc2 \u6f5b\u5728\u597d\u53cb\u63a8\u85a6 \u5730\u9435\u7dda\u8def \u7ad9\u9ede \u7ad9\u9ede\u9593\u7684\u9023\u901a\u6027 \u6700\u77ed\u8def\u7dda\u63a8\u85a6 \u592a\u967d\u7cfb \u661f\u9ad4 \u661f\u9ad4\u9593\u7684\u842c\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8ecc\u9053\u8a08\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u5716\u7684\u57fa\u790e\u64cd\u4f5c","text":"

\u5716\u7684\u57fa\u790e\u64cd\u4f5c\u53ef\u5206\u70ba\u5c0d\u201c\u908a\u201d\u7684\u64cd\u4f5c\u548c\u5c0d\u201c\u9802\u9ede\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u5169\u7a2e\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5be6\u73fe\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u7684\u5be6\u73fe","text":"

\u7d66\u5b9a\u4e00\u500b\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \u7684\u7121\u5411\u5716\uff0c\u5247\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u5f0f\u5982\u5716 9-7 \u6240\u793a\u3002

  • \u65b0\u589e\u6216\u522a\u9664\u908a\uff1a\u76f4\u63a5\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u800c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u9700\u8981\u540c\u6642\u66f4\u65b0\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u7684\u5c3e\u90e8\u65b0\u589e\u4e00\u884c\u4e00\u5217\uff0c\u4e26\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u522a\u9664\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u4e00\u884c\u4e00\u5217\u3002\u7576\u522a\u9664\u9996\u884c\u9996\u5217\u6642\u9054\u5230\u6700\u5dee\u60c5\u6cc1\uff0c\u9700\u8981\u5c07 \\((n-1)^2\\) \u500b\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52d5\u201d\uff0c\u5f9e\u800c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u521d\u59cb\u5316\uff1a\u50b3\u5165 \\(n\\) \u500b\u9802\u9ede\uff0c\u521d\u59cb\u5316\u9577\u5ea6\u70ba \\(n\\) \u7684\u9802\u9ede\u4e32\u5217 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u9130\u63a5\u77e9\u9663 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
\u521d\u59cb\u5316\u9130\u63a5\u77e9\u9663\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

\u5716 9-7 \u00a0 \u9130\u63a5\u77e9\u9663\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

\u4ee5\u4e0b\u662f\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u65b0\u589e\u9802\u9ede\n        for val in vertices:\n            self.add_vertex(val)\n        # \u65b0\u589e\u908a\n        # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        n = self.size()\n        # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u522a\u9664\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u5217\u5370\u9130\u63a5\u77e9\u9663\"\"\"\n        print(\"\u9802\u9ede\u4e32\u5217 =\", self.vertices)\n        print(\"\u9130\u63a5\u77e9\u9663 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    void print() {\n        cout << \"\u9802\u9ede\u4e32\u5217 = \";\n        printVector(vertices);\n        cout << \"\u9130\u63a5\u77e9\u9663 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void print() {\n        System.out.print(\"\u9802\u9ede\u4e32\u5217 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void Print() {\n        Console.Write(\"\u9802\u9ede\u4e32\u5217 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjMat struct {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vertices []int\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u65b0\u589e\u9802\u9ede\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u5716\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9802\u9ede\u4e32\u5217 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u9130\u63a5\u77e9\u9663 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.append(val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    func print() {\n        Swift.print(\"\u9802\u9ede\u4e32\u5217 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u9130\u63a5\u77e9\u9663 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print() {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices: number[]; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print(): void {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9802\u9ede\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u65b0\u589e\u9802\u9ede\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    vertices.add(val);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    vertices.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u65b0\u589e\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u522a\u9664\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n  void printAdjMat() {\n    print(\"\u9802\u9ede\u4e32\u5217 = $vertices\");\n    print(\"\u9130\u63a5\u77e9\u9663 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjMat {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    pub fn print(&self) {\n        println!(\"\u9802\u9ede\u4e32\u5217 = {:?}\", self.vertices);\n        println!(\"\u9130\u63a5\u77e9\u9663 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u5efa\u69cb\u5b50 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u5716\u7684\u9802\u9ede\u6578\u91cf\u5df2\u9054\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u65b0\u589e\u7b2c n \u500b\u9802\u9ede\uff0c\u4e26\u5c07\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9802\u9ede\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u908a\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u908a\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9802\u9ede\u4e32\u5217 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u9130\u63a5\u77e9\u9663 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u9802\u9ede\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    fun print() {\n        print(\"\u9802\u9ede\u4e32\u5217 = \")\n        println(vertices)\n        println(\"\u9130\u63a5\u77e9\u9663 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u5efa\u69cb\u5b50 ###\n    # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @vertices = []\n    # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u65b0\u589e\u9802\u9ede\n    vertices.each { |val| add_vertex(val) }\n    # \u65b0\u589e\u908a\n    # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    @vertices << val\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    @vertices.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(i, j)\n    # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(i, j)\n    # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u77e9\u9663 ###\n  def __print__\n    puts \"\u9802\u9ede\u4e32\u5217 = #{@vertices}\"\n    puts '\u9130\u63a5\u77e9\u9663 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u65bc\u9130\u63a5\u8868\u7684\u5be6\u73fe","text":"

\u8a2d\u7121\u5411\u5716\u7684\u9802\u9ede\u7e3d\u6578\u70ba \\(n\\)\u3001\u908a\u7e3d\u6578\u70ba \\(m\\) \uff0c\u5247\u53ef\u6839\u64da\u5716 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5be6\u73fe\u5404\u7a2e\u64cd\u4f5c\u3002

  • \u65b0\u589e\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u7684\u672b\u5c3e\u65b0\u589e\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u70ba\u662f\u7121\u5411\u5716\uff0c\u6240\u4ee5\u9700\u8981\u540c\u6642\u65b0\u589e\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u522a\u9664\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u4e26\u522a\u9664\u6307\u5b9a\u908a\uff0c\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\u3002\u5728\u7121\u5411\u5716\u4e2d\uff0c\u9700\u8981\u540c\u6642\u522a\u9664\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u4e26\u5c07\u65b0\u589e\u9802\u9ede\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
  • \u522a\u9664\u9802\u9ede\uff1a\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u522a\u9664\u5305\u542b\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
  • \u521d\u59cb\u5316\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u5efa\u7acb \\(n\\) \u500b\u9802\u9ede\u548c \\(2m\\) \u689d\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
\u521d\u59cb\u5316\u9130\u63a5\u8868\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

\u5716 9-8 \u00a0 \u9130\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

\u4ee5\u4e0b\u662f\u9130\u63a5\u8868\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u6bd4\u5716 9-8 \uff0c\u5be6\u969b\u7a0b\u5f0f\u78bc\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

  • \u70ba\u4e86\u65b9\u4fbf\u65b0\u589e\u8207\u522a\u9664\u9802\u9ede\uff0c\u4ee5\u53ca\u7c21\u5316\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f86\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\u3002
  • \u4f7f\u7528\u96dc\u6e4a\u8868\u4f86\u5132\u5b58\u9130\u63a5\u8868\uff0ckey \u70ba\u9802\u9ede\u4f8b\u9805\uff0cvalue \u70ba\u8a72\u9802\u9ede\u7684\u9130\u63a5\u9802\u9ede\u4e32\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002

\u53e6\u5916\uff0c\u6211\u5011\u5728\u9130\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u985e\u5225\u4f86\u8868\u793a\u9802\u9ede\uff0c\u9019\u6a23\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u8207\u9130\u63a5\u77e9\u9663\u4e00\u6a23\uff0c\u7528\u4e32\u5217\u7d22\u5f15\u4f86\u5340\u5206\u4e0d\u540c\u9802\u9ede\uff0c\u90a3\u9ebc\u5047\u8a2d\u8981\u522a\u9664\u7d22\u5f15\u70ba \\(i\\) \u7684\u9802\u9ede\uff0c\u5247\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u5c07\u6240\u6709\u5927\u65bc \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u6e1b \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u500b\u9802\u9ede\u90fd\u662f\u552f\u4e00\u7684 Vertex \u4f8b\u9805\uff0c\u522a\u9664\u67d0\u4e00\u9802\u9ede\u4e4b\u5f8c\u5c31\u7121\u9808\u6539\u52d5\u5176\u4ed6\u9802\u9ede\u4e86\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u65b0\u589e\u908a vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u522a\u9664\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u522a\u9664\u908a vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.pop(vet)\n        # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u9130\u63a5\u8868\"\"\"\n        print(\"\u9130\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  public:\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u522a\u9664\u6307\u5b9a\u7bc0\u9ede */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u522a\u9664\u908a vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.erase(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    void print() {\n        cout << \"\u9130\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u9130\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.Add(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.Remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u9130\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjList struct {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList map[Vertex][]Vertex\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u65b0\u589e\u908a */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u65b0\u589e\u908a vet1 - vet2, \u65b0\u589e\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u522a\u9664\u908a */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    delete(g.adjList, vet)\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u5217\u5370\u9130\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u9130\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u5efa\u69cb\u5b50 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u65b0\u589e\u908a */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = []\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.removeValue(forKey: vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u9130\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print() {\n        console.log('\u9130\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print(): void {\n        console.log('\u9130\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u65b0\u589e\u908a */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u65b0\u589e\u908a vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u522a\u9664\u908a */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    adjList[vet] = [];\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    adjList.remove(vet);\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u9130\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.remove(&vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u9130\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9802\u9ede\n    struct AdjListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n} AdjListNode;\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u65b0\u589e\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u982d\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u522a\u9664\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u641c\u7d22 vet \u5c0d\u61c9\u7bc0\u9ede\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c07 vet \u5c0d\u61c9\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\n    pre->next = cur->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(cur);\n}\n\n/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u7bc0\u9ede\u9663\u5217\n    int size;                     // \u7bc0\u9ede\u6578\u91cf\n} GraphAdjList;\n\n/* \u5efa\u69cb\u5b50 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u65b0\u589e\u908a */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u65b0\u589e\u908a vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u522a\u9664\u908a */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u522a\u9664\u908a vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    graph->heads[graph->size++] = head;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c07\u8a72\u9802\u9ede\u4e4b\u5f8c\u7684\u9802\u9ede\u5411\u524d\u79fb\u52d5\uff0c\u4ee5\u586b\u88dc\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u65b0\u589e\u908a */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    fun print() {\n        println(\"\u9130\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(edges)\n    # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    @adj_list = {}\n    # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u522a\u9664\u908a vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    @adj_list[vet] = []\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    @adj_list.delete(vet)\n    # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u8868 ###\n  def __print__\n    puts '\u9130\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5c0d\u6bd4","text":"

\u8a2d\u5716\u4e2d\u5171\u6709 \\(n\\) \u500b\u9802\u9ede\u548c \\(m\\) \u689d\u908a\uff0c\u8868 9-2 \u5c0d\u6bd4\u4e86\u9130\u63a5\u77e9\u9663\u548c\u9130\u63a5\u8868\u7684\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u3002

\u8868 9-2 \u00a0 \u9130\u63a5\u77e9\u9663\u8207\u9130\u63a5\u8868\u5c0d\u6bd4

\u9130\u63a5\u77e9\u9663 \u9130\u63a5\u8868\uff08\u93c8\u7d50\u4e32\u5217\uff09 \u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09 \u5224\u65b7\u662f\u5426\u9130\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u908a \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u908a \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u9802\u9ede \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u9802\u9ede \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u8a18\u61b6\u9ad4\u7a7a\u9593\u4f54\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

\u89c0\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09\u7684\u6642\u9593\u6548\u7387\u8207\u7a7a\u9593\u6548\u7387\u6700\u512a\u3002\u4f46\u5be6\u969b\u4e0a\uff0c\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u64cd\u4f5c\u908a\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u9663\u5217\u8a2a\u554f\u6216\u8ce6\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7d9c\u5408\u4f86\u770b\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u7684\u539f\u5247\uff0c\u800c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u7684\u539f\u5247\u3002

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u5716\u7684\u8d70\u8a2a","text":"

\u6a39\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5c0d\u591a\u201d\u7684\u95dc\u4fc2\uff0c\u800c\u5716\u5247\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5c0d\u591a\u201d\u95dc\u4fc2\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u6a39\u770b\u4f5c\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\u3002\u986f\u7136\uff0c\u6a39\u7684\u8d70\u8a2a\u64cd\u4f5c\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u64cd\u4f5c\u7684\u4e00\u7a2e\u7279\u4f8b\u3002

\u5716\u548c\u6a39\u90fd\u9700\u8981\u61c9\u7528\u641c\u7d22\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u8d70\u8a2a\u64cd\u4f5c\u3002\u5716\u7684\u8d70\u8a2a\u65b9\u5f0f\u4e5f\u53ef\u5206\u70ba\u5169\u7a2e\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u548c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

"},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u5f9e\u67d0\u500b\u7bc0\u9ede\u51fa\u767c\uff0c\u59cb\u7d42\u512a\u5148\u8a2a\u554f\u8ddd\u96e2\u6700\u8fd1\u7684\u9802\u9ede\uff0c\u4e26\u4e00\u5c64\u5c64\u5411\u5916\u64f4\u5f35\u3002\u5982\u5716 9-9 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u9996\u5148\u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e0b\u4e00\u500b\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8a2a\u554f\u5b8c\u7562\u3002

\u5716 9-9 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a

"},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

BFS \u901a\u5e38\u85c9\u52a9\u4f47\u5217\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\u3002\u4f47\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8cea\uff0c\u9019\u8207 BFS \u7684\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u601d\u60f3\u7570\u66f2\u540c\u5de5\u3002

  1. \u5c07\u8d70\u8a2a\u8d77\u59cb\u9802\u9ede startVet \u52a0\u5165\u5217\u5217\uff0c\u4e26\u958b\u555f\u8ff4\u5708\u3002
  2. \u5728\u8ff4\u5708\u7684\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\uff0c\u5f48\u51fa\u4f47\u5217\u9996\u9802\u9ede\u4e26\u8a18\u9304\u8a2a\u554f\uff0c\u7136\u5f8c\u5c07\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u52a0\u5165\u5230\u4f47\u5217\u5c3e\u90e8\u3002
  3. \u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u76f4\u5230\u6240\u6709\u9802\u9ede\u88ab\u8a2a\u554f\u5b8c\u7562\u5f8c\u7d50\u675f\u3002

\u70ba\u4e86\u9632\u6b62\u91cd\u8907\u8d70\u8a2a\u9802\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

Tip

\u96dc\u6e4a\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u53ea\u5132\u5b58 key \u800c\u4e0d\u5132\u5b58 value \u7684\u96dc\u6e4a\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u9032\u884c key \u7684\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u64da key \u7684\u552f\u4e00\u6027\uff0c\u96dc\u6e4a\u96c6\u5408\u901a\u5e38\u7528\u65bc\u8cc7\u6599\u53bb\u91cd\u7b49\u5834\u666f\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]([start_vet])\n    # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while len(que) > 0:\n        vet = que.popleft()  # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.append(adj_vet)  # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adj_vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited = {startVet};\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push_back(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.push(adjVet);        // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.emplace(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet);            // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [startVet];\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.Add(vet);               // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.Add(adjVet);   // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS, \u4f7f\u7528\u5207\u7247\u6a21\u64ec\u4f47\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    for len(queue) > 0 {\n        // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        res = append(res, vet)\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = [startVet]\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.append(adjVet) // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.insert(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      }\n      que.add(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    }\n  }\n  // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited.insert(adj_vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u7bc0\u9ede\u4f47\u5217\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u5efa\u69cb\u5b50 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u5217\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u5217\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res[(*resSize)++] = vet;      // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited[(*visitedSize)++] = node->vertex; // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n            node = node->next;\n        }\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(queue);\n}\n
graph_bfs.kt
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet)         // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet)   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new([start_vet])\n  # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  que = [start_vet]\n  # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while que.length > 0\n    vet = que.shift # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res << vet # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      que << adj_vet # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adj_vet) # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    end\n  end\n  # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7a0b\u5f0f\u78bc\u76f8\u5c0d\u62bd\u8c61\uff0c\u5efa\u8b70\u5c0d\u7167\u5716 9-10 \u4f86\u52a0\u6df1\u7406\u89e3\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 9-10 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0d\u552f\u4e00\u3002\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u9806\u5e8f\u8d70\u8a2a\uff0c\u800c\u591a\u500b\u76f8\u540c\u8ddd\u96e2\u7684\u9802\u9ede\u7684\u8d70\u8a2a\u9806\u5e8f\u5141\u8a31\u88ab\u4efb\u610f\u6253\u4e82\u3002\u4ee5\u5716 9-10 \u70ba\u4f8b\uff0c\u9802\u9ede \\(1\\)\u3001\\(3\\) \u7684\u8a2a\u554f\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\uff0c\u9802\u9ede \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8a2a\u554f\u9806\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u63db\u3002

"},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u5165\u5217\u4e26\u51fa\u968a\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u5728\u8d70\u8a2a\u9130\u63a5\u9802\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u96c6\u5408 visited \uff0c\u4f47\u5217 que \u4e2d\u7684\u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

"},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u518d\u56de\u982d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002\u5982\u5716 9-11 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u7576\u524d\u9802\u9ede\u7684\u67d0\u500b\u9130\u63a5\u9802\u9ede\uff0c\u76f4\u5230\u8d70\u5230\u76e1\u982d\u6642\u8fd4\u56de\uff0c\u518d\u7e7c\u7e8c\u8d70\u5230\u76e1\u982d\u4e26\u8fd4\u56de\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8d70\u8a2a\u5b8c\u6210\u3002

\u5716 9-11 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a

"},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

\u9019\u7a2e\u201c\u8d70\u5230\u76e1\u982d\u518d\u8fd4\u56de\u201d\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u5728\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4e2d\uff0c\u6211\u5011\u4e5f\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 visited \u4f86\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\uff0c\u4ee5\u907f\u514d\u91cd\u8907\u8a2a\u554f\u9802\u9ede\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f\"\"\"\n    res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.emplace(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.Add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede                             \n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u6703\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u9808\u8b93\u539f\u5f15\u7528\u91cd\u65b0\u8ce6\u503c\u70ba\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    }\n    // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n                         // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    res[(*resSize)++] = vet;\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet) # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 9-12 \u6240\u793a\u3002

  • \u76f4\u865b\u7dda\u4ee3\u8868\u5411\u4e0b\u905e\u63a8\uff0c\u8868\u793a\u958b\u555f\u4e86\u4e00\u500b\u65b0\u7684\u905e\u8ff4\u65b9\u6cd5\u4f86\u8a2a\u554f\u65b0\u9802\u9ede\u3002
  • \u66f2\u865b\u7dda\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u905e\u8ff4\u65b9\u6cd5\u5df2\u7d93\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u958b\u555f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

\u70ba\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8b70\u5c07\u5716 9-12 \u8207\u7a0b\u5f0f\u78bc\u7d50\u5408\u8d77\u4f86\uff0c\u5728\u8166\u4e2d\u6a21\u64ec\uff08\u6216\u8005\u7528\u7b46\u756b\u4e0b\u4f86\uff09\u6574\u500b DFS \u904e\u7a0b\uff0c\u5305\u62ec\u6bcf\u500b\u905e\u8ff4\u65b9\u6cd5\u4f55\u6642\u958b\u555f\u3001\u4f55\u6642\u8fd4\u56de\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 9-12 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5e8f\u5217\u7684\u9806\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7d66\u5b9a\u67d0\u9802\u9ede\uff0c\u5148\u5f80\u54ea\u500b\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u9130\u63a5\u9802\u9ede\u7684\u9806\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e82\uff0c\u90fd\u662f\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

\u4ee5\u6a39\u7684\u8d70\u8a2a\u70ba\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\uff0c\u5b83\u5011\u5c55\u793a\u4e86\u4e09\u7a2e\u8d70\u8a2a\u512a\u5148\u9806\u5e8f\uff0c\u7136\u800c\u9019\u4e09\u8005\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

"},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u88ab\u8a2a\u554f \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u96c6\u5408 visited \u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u6700\u5927\u70ba \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5716\u7531\u9802\u9ede\u548c\u908a\u7d44\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede\u548c\u4e00\u7d44\u908a\u69cb\u6210\u7684\u96c6\u5408\u3002
  • \u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002
  • \u6709\u5411\u5716\u7684\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u9023\u901a\u5716\u4e2d\u7684\u4efb\u610f\u9802\u9ede\u5747\u53ef\u9054\uff0c\u6709\u6b0a\u5716\u7684\u6bcf\u689d\u908a\u90fd\u5305\u542b\u6b0a\u91cd\u8b8a\u6578\u3002
  • \u9130\u63a5\u77e9\u9663\u5229\u7528\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u6709\u908a\u6216\u7121\u908a\u3002\u9130\u63a5\u77e9\u9663\u5728\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u9593\u4f54\u7528\u8f03\u591a\u3002
  • \u9130\u63a5\u8868\u4f7f\u7528\u591a\u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u3002\u9130\u63a5\u8868\u76f8\u5c0d\u65bc\u9130\u63a5\u77e9\u9663\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\uff0c\u4f46\u7531\u65bc\u9700\u8981\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u6642\u9593\u6548\u7387\u8f03\u4f4e\u3002
  • \u7576\u9130\u63a5\u8868\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u5176\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u6216\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002
  • \u5f9e\u6f14\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff0c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002
  • \u5716\u53ef\u7528\u65bc\u5efa\u6a21\u5404\u985e\u73fe\u5be6\u7cfb\u7d71\uff0c\u5982\u793e\u4ea4\u7db2\u8def\u3001\u5730\u9435\u7dda\u8def\u7b49\u3002
  • \u6a39\u662f\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\uff0c\u6a39\u7684\u8d70\u8a2a\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u7684\u4e00\u7a2e\u7279\u4f8b\u3002
  • \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u3001\u5c64\u5c64\u64f4\u5f35\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u901a\u5e38\u85c9\u52a9\u4f47\u5217\u5be6\u73fe\u3002
  • \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u6642\u518d\u56de\u6eaf\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8def\u5f91\u7684\u5b9a\u7fa9\u662f\u9802\u9ede\u5e8f\u5217\u9084\u662f\u908a\u5e8f\u5217\uff1f

\u7dad\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8a9e\u8a00\u7248\u672c\u7684\u5b9a\u7fa9\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u908a\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

\u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f91\u88ab\u8996\u70ba\u4e00\u500b\u908a\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u3002\u9019\u662f\u56e0\u70ba\u5169\u500b\u9802\u9ede\u4e4b\u9593\u53ef\u80fd\u5b58\u5728\u591a\u689d\u908a\u9023\u7dda\uff0c\u6b64\u6642\u6bcf\u689d\u908a\u90fd\u5c0d\u61c9\u4e00\u689d\u8def\u5f91\u3002

Q\uff1a\u975e\u9023\u901a\u5716\u4e2d\u662f\u5426\u6703\u6709\u7121\u6cd5\u8d70\u8a2a\u5230\u7684\u9ede\uff1f

\u5728\u975e\u9023\u901a\u5716\u4e2d\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002\u8d70\u8a2a\u975e\u9023\u901a\u5716\u9700\u8981\u8a2d\u5b9a\u591a\u500b\u8d77\u9ede\uff0c\u4ee5\u8d70\u8a2a\u5230\u5716\u7684\u6240\u6709\u9023\u901a\u5206\u91cf\u3002

Q\uff1a\u5728\u9130\u63a5\u8868\u4e2d\uff0c\u201c\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u6240\u6709\u9802\u9ede\u201d\u7684\u9802\u9ede\u9806\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

\u53ef\u4ee5\u662f\u4efb\u610f\u9806\u5e8f\u3002\u4f46\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u898f\u5247\u4f86\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9802\u9ede\u65b0\u589e\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9802\u9ede\u503c\u5927\u5c0f\u7684\u9806\u5e8f\u7b49\uff0c\u9019\u6a23\u6709\u52a9\u65bc\u5feb\u901f\u67e5\u8a62\u201c\u5e36\u6709\u67d0\u7a2e\u6975\u503c\u201d\u7684\u9802\u9ede\u3002

"},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8caa\u5a6a","text":"

Abstract

\u5411\u65e5\u8475\u671d\u8457\u592a\u967d\u8f49\u52d5\uff0c\u6642\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u9577\u7684\u6700\u5927\u53ef\u80fd\u3002

\u8caa\u5a6a\u7b56\u7565\u5728\u4e00\u8f2a\u8f2a\u7684\u7c21\u55ae\u9078\u64c7\u4e2d\uff0c\u9010\u6b65\u5c0e\u5411\u6700\u4f73\u7b54\u6848\u3002

"},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5
  • 15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c
  • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c
  • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c
  • 15.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c","text":"

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u50f9\u503c\u6839\u64da\u9078\u64c7\u7684\u91cd\u91cf\u6bd4\u4f8b\u8a08\u7b97\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 15-3 \u6240\u793a\u3002

\u5716 15-3 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

\u5206\u6578\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u6574\u9ad4\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72c0\u614b\u5305\u542b\u7576\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6a19\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u50f9\u503c\u3002

\u4e0d\u540c\u9ede\u5728\u65bc\uff0c\u672c\u984c\u5141\u8a31\u53ea\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u5716 15-4 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u7269\u54c1\u4efb\u610f\u5730\u9032\u884c\u5207\u5206\uff0c\u4e26\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u4f86\u8a08\u7b97\u76f8\u61c9\u50f9\u503c\u3002

  1. \u5c0d\u65bc\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c\u70ba \\(val[i-1] / wgt[i-1]\\) \uff0c\u7c21\u7a31\u55ae\u4f4d\u50f9\u503c\u3002
  2. \u5047\u8a2d\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u70ba \\(w\\) \uff0c\u5247\u80cc\u5305\u589e\u52a0\u7684\u50f9\u503c\u70ba \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

\u5716 15-4 \u00a0 \u7269\u54c1\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c

"},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u6700\u5927\u5316\u80cc\u5305\u5167\u7269\u54c1\u7e3d\u50f9\u503c\uff0c\u672c\u8cea\u4e0a\u662f\u6700\u5927\u5316\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u50f9\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u5716 15-5 \u6240\u793a\u7684\u8caa\u5a6a\u7b56\u7565\u3002

  1. \u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\u3002
  2. \u8d70\u8a2a\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f2a\u8caa\u5a6a\u5730\u9078\u64c7\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
  3. \u82e5\u5269\u9918\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u4f7f\u7528\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6eff\u80cc\u5305\u3002

\u5716 15-5 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565

"},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u6211\u5011\u5efa\u7acb\u4e86\u4e00\u500b\u7269\u54c1\u985e\u5225 Item \uff0c\u4ee5\u4fbf\u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u9032\u884c\u6392\u5e8f\u3002\u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u7576\u80cc\u5305\u5df2\u6eff\u6642\u8df3\u51fa\u4e26\u8fd4\u56de\u89e3\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u50f9\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a\"\"\"\n    # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n    return res\n
fractional_knapsack.cpp
/* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.java
/* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.cs
/* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.go
/* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.swift
/* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u50f9\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.js
/* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u50f9\u503c\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.ts
/* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u50f9\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.dart
/* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u50f9\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n      break;\n    }\n  }\n  return res;\n}\n
fractional_knapsack.rs
/* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u50f9\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    res\n}\n
fractional_knapsack.c
/* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n} Item;\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
fractional_knapsack.kt
/* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u50f9\u503c\n)\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.rb
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
fractional_knapsack.zig
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u9700\u8981\u8d70\u8a2a\u6574\u500b\u7269\u54c1\u4e32\u5217\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u7269\u54c1\u6578\u91cf\u3002

\u7531\u65bc\u521d\u59cb\u5316\u4e86\u4e00\u500b Item \u7269\u4ef6\u4e32\u5217\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

"},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u63a1\u7528\u53cd\u8b49\u6cd5\u3002\u5047\u8a2d\u7269\u54c1 \\(x\\) \u662f\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u6f14\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u50f9\u503c\u70ba res \uff0c\u4f46\u8a72\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u73fe\u5728\u5f9e\u80cc\u5305\u4e2d\u62ff\u51fa\u55ae\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u4e26\u66ff\u63db\u70ba\u55ae\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u65bc\u7269\u54c1 \\(x\\) \u7684\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u63db\u5f8c\u7684\u7e3d\u50f9\u503c\u4e00\u5b9a\u5927\u65bc res \u3002\u9019\u8207 res \u662f\u6700\u512a\u89e3\u77db\u76fe\uff0c\u8aaa\u660e\u6700\u512a\u89e3\u4e2d\u5fc5\u9808\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u5c0d\u65bc\u8a72\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u69cb\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u7e3d\u800c\u8a00\u4e4b\uff0c\u55ae\u4f4d\u50f9\u503c\u66f4\u5927\u7684\u7269\u54c1\u7e3d\u662f\u66f4\u512a\u9078\u64c7\uff0c\u9019\u8aaa\u660e\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

\u5982\u5716 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c07\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u55ae\u4f4d\u50f9\u503c\u5206\u5225\u770b\u4f5c\u4e00\u5f35\u4e8c\u7dad\u5716\u8868\u7684\u6a6b\u8ef8\u548c\u7e31\u8ef8\uff0c\u5247\u5206\u6578\u80cc\u5305\u554f\u984c\u53ef\u8f49\u5316\u70ba\u201c\u6c42\u5728\u6709\u9650\u6a6b\u8ef8\u5340\u9593\u4e0b\u570d\u6210\u7684\u6700\u5927\u9762\u7a4d\u201d\u3002\u9019\u500b\u985e\u6bd4\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u5f9e\u5e7e\u4f55\u89d2\u5ea6\u7406\u89e3\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

\u5716 15-6 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u5e7e\u4f55\u8868\u793a

"},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u7684\u6f14\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u554f\u984c\u7684\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\uff0c\u90fd\u9078\u64c7\u7576\u524d\u770b\u8d77\u4f86\u6700\u512a\u7684\u9078\u64c7\uff0c\u5373\u8caa\u5a6a\u5730\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7c21\u6f54\u4e14\u9ad8\u6548\uff0c\u5728\u8a31\u591a\u5be6\u969b\u554f\u984c\u4e2d\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\u3002

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u548c\u52d5\u614b\u898f\u5283\u90fd\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u3002\u5b83\u5011\u4e4b\u9593\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u8655\uff0c\u6bd4\u5982\u90fd\u4f9d\u8cf4\u6700\u512a\u5b50\u7d50\u69cb\u6027\u8cea\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

  • \u52d5\u614b\u898f\u5283\u6703\u6839\u64da\u4e4b\u524d\u968e\u6bb5\u7684\u6240\u6709\u6c7a\u7b56\u4f86\u8003\u616e\u7576\u524d\u6c7a\u7b56\uff0c\u4e26\u4f7f\u7528\u904e\u53bb\u5b50\u554f\u984c\u7684\u89e3\u4f86\u69cb\u5efa\u7576\u524d\u5b50\u554f\u984c\u7684\u89e3\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u6703\u8003\u616e\u904e\u53bb\u7684\u6c7a\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u4e0d\u65b7\u7e2e\u5c0f\u554f\u984c\u7bc4\u570d\uff0c\u76f4\u81f3\u554f\u984c\u88ab\u89e3\u6c7a\u3002

\u6211\u5011\u5148\u900f\u904e\u4f8b\u984c\u201c\u96f6\u9322\u514c\u63db\u201d\u77ad\u89e3\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u9019\u9053\u984c\u5df2\u7d93\u5728\u201c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u76f8\u4fe1\u4f60\u5c0d\u5b83\u4e26\u4e0d\u964c\u751f\u3002

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

\u672c\u984c\u63a1\u53d6\u7684\u8caa\u5a6a\u7b56\u7565\u5982\u5716 15-1 \u6240\u793a\u3002\u7d66\u5b9a\u76ee\u6a19\u91d1\u984d\uff0c\u6211\u5011\u8caa\u5a6a\u5730\u9078\u64c7\u4e0d\u5927\u65bc\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e63\uff0c\u4e0d\u65b7\u8ff4\u5708\u8a72\u6b65\u9a5f\uff0c\u76f4\u81f3\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u70ba\u6b62\u3002

\u5716 15-1 \u00a0 \u96f6\u9322\u514c\u63db\u7684\u8caa\u5a6a\u7b56\u7565

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a\"\"\"\n    # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
coin_change_greedy.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.java
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.go
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
coin_change_greedy.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
coin_change_greedy.js
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9078\u64c7 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
coin_change_greedy.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
coin_change_greedy.c
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
coin_change_greedy.rb
[class]{}-[func]{coin_change_greedy}\n
coin_change_greedy.zig
[class]{}-[func]{coinChangeGreedy}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u4f60\u53ef\u80fd\u6703\u4e0d\u7531\u5730\u767c\u51fa\u611f\u5606\uff1aSo clean \uff01\u8caa\u5a6a\u6f14\u7b97\u6cd5\u50c5\u7528\u7d04\u5341\u884c\u7a0b\u5f0f\u78bc\u5c31\u89e3\u6c7a\u4e86\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u64cd\u4f5c\u76f4\u63a5\u3001\u5be6\u73fe\u7c21\u55ae\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8a18\u786c\u5e63\u6700\u5c0f\u9762\u503c\u70ba \\(\\min(coins)\\) \uff0c\u5247\u8caa\u5a6a\u9078\u64c7\u6700\u591a\u8ff4\u5708 \\(amt / \\min(coins)\\) \u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(amt / \\min(coins))\\) \u3002\u9019\u6bd4\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u500b\u6578\u91cf\u7d1a\u3002

\u7136\u800c\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u9762\u503c\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u80fd\u627e\u5230\u6700\u512a\u89e3\u3002\u5716 15-2 \u7d66\u51fa\u4e86\u5169\u500b\u793a\u4f8b\u3002

  • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8a72\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u7d66\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3\u3002
  • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8a2d \\(amt = 60\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(11\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(20 + 20 + 20\\) \uff0c\u50c5\u9700 \\(3\\) \u679a\u786c\u5e63\u3002
  • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8a2d \\(amt = 98\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(49\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(49 + 49\\) \uff0c\u50c5\u9700 \\(2\\) \u679a\u786c\u5e63\u3002

\u5716 15-2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u627e\u51fa\u6700\u512a\u89e3\u7684\u793a\u4f8b

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5c0d\u65bc\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u4fdd\u8b49\u627e\u5230\u5168\u57df\u6027\u6700\u512a\u89e3\uff0c\u4e26\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\u3002

\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u9069\u7528\u60c5\u6cc1\u5206\u4ee5\u4e0b\u5169\u7a2e\u3002

  1. \u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u5f80\u5f80\u662f\u6700\u512a\u9078\u64c7\uff0c\u56e0\u70ba\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u66f4\u9ad8\u6548\u3002
  2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5c0d\u65bc\u5f88\u591a\u8907\u96dc\u554f\u984c\u4f86\u8aaa\uff0c\u5c0b\u627e\u5168\u57df\u6027\u6700\u512a\u89e3\u975e\u5e38\u56f0\u96e3\uff0c\u80fd\u4ee5\u8f03\u9ad8\u6548\u7387\u627e\u5230\u6b21\u512a\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u932f\u7684\u3002
"},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u90a3\u9ebc\u554f\u984c\u4f86\u4e86\uff0c\u4ec0\u9ebc\u6a23\u7684\u554f\u984c\u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8aaa\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1f

\u76f8\u8f03\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u4f7f\u7528\u689d\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u95dc\u6ce8\u554f\u984c\u7684\u5169\u500b\u6027\u8cea\u3002

  • \u8caa\u5a6a\u9078\u64c7\u6027\u8cea\uff1a\u53ea\u6709\u7576\u5c40\u90e8\u6700\u512a\u9078\u64c7\u59cb\u7d42\u53ef\u4ee5\u5c0e\u81f4\u5168\u57df\u6027\u6700\u512a\u89e3\u6642\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u624d\u80fd\u4fdd\u8b49\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u6700\u512a\u5b50\u7d50\u69cb\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u5305\u542b\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u3002

\u6700\u512a\u5b50\u7d50\u69cb\u5df2\u7d93\u5728\u201c\u52d5\u614b\u898f\u5283\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u9019\u88e1\u4e0d\u518d\u8d05\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u554f\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\u4e26\u4e0d\u660e\u986f\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u6c7a\u3002

\u6211\u5011\u4e3b\u8981\u63a2\u7a76\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u5224\u65b7\u65b9\u6cd5\u3002\u96d6\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f03\u7c21\u55ae\uff0c\u4f46\u5be6\u969b\u4e0a\u5c0d\u65bc\u8a31\u591a\u554f\u984c\uff0c\u8b49\u660e\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4e26\u975e\u6613\u4e8b\u3002

\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u6211\u5011\u96d6\u7136\u80fd\u5920\u5bb9\u6613\u5730\u8209\u51fa\u53cd\u4f8b\uff0c\u5c0d\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u9032\u884c\u8b49\u507d\uff0c\u4f46\u8b49\u5be6\u7684\u96e3\u5ea6\u8f03\u5927\u3002\u5982\u679c\u554f\uff1a\u6eff\u8db3\u4ec0\u9ebc\u689d\u4ef6\u7684\u786c\u5e63\u7d44\u5408\u53ef\u4ee5\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u5011\u5f80\u5f80\u53ea\u80fd\u6191\u85c9\u76f4\u89ba\u6216\u8209\u4f8b\u5b50\u4f86\u7d66\u51fa\u4e00\u500b\u6a21\u7a1c\u5169\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96e3\u4ee5\u7d66\u51fa\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\u3002

Quote

\u6709\u4e00\u7bc7\u8ad6\u6587\u7d66\u51fa\u4e86\u4e00\u500b \\(O(n^3)\\) \u6642\u9593\u8907\u96dc\u5ea6\u7684\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u5224\u65b7\u4e00\u500b\u786c\u5e63\u7d44\u5408\u80fd\u5426\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u984d\u7684\u6700\u512a\u89e3\u3002

Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

"},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u984c\u6b65\u9a5f","text":"

\u8caa\u5a6a\u554f\u984c\u7684\u89e3\u6c7a\u6d41\u7a0b\u5927\u9ad4\u53ef\u5206\u70ba\u4ee5\u4e0b\u4e09\u6b65\u3002

  1. \u554f\u984c\u5206\u6790\uff1a\u68b3\u7406\u8207\u7406\u89e3\u554f\u984c\u7279\u6027\uff0c\u5305\u62ec\u72c0\u614b\u5b9a\u7fa9\u3001\u6700\u4f73\u5316\u76ee\u6a19\u548c\u7d04\u675f\u689d\u4ef6\u7b49\u3002\u9019\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52d5\u614b\u898f\u5283\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
  2. \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\uff1a\u78ba\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8caa\u5a6a\u9078\u64c7\u3002\u9019\u500b\u7b56\u7565\u80fd\u5920\u5728\u6bcf\u4e00\u6b65\u6e1b\u5c0f\u554f\u984c\u7684\u898f\u6a21\uff0c\u4e26\u6700\u7d42\u89e3\u6c7a\u6574\u500b\u554f\u984c\u3002
  3. \u6b63\u78ba\u6027\u8b49\u660e\uff1a\u901a\u5e38\u9700\u8981\u8b49\u660e\u554f\u984c\u5177\u6709\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u9019\u500b\u6b65\u9a5f\u53ef\u80fd\u9700\u8981\u7528\u5230\u6578\u5b78\u8b49\u660e\uff0c\u4f8b\u5982\u6b78\u7d0d\u6cd5\u6216\u53cd\u8b49\u6cd5\u7b49\u3002

\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6c42\u89e3\u554f\u984c\u7684\u6838\u5fc3\u6b65\u9a5f\uff0c\u4f46\u5be6\u65bd\u8d77\u4f86\u53ef\u80fd\u4e26\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e0d\u540c\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565\u7684\u5dee\u7570\u8f03\u5927\u3002\u5c0d\u65bc\u8a31\u591a\u554f\u984c\u4f86\u8aaa\uff0c\u8caa\u5a6a\u7b56\u7565\u6bd4\u8f03\u6dfa\u986f\uff0c\u6211\u5011\u900f\u904e\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u8207\u5617\u8a66\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5c0d\u65bc\u4e00\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u96b1\u853d\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u975e\u5e38\u8003\u9a57\u500b\u4eba\u7684\u89e3\u984c\u7d93\u9a57\u8207\u6f14\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
  • \u67d0\u4e9b\u8caa\u5a6a\u7b56\u7565\u5177\u6709\u8f03\u5f37\u7684\u8ff7\u60d1\u6027\u3002\u7576\u6211\u5011\u6eff\u61f7\u4fe1\u5fc3\u8a2d\u8a08\u597d\u8caa\u5a6a\u7b56\u7565\uff0c\u5beb\u51fa\u89e3\u984c\u7a0b\u5f0f\u78bc\u4e26\u63d0\u4ea4\u57f7\u884c\uff0c\u5f88\u53ef\u80fd\u767c\u73fe\u90e8\u5206\u6e2c\u8a66\u6a23\u4f8b\u7121\u6cd5\u900f\u904e\u3002\u9019\u662f\u56e0\u70ba\u8a2d\u8a08\u7684\u8caa\u5a6a\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u78ba\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7d39\u7684\u96f6\u9322\u514c\u63db\u5c31\u662f\u4e00\u500b\u5178\u578b\u6848\u4f8b\u3002

\u70ba\u4e86\u4fdd\u8b49\u6b63\u78ba\u6027\uff0c\u6211\u5011\u61c9\u8a72\u5c0d\u8caa\u5a6a\u7b56\u7565\u9032\u884c\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8b49\u6cd5\u6216\u6578\u5b78\u6b78\u7d0d\u6cd5\u3002

\u7136\u800c\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6c92\u6709\u982d\u7dd2\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u9762\u5411\u6e2c\u8a66\u7528\u4f8b\u9032\u884c\u7a0b\u5f0f\u78bc\u9664\u932f\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u8207\u9a57\u8b49\u8caa\u5a6a\u7b56\u7565\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5178\u578b\u4f8b\u984c","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5e38\u5e38\u61c9\u7528\u5728\u6eff\u8db3\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u6700\u4f73\u5316\u554f\u984c\u4e2d\uff0c\u4ee5\u4e0b\u5217\u8209\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u554f\u984c\u3002

  • \u786c\u5e63\u627e\u96f6\u554f\u984c\uff1a\u5728\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7e3d\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u5340\u9593\u6392\u7a0b\u554f\u984c\uff1a\u5047\u8a2d\u4f60\u6709\u4e00\u4e9b\u4efb\u52d9\uff0c\u6bcf\u500b\u4efb\u52d9\u5728\u4e00\u6bb5\u6642\u9593\u5167\u9032\u884c\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u5b8c\u6210\u5118\u53ef\u80fd\u591a\u7684\u4efb\u52d9\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u7d50\u675f\u6642\u9593\u6700\u65e9\u7684\u4efb\u52d9\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u5206\u6578\u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u8f09\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u9078\u64c7\u4e00\u7d44\u7269\u54c1\uff0c\u4f7f\u5f97\u7e3d\u91cd\u91cf\u4e0d\u8d85\u904e\u8f09\u91cd\u91cf\uff0c\u4e14\u7e3d\u50f9\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u50f9\u6548\u6bd4\u6700\u9ad8\uff08\u50f9\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u80a1\u7968\u8cb7\u8ce3\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u80a1\u7968\u7684\u6b77\u53f2\u50f9\u683c\uff0c\u4f60\u53ef\u4ee5\u9032\u884c\u591a\u6b21\u8cb7\u8ce3\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7d93\u6301\u6709\u80a1\u7968\uff0c\u90a3\u9ebc\u5728\u8ce3\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u8cb7\uff0c\u76ee\u6a19\u662f\u7372\u53d6\u6700\u5927\u5229\u6f64\u3002
  • \u970d\u592b\u66fc\u7de8\u78bc\uff1a\u970d\u592b\u66fc\u7de8\u78bc\u662f\u4e00\u7a2e\u7528\u65bc\u7121\u640d\u8cc7\u6599\u58d3\u7e2e\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002\u900f\u904e\u69cb\u5efa\u970d\u592b\u66fc\u6a39\uff0c\u6bcf\u6b21\u9078\u64c7\u51fa\u73fe\u983b\u7387\u6700\u4f4e\u7684\u5169\u500b\u7bc0\u9ede\u5408\u4f75\uff0c\u6700\u5f8c\u5f97\u5230\u7684\u970d\u592b\u66fc\u6a39\u7684\u5e36\u6b0a\u8def\u5f91\u9577\u5ea6\uff08\u7de8\u78bc\u9577\u5ea6\uff09\u6700\u5c0f\u3002
  • Dijkstra \u6f14\u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u7a2e\u89e3\u6c7a\u7d66\u5b9a\u6e90\u9802\u9ede\u5230\u5176\u9918\u5404\u9802\u9ede\u7684\u6700\u77ed\u8def\u5f91\u554f\u984c\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002
"},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c","text":"

Question

\u8f38\u5165\u4e00\u500b\u9663\u5217 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u4ee3\u8868\u4e00\u500b\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u5011\u4e4b\u9593\u7684\u7a7a\u9593\u53ef\u4ee5\u7d44\u6210\u4e00\u500b\u5bb9\u5668\u3002

\u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u548c\u5bec\u5ea6\u7684\u4e58\u7a4d\uff08\u9762\u7a4d\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f03\u77ed\u7684\u9694\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u500b\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002

\u8acb\u5728\u9663\u5217\u4e2d\u9078\u64c7\u5169\u500b\u9694\u677f\uff0c\u4f7f\u5f97\u7d44\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u5716 15-7 \u6240\u793a\u3002

\u5716 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

\u5bb9\u5668\u7531\u4efb\u610f\u5169\u500b\u9694\u677f\u570d\u6210\uff0c\u56e0\u6b64\u672c\u984c\u7684\u72c0\u614b\u70ba\u5169\u500b\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u6839\u64da\u984c\u610f\uff0c\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u4e58\u4ee5\u5bec\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002\u8a2d\u5bb9\u91cf\u70ba \\(cap[i, j]\\) \uff0c\u5247\u53ef\u5f97\u8a08\u7b97\u516c\u5f0f\uff1a

\\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

\u8a2d\u9663\u5217\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5169\u500b\u9694\u677f\u7684\u7d44\u5408\u6578\u91cf\uff08\u72c0\u614b\u7e3d\u6578\uff09\u70ba \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u500b\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u7aae\u8209\u6240\u6709\u72c0\u614b\uff0c\u5f9e\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u9019\u9053\u984c\u9084\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u5716 15-8 \u6240\u793a\uff0c\u73fe\u9078\u53d6\u4e00\u500b\u72c0\u614b \\([i, j]\\) \uff0c\u5176\u6eff\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002

\u5716 15-8 \u00a0 \u521d\u59cb\u72c0\u614b

\u5982\u5716 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u6642\u5c07\u9577\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5247\u5bb9\u91cf\u4e00\u5b9a\u8b8a\u5c0f\u3002

\u9019\u662f\u56e0\u70ba\u5728\u79fb\u52d5\u9577\u677f \\(j\\) \u5f8c\uff0c\u5bec\u5ea6 \\(j-i\\) \u80af\u5b9a\u8b8a\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u8b8a\uff08 \\(i\\) \u4ecd\u70ba\u77ed\u677f\uff09\u6216\u8b8a\u5c0f\uff08\u79fb\u52d5\u5f8c\u7684 \\(j\\) \u6210\u70ba\u77ed\u677f\uff09\u3002

\u5716 15-9 \u00a0 \u5411\u5167\u79fb\u52d5\u9577\u677f\u5f8c\u7684\u72c0\u614b

\u53cd\u5411\u601d\u8003\uff0c\u6211\u5011\u53ea\u6709\u5411\u5167\u6536\u7e2e\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u8b8a\u5927\u3002\u56e0\u70ba\u96d6\u7136\u5bec\u5ea6\u4e00\u5b9a\u8b8a\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u6703\u8b8a\u5927\uff08\u79fb\u52d5\u5f8c\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u6703\u8b8a\u9577\uff09\u3002\u4f8b\u5982\u5728\u5716 15-10 \u4e2d\uff0c\u79fb\u52d5\u77ed\u677f\u5f8c\u9762\u7a4d\u8b8a\u5927\u3002

\u5716 15-10 \u00a0 \u5411\u5167\u79fb\u52d5\u77ed\u677f\u5f8c\u7684\u72c0\u614b

\u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u984c\u7684\u8caa\u5a6a\u7b56\u7565\uff1a\u521d\u59cb\u5316\u5169\u6307\u6a19\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u5169\u7aef\uff0c\u6bcf\u8f2a\u5411\u5167\u6536\u7e2e\u77ed\u677f\u5c0d\u61c9\u7684\u6307\u6a19\uff0c\u76f4\u81f3\u5169\u6307\u6a19\u76f8\u9047\u3002

\u5716 15-11 \u5c55\u793a\u4e86\u8caa\u5a6a\u7b56\u7565\u7684\u57f7\u884c\u904e\u7a0b\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5217\u9663\u5217\u5169\u7aef\u3002
  2. \u8a08\u7b97\u7576\u524d\u72c0\u614b\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u4e26\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
  3. \u6bd4\u8f03\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u4e26\u5c07\u77ed\u677f\u5411\u5167\u79fb\u52d5\u4e00\u683c\u3002
  4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u6642\u7d50\u675f\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u8caa\u5a6a\u904e\u7a0b

"},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u7a0b\u5f0f\u78bc\u8ff4\u5708\u6700\u591a \\(n\\) \u8f2a\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u8b8a\u6578 \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res = 0\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
max_capacity.cpp
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.java
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.cs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.go
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res := 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.swift
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
max_capacity.js
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.ts
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.dart
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  int res = 0;\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
max_capacity.rs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let mut res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
max_capacity.c
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.kt
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.rb
[class]{}-[func]{max_capacity}\n
max_capacity.zig
[class]{}-[func]{maxCapacity}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u4e4b\u6240\u4ee5\u8caa\u5a6a\u6bd4\u7aae\u8209\u66f4\u5feb\uff0c\u662f\u56e0\u70ba\u6bcf\u8f2a\u7684\u8caa\u5a6a\u9078\u64c7\u90fd\u6703\u201c\u8df3\u904e\u201d\u4e00\u4e9b\u72c0\u614b\u3002

\u6bd4\u5982\u5728\u72c0\u614b \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002\u82e5\u8caa\u5a6a\u5730\u5c07\u77ed\u677f \\(i\\) \u5411\u5167\u79fb\u52d5\u4e00\u683c\uff0c\u6703\u5c0e\u81f4\u5716 15-12 \u6240\u793a\u7684\u72c0\u614b\u88ab\u201c\u8df3\u904e\u201d\u3002\u9019\u610f\u5473\u8457\u4e4b\u5f8c\u7121\u6cd5\u9a57\u8b49\u9019\u4e9b\u72c0\u614b\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

\\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

\u5716 15-12 \u00a0 \u79fb\u52d5\u77ed\u677f\u5c0e\u81f4\u88ab\u8df3\u904e\u7684\u72c0\u614b

\u89c0\u5bdf\u767c\u73fe\uff0c\u9019\u4e9b\u88ab\u8df3\u904e\u7684\u72c0\u614b\u5be6\u969b\u4e0a\u5c31\u662f\u5c07\u9577\u677f \\(j\\) \u5411\u5167\u79fb\u52d5\u7684\u6240\u6709\u72c0\u614b\u3002\u524d\u9762\u6211\u5011\u5df2\u7d93\u8b49\u660e\u5167\u79fb\u9577\u677f\u4e00\u5b9a\u6703\u5c0e\u81f4\u5bb9\u91cf\u8b8a\u5c0f\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u88ab\u8df3\u904e\u7684\u72c0\u614b\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u512a\u89e3\uff0c\u8df3\u904e\u5b83\u5011\u4e0d\u6703\u5c0e\u81f4\u932f\u904e\u6700\u512a\u89e3\u3002

\u4ee5\u4e0a\u5206\u6790\u8aaa\u660e\uff0c\u79fb\u52d5\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5c07\u5176\u5207\u5206\u70ba\u81f3\u5c11\u5169\u500b\u6b63\u6574\u6578\u7684\u548c\uff0c\u6c42\u5207\u5206\u5f8c\u6240\u6709\u6574\u6578\u7684\u4e58\u7a4d\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u5716 15-13 \u6240\u793a\u3002

\u5716 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u554f\u984c\u5b9a\u7fa9

\u5047\u8a2d\u6211\u5011\u5c07 \\(n\\) \u5207\u5206\u70ba \\(m\\) \u500b\u6574\u6578\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u500b\u56e0\u5b50\u8a18\u70ba \\(n_i\\) \uff0c\u5373

\\[ n = \\sum_{i=1}^{m}n_i \\]

\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u5f97\u6240\u6709\u6574\u6578\u56e0\u5b50\u7684\u6700\u5927\u4e58\u7a4d\uff0c\u5373

\\[ \\max(\\prod_{i=1}^{m}n_i) \\]

\u6211\u5011\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6578\u91cf \\(m\\) \u61c9\u8a72\u591a\u5927\uff0c\u6bcf\u500b \\(n_i\\) \u61c9\u8a72\u662f\u591a\u5c11\uff1f

"},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u6839\u64da\u7d93\u9a57\uff0c\u5169\u500b\u6574\u6578\u7684\u4e58\u7a4d\u5f80\u5f80\u6bd4\u5b83\u5011\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8a2d\u5f9e \\(n\\) \u4e2d\u5206\u51fa\u4e00\u500b\u56e0\u5b50 \\(2\\) \uff0c\u5247\u5b83\u5011\u7684\u4e58\u7a4d\u70ba \\(2(n-2)\\) \u3002\u6211\u5011\u5c07\u8a72\u4e58\u7a4d\u8207 \\(n\\) \u4f5c\u6bd4\u8f03\uff1a

\\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

\u5982\u5716 15-14 \u6240\u793a\uff0c\u7576 \\(n \\geq 4\\) \u6642\uff0c\u5207\u5206\u51fa\u4e00\u500b \\(2\\) \u5f8c\u4e58\u7a4d\u6703\u8b8a\u5927\uff0c\u9019\u8aaa\u660e\u5927\u65bc\u7b49\u65bc \\(4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u88ab\u5207\u5206\u3002

\u8caa\u5a6a\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u9ebc\u5b83\u5c31\u61c9\u8a72\u88ab\u7e7c\u7e8c\u5207\u5206\u3002\u6700\u7d42\u7684\u5207\u5206\u65b9\u6848\u53ea\u61c9\u51fa\u73fe \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u7a2e\u56e0\u5b50\u3002

\u5716 15-14 \u00a0 \u5207\u5206\u5c0e\u81f4\u4e58\u7a4d\u8b8a\u5927

\u63a5\u4e0b\u4f86\u601d\u8003\u54ea\u500b\u56e0\u5b50\u662f\u6700\u512a\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u500b\u56e0\u5b50\u4e2d\uff0c\u986f\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u70ba \\(1 \\times (n-1) < n\\) \u6046\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u6703\u5c0e\u81f4\u4e58\u7a4d\u6e1b\u5c0f\u3002

\u5982\u5716 15-15 \u6240\u793a\uff0c\u7576 \\(n = 6\\) \u6642\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u9019\u610f\u5473\u8457\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u512a\u3002

\u8caa\u5a6a\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u96bb\u61c9\u5b58\u5728\u5169\u500b \\(2\\) \u3002\u56e0\u70ba\u4e09\u500b \\(2\\) \u7e3d\u662f\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002

\u5716 15-15 \u00a0 \u6700\u512a\u5207\u5206\u56e0\u5b50

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8caa\u5a6a\u7b56\u7565\u3002

  1. \u8f38\u5165\u6574\u6578 \\(n\\) \uff0c\u5f9e\u5176\u4e0d\u65b7\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u9918\u6578\u70ba \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
  2. \u7576\u9918\u6578\u70ba \\(0\\) \u6642\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6578\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u8655\u7406\u3002
  3. \u7576\u9918\u6578\u70ba \\(2\\) \u6642\uff0c\u4e0d\u7e7c\u7e8c\u5283\u5206\uff0c\u4fdd\u7559\u3002
  4. \u7576\u9918\u6578\u70ba \\(1\\) \u6642\uff0c\u7531\u65bc \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u61c9\u5c07\u6700\u5f8c\u4e00\u500b \\(3\\) \u66ff\u63db\u70ba \\(2\\) \u3002
"},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5982\u5716 15-16 \u6240\u793a\uff0c\u6211\u5011\u7121\u9808\u900f\u904e\u8ff4\u5708\u4f86\u5207\u5206\u6574\u6578\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u904b\u7b97\u5f97\u5230 \\(3\\) \u7684\u500b\u6578 \\(a\\) \uff0c\u7528\u53d6\u6a21\u904b\u7b97\u5f97\u5230\u9918\u6578 \\(b\\) \uff0c\u6b64\u6642\u6709\uff1a

\\[ n = 3 a + b \\]

\u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc \\(n \\leq 3\\) \u7684\u908a\u754c\u60c5\u6cc1\uff0c\u5fc5\u9808\u62c6\u5206\u51fa\u4e00\u500b \\(1\\) \uff0c\u4e58\u7a4d\u70ba \\(1 \\times (n - 1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a\"\"\"\n    # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.pow(3, a)) * 2\n    # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.pow(3, a))\n
max_product_cutting.cpp
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)pow(3, a);\n}\n
max_product_cutting.java
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int) Math.pow(3, a);\n}\n
max_product_cutting.cs
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint MaxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)Math.Pow(3, a);\n}\n
max_product_cutting.go
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n int) int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
max_product_cutting.swift
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a)\n}\n
max_product_cutting.js
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.ts
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n: number): number {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.dart
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n  // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return pow(3, a).toInt();\n}\n
max_product_cutting.rs
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
max_product_cutting.c
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a);\n}\n
max_product_cutting.kt
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfun maxProductCutting(n: Int): Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return 3.0.pow(a).toInt()\n}\n
max_product_cutting.rb
[class]{}-[func]{max_product_cutting}\n
max_product_cutting.zig
[class]{}-[func]{maxProductCutting}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u8a08\u7b97\u65b9\u6cd5

\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u51aa\u904b\u7b97\u7684\u5be6\u73fe\u65b9\u6cd5\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5e38\u7528\u7684\u51aa\u8a08\u7b97\u51fd\u5f0f\u6709\u4e09\u7a2e\u3002

  • \u904b\u7b97\u5b50 ** \u548c\u51fd\u5f0f pow() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log\u2061 a)\\) \u3002
  • \u51fd\u5f0f math.pow() \u5167\u90e8\u547c\u53eb C \u8a9e\u8a00\u5eab\u7684 pow() \u51fd\u5f0f\uff0c\u5176\u57f7\u884c\u6d6e\u9ede\u53d6\u51aa\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

\u8b8a\u6578 \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u4f7f\u7528\u53cd\u8b49\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u6cc1\u3002

  1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u5c07\u5176\u7e7c\u7e8c\u5283\u5206\u70ba \\(2(x-2)\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
  2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u500b\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u9ebc\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u4f75\u5165\u53e6\u5916\u4e00\u500b\u56e0\u5b50\u4e2d\uff0c\u4ee5\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
  3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u5169\u500b \\(2\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u500b \\(2\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u4e58\u7a4d\u66f4\u5927\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
"},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7d50","text":"
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u901a\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\u90fd\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u6703\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u500b\u53c8\u4e00\u500b\u7684\u8caa\u5a6a\u9078\u64c7\uff0c\u6bcf\u8f2a\u90fd\u5c07\u554f\u984c\u8f49\u5316\u6210\u4e00\u500b\u898f\u6a21\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u554f\u984c\u88ab\u89e3\u6c7a\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u5be6\u73fe\u7c21\u55ae\uff0c\u9084\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u984c\u6548\u7387\u3002\u76f8\u6bd4\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
  • \u5728\u96f6\u9322\u514c\u63db\u554f\u984c\u4e2d\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1b\u5c0d\u65bc\u53e6\u5916\u4e00\u4e9b\u786c\u5e63\u7d44\u5408\u5247\u4e0d\u7136\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
  • \u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u7684\u554f\u984c\u5177\u6709\u5169\u5927\u6027\u8cea\uff1a\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4ee3\u8868\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
  • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u8b49\u660e\u4e26\u4e0d\u7c21\u55ae\u3002\u76f8\u5c0d\u4f86\u8aaa\uff0c\u8b49\u507d\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002
  • \u6c42\u89e3\u8caa\u5a6a\u554f\u984c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\uff1a\u554f\u984c\u5206\u6790\u3001\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u3001\u6b63\u78ba\u6027\u8b49\u660e\u3002\u5176\u4e2d\uff0c\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9a5f\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u5f80\u5f80\u662f\u96e3\u9ede\u3002
  • \u5206\u6578\u80cc\u5305\u554f\u984c\u5728 0-1 \u80cc\u5305\u7684\u57fa\u790e\u4e0a\uff0c\u5141\u8a31\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u3002\u8caa\u5a6a\u7b56\u7565\u7684\u6b63\u78ba\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\u3002
  • \u6700\u5927\u5bb9\u91cf\u554f\u984c\u53ef\u4f7f\u7528\u7aae\u8209\u6cd5\u6c42\u89e3\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u900f\u904e\u8a2d\u8a08\u8caa\u5a6a\u7b56\u7565\uff0c\u6bcf\u8f2a\u5411\u5167\u79fb\u52d5\u77ed\u677f\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \u3002
  • \u5728\u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u63a8\u7406\u51fa\u5169\u500b\u8caa\u5a6a\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u7e7c\u7e8c\u5207\u5206\uff0c\u6700\u512a\u5207\u5206\u56e0\u5b50\u70ba \\(3\\) \u3002\u7a0b\u5f0f\u78bc\u4e2d\u5305\u542b\u51aa\u904b\u7b97\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u51aa\u904b\u7b97\u5be6\u73fe\u65b9\u6cd5\uff0c\u901a\u5e38\u70ba \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
"},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u96dc\u6e4a\u8868","text":"

Abstract

\u5728\u8a08\u7b97\u6a5f\u4e16\u754c\u4e2d\uff0c\u96dc\u6e4a\u8868\u5982\u540c\u4e00\u4f4d\u8070\u6167\u7684\u5716\u66f8\u7ba1\u7406\u54e1\u3002

\u4ed6\u77e5\u9053\u5982\u4f55\u8a08\u7b97\u7d22\u66f8\u865f\uff0c\u5f9e\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6a19\u5716\u66f8\u3002

"},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 6.1 \u00a0 \u96dc\u6e4a\u8868
  • 6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81
  • 6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5
  • 6.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

\u524d\u5169\u7bc0\u4ecb\u7d39\u4e86\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u96dc\u6e4a\u885d\u7a81\u7684\u8655\u7406\u65b9\u6cd5\u3002\u7136\u800c\u7121\u8ad6\u662f\u958b\u653e\u5b9a\u5740\u9084\u662f\u93c8\u5f0f\u4f4d\u5740\uff0c\u5b83\u5011\u53ea\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u767c\u751f\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u7121\u6cd5\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u3002

\u5982\u679c\u96dc\u6e4a\u885d\u7a81\u904e\u65bc\u983b\u7e41\uff0c\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u5247\u6703\u6025\u5287\u52a3\u5316\u3002\u5982\u5716 6-8 \u6240\u793a\uff0c\u5c0d\u65bc\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\uff0c\u7406\u60f3\u60c5\u6cc1\u4e0b\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u5404\u500b\u6876\u4e2d\uff0c\u9054\u5230\u6700\u4f73\u67e5\u8a62\u6548\u7387\uff1b\u6700\u5dee\u60c5\u6cc1\u4e0b\u6240\u6709\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5230\u540c\u4e00\u500b\u6876\u4e2d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u5716 6-8 \u00a0 \u96dc\u6e4a\u885d\u7a81\u7684\u6700\u4f73\u60c5\u6cc1\u8207\u6700\u5dee\u60c5\u6cc1

\u9375\u503c\u5c0d\u7684\u5206\u4f48\u60c5\u6cc1\u7531\u96dc\u6e4a\u51fd\u5f0f\u6c7a\u5b9a\u3002\u56de\u61b6\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u6b65\u9a5f\uff0c\u5148\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u518d\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\uff1a

index = hash(key) % capacity\n

\u89c0\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u7576\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u6642\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u6c7a\u5b9a\u4e86\u8f38\u51fa\u503c\uff0c\u9032\u800c\u6c7a\u5b9a\u4e86\u9375\u503c\u5c0d\u5728\u96dc\u6e4a\u8868\u4e2d\u7684\u5206\u4f48\u60c5\u6cc1\u3002

\u9019\u610f\u5473\u8457\uff0c\u70ba\u4e86\u964d\u4f4e\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u6a5f\u7387\uff0c\u6211\u5011\u61c9\u7576\u5c07\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u7684\u8a2d\u8a08\u4e0a\u3002

"},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u76ee\u6a19","text":"

\u70ba\u4e86\u5be6\u73fe\u201c\u65e2\u5feb\u53c8\u7a69\u201d\u7684\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u5177\u5099\u4ee5\u4e0b\u7279\u9ede\u3002

  • \u78ba\u5b9a\u6027\uff1a\u5c0d\u65bc\u76f8\u540c\u7684\u8f38\u5165\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u59cb\u7d42\u7522\u751f\u76f8\u540c\u7684\u8f38\u51fa\u3002\u9019\u6a23\u624d\u80fd\u78ba\u4fdd\u96dc\u6e4a\u8868\u662f\u53ef\u9760\u7684\u3002
  • \u6548\u7387\u9ad8\uff1a\u8a08\u7b97\u96dc\u6e4a\u503c\u7684\u904e\u7a0b\u61c9\u8a72\u8db3\u5920\u5feb\u3002\u8a08\u7b97\u958b\u92b7\u8d8a\u5c0f\uff0c\u96dc\u6e4a\u8868\u7684\u5be6\u7528\u6027\u8d8a\u9ad8\u3002
  • \u5747\u52fb\u5206\u4f48\uff1a\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u4f7f\u5f97\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u96dc\u6e4a\u8868\u4e2d\u3002\u5206\u4f48\u8d8a\u5747\u52fb\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002

\u5be6\u969b\u4e0a\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u96dc\u6e4a\u8868\uff0c\u9084\u5ee3\u6cdb\u61c9\u7528\u65bc\u5176\u4ed6\u9818\u57df\u4e2d\u3002

  • \u5bc6\u78bc\u5132\u5b58\uff1a\u70ba\u4e86\u4fdd\u8b77\u4f7f\u7528\u8005\u5bc6\u78bc\u7684\u5b89\u5168\uff0c\u7cfb\u7d71\u901a\u5e38\u4e0d\u6703\u76f4\u63a5\u5132\u5b58\u4f7f\u7528\u8005\u7684\u660e\u6587\u5bc6\u78bc\uff0c\u800c\u662f\u5132\u5b58\u5bc6\u78bc\u7684\u96dc\u6e4a\u503c\u3002\u7576\u7528\u6236\u8f38\u5165\u5bc6\u78bc\u6642\uff0c\u7cfb\u7d71\u6703\u5c0d\u8f38\u5165\u7684\u5bc6\u78bc\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u7136\u5f8c\u8207\u5132\u5b58\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u5bc6\u78bc\u5c31\u88ab\u8996\u70ba\u6b63\u78ba\u3002
  • \u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5\uff1a\u8cc7\u6599\u50b3\u9001\u65b9\u53ef\u4ee5\u8a08\u7b97\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\u4e26\u5c07\u5176\u4e00\u540c\u50b3\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8a08\u7b97\u63a5\u6536\u5230\u7684\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\uff0c\u4e26\u8207\u63a5\u6536\u5230\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u8cc7\u6599\u5c31\u88ab\u8996\u70ba\u5b8c\u6574\u3002

\u5c0d\u65bc\u5bc6\u78bc\u5b78\u7684\u76f8\u95dc\u61c9\u7528\uff0c\u70ba\u4e86\u9632\u6b62\u5f9e\u96dc\u6e4a\u503c\u63a8\u5c0e\u51fa\u539f\u59cb\u5bc6\u78bc\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9700\u8981\u5177\u5099\u66f4\u9ad8\u7b49\u7d1a\u7684\u5b89\u5168\u7279\u6027\u3002

  • \u55ae\u5411\u6027\uff1a\u7121\u6cd5\u900f\u904e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u7684\u4efb\u4f55\u8cc7\u8a0a\u3002
  • \u6297\u78b0\u649e\u6027\uff1a\u61c9\u7576\u6975\u96e3\u627e\u5230\u5169\u500b\u4e0d\u540c\u7684\u8f38\u5165\uff0c\u4f7f\u5f97\u5b83\u5011\u7684\u96dc\u6e4a\u503c\u76f8\u540c\u3002
  • \u96ea\u5d29\u6548\u61c9\uff1a\u8f38\u5165\u7684\u5fae\u5c0f\u8b8a\u5316\u61c9\u7576\u5c0e\u81f4\u8f38\u51fa\u7684\u986f\u8457\u4e14\u4e0d\u53ef\u9810\u6e2c\u7684\u8b8a\u5316\u3002

\u8acb\u6ce8\u610f\uff0c\u201c\u5747\u52fb\u5206\u4f48\u201d\u8207\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u5169\u500b\u7368\u7acb\u7684\u6982\u5ff5\uff0c\u6eff\u8db3\u5747\u52fb\u5206\u4f48\u4e0d\u4e00\u5b9a\u6eff\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u96a8\u6a5f\u8f38\u5165 key \u4e0b\uff0c\u96dc\u6e4a\u51fd\u5f0f key % 100 \u53ef\u4ee5\u7522\u751f\u5747\u52fb\u5206\u4f48\u7684\u8f38\u51fa\u3002\u7136\u800c\u8a72\u96dc\u6e4a\u6f14\u7b97\u6cd5\u904e\u65bc\u7c21\u55ae\uff0c\u6240\u6709\u5f8c\u5169\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f38\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u5f9e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u5f9e\u800c\u7834\u89e3\u5bc6\u78bc\u3002

"},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08","text":"

\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u662f\u4e00\u500b\u9700\u8981\u8003\u616e\u8a31\u591a\u56e0\u7d20\u7684\u8907\u96dc\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u5834\u666f\uff0c\u6211\u5011\u4e5f\u80fd\u8a2d\u8a08\u4e00\u4e9b\u7c21\u55ae\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

  • \u52a0\u6cd5\u96dc\u6e4a\uff1a\u5c0d\u8f38\u5165\u7684\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u9032\u884c\u76f8\u52a0\uff0c\u5c07\u5f97\u5230\u7684\u7e3d\u548c\u4f5c\u70ba\u96dc\u6e4a\u503c\u3002
  • \u4e58\u6cd5\u96dc\u6e4a\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u95dc\u6027\uff0c\u6bcf\u8f2a\u4e58\u4ee5\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5404\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u96dc\u6e4a\u503c\u4e2d\u3002
  • \u4e92\u65a5\u6216\u96dc\u6e4a\uff1a\u5c07\u8f38\u5165\u8cc7\u6599\u7684\u6bcf\u500b\u5143\u7d20\u900f\u904e\u4e92\u65a5\u6216\u64cd\u4f5c\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\u3002
  • \u65cb\u8f49\u96dc\u6e4a\uff1a\u5c07\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u7a4d\u4e4b\u524d\u90fd\u6703\u5c0d\u96dc\u6e4a\u503c\u9032\u884c\u65cb\u8f49\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u4e92\u65a5\u6216\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f49\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u96dc\u6e4a */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u96dc\u6e4a */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u96dc\u6e4a */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u96dc\u6e4a ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u96dc\u6e4a ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u4e92\u65a5\u6216\u96dc\u6e4a ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f49\u96dc\u6e4a ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u767c\u73fe\uff0c\u6bcf\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6700\u5f8c\u4e00\u6b65\u90fd\u662f\u5c0d\u5927\u8cea\u6578 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u78ba\u4fdd\u96dc\u6e4a\u503c\u5728\u5408\u9069\u7684\u7bc4\u570d\u5167\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u70ba\u4ec0\u9ebc\u8981\u5f37\u8abf\u5c0d\u8cea\u6578\u53d6\u6a21\uff0c\u6216\u8005\u8aaa\u5c0d\u5408\u6578\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u9ebc\uff1f\u9019\u662f\u4e00\u500b\u6709\u8da3\u7684\u554f\u984c\u3002

\u5148\u4e1f\u64f2\u7d50\u8ad6\uff1a\u4f7f\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u5206\u4f48\u3002\u56e0\u70ba\u8cea\u6578\u4e0d\u8207\u5176\u4ed6\u6578\u5b57\u5b58\u5728\u516c\u7d04\u6578\uff0c\u53ef\u4ee5\u6e1b\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u7522\u751f\u7684\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u5f9e\u800c\u907f\u514d\u96dc\u6e4a\u885d\u7a81\u3002

\u8209\u500b\u4f8b\u5b50\uff0c\u5047\u8a2d\u6211\u5011\u9078\u64c7\u5408\u6578 \\(9\\) \u4f5c\u70ba\u6a21\u6578\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u9ebc\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u9019\u4e09\u500b\u96dc\u6e4a\u503c\u3002

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

\u5982\u679c\u8f38\u5165 key \u6070\u597d\u6eff\u8db3\u9019\u7a2e\u7b49\u5dee\u6578\u5217\u7684\u8cc7\u6599\u5206\u4f48\uff0c\u90a3\u9ebc\u96dc\u6e4a\u503c\u5c31\u6703\u51fa\u73fe\u805a\u5806\u7a4d\uff0c\u5f9e\u800c\u52a0\u91cd\u96dc\u6e4a\u885d\u7a81\u3002\u73fe\u5728\uff0c\u5047\u8a2d\u5c07 modulus \u66ff\u63db\u70ba\u8cea\u6578 \\(13\\) \uff0c\u7531\u65bc key \u548c modulus \u4e4b\u9593\u4e0d\u5b58\u5728\u516c\u7d04\u6578\uff0c\u56e0\u6b64\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u6027\u6703\u660e\u986f\u63d0\u5347\u3002

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u5920\u4fdd\u8b49 key \u662f\u96a8\u6a5f\u5747\u52fb\u5206\u4f48\u7684\uff0c\u90a3\u9ebc\u9078\u64c7\u8cea\u6578\u6216\u8005\u5408\u6578\u4f5c\u70ba\u6a21\u6578\u90fd\u53ef\u4ee5\uff0c\u5b83\u5011\u90fd\u80fd\u8f38\u51fa\u5747\u52fb\u5206\u4f48\u7684\u96dc\u6e4a\u503c\u3002\u800c\u7576 key \u7684\u5206\u4f48\u5b58\u5728\u67d0\u7a2e\u9031\u671f\u6027\u6642\uff0c\u5c0d\u5408\u6578\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73fe\u805a\u96c6\u73fe\u8c61\u3002

\u7e3d\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u901a\u5e38\u9078\u53d6\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4e26\u4e14\u9019\u500b\u8cea\u6578\u6700\u597d\u8db3\u5920\u5927\uff0c\u4ee5\u5118\u53ef\u80fd\u6d88\u9664\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002

"},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u898b\u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

\u4e0d\u96e3\u767c\u73fe\uff0c\u4ee5\u4e0a\u4ecb\u7d39\u7684\u7c21\u55ae\u96dc\u6e4a\u6f14\u7b97\u6cd5\u90fd\u6bd4\u8f03\u201c\u8106\u5f31\u201d\uff0c\u9060\u9060\u6c92\u6709\u9054\u5230\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u76ee\u6a19\u3002\u4f8b\u5982\uff0c\u7531\u65bc\u52a0\u6cd5\u548c\u4e92\u65a5\u6216\u6eff\u8db3\u4ea4\u63db\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u96dc\u6e4a\u548c\u4e92\u65a5\u6216\u96dc\u6e4a\u7121\u6cd5\u5340\u5206\u5167\u5bb9\u76f8\u540c\u4f46\u9806\u5e8f\u4e0d\u540c\u7684\u5b57\u4e32\uff0c\u9019\u53ef\u80fd\u6703\u52a0\u5287\u96dc\u6e4a\u885d\u7a81\uff0c\u4e26\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u554f\u984c\u3002

\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u7528\u4e00\u4e9b\u6a19\u6e96\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u5011\u53ef\u4ee5\u5c07\u4efb\u610f\u9577\u5ea6\u7684\u8f38\u5165\u8cc7\u6599\u5c0d\u6620\u5230\u6046\u5b9a\u9577\u5ea6\u7684\u96dc\u6e4a\u503c\u3002

\u8fd1\u4e00\u500b\u4e16\u7d00\u4ee5\u4f86\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u8655\u5728\u4e0d\u65b7\u5347\u7d1a\u8207\u6700\u4f73\u5316\u7684\u904e\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u52aa\u529b\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u548c\u99ed\u5ba2\u5247\u81f4\u529b\u65bc\u5c0b\u627e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u554f\u984c\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5be6\u969b\u61c9\u7528\u4e2d\u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

  • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u64ca\uff0c\u56e0\u6b64\u5b83\u5011\u88ab\u5404\u985e\u5b89\u5168\u61c9\u7528\u68c4\u7528\u3002
  • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73fe\u6210\u529f\u7684\u653b\u64ca\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u985e\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u4e2d\u3002
  • SHA-3 \u76f8\u8f03 SHA-2 \u7684\u5be6\u73fe\u958b\u92b7\u66f4\u4f4e\u3001\u8a08\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u84cb\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

\u8868 6-2 \u00a0 \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5

MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u6642\u9593 1992 1995 2002 2008 \u8f38\u51fa\u9577\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u96dc\u6e4a\u885d\u7a81 \u8f03\u591a \u8f03\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7d1a \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u9ad8 \u9ad8 \u61c9\u7528 \u5df2\u88ab\u68c4\u7528\uff0c\u4ecd\u7528\u65bc\u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5 \u5df2\u88ab\u68c4\u7528 \u52a0\u5bc6\u8ca8\u5e63\u4ea4\u6613\u9a57\u8b49\u3001\u6578\u5b57\u7c3d\u540d\u7b49 \u53ef\u7528\u65bc\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u96dc\u6e4a\u503c","text":"

\u6211\u5011\u77e5\u9053\uff0c\u96dc\u6e4a\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6578\u3001\u5c0f\u6578\u6216\u5b57\u4e32\u7b49\u8cc7\u6599\u578b\u5225\u3002\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u9019\u4e9b\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u547c\u53eb hash() \u51fd\u5f0f\u4f86\u8a08\u7b97\u5404\u7a2e\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u3002

  • \u6574\u6578\u548c\u5e03\u6797\u91cf\u7684\u96dc\u6e4a\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
  • \u6d6e\u9ede\u6578\u548c\u5b57\u4e32\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u8f03\u70ba\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u8acb\u81ea\u884c\u5b78\u7fd2\u3002
  • \u5143\u7d44\u7684\u96dc\u6e4a\u503c\u662f\u5c0d\u5176\u4e2d\u6bcf\u4e00\u500b\u5143\u7d20\u9032\u884c\u96dc\u6e4a\uff0c\u7136\u5f8c\u5c07\u9019\u4e9b\u96dc\u6e4a\u503c\u7d44\u5408\u8d77\u4f86\uff0c\u5f97\u5230\u55ae\u4e00\u7684\u96dc\u6e4a\u503c\u3002
  • \u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u57fa\u65bc\u5176\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u3002\u900f\u904e\u91cd\u5beb\u7269\u4ef6\u7684\u96dc\u6e4a\u65b9\u6cd5\uff0c\u53ef\u5be6\u73fe\u57fa\u65bc\u5167\u5bb9\u751f\u6210\u96dc\u6e4a\u503c\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u96dc\u6e4a\u503c\u8a08\u7b97\u51fd\u5f0f\u7684\u5b9a\u7fa9\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u6797\u91cf True \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 326484311674566659\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u7bc0\u9ede\u7269\u4ef6 <ListNode object at 0x1058fd810> \u7684\u96dc\u6e4a\u503c\u70ba 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u6797\u91cf 1 \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 4614256650576692846\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5167\u5efa std:hash() \u50c5\u63d0\u4f9b\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\n// \u9663\u5217\u3001\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u9700\u8981\u81ea\u884c\u5be6\u73fe\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@7dc5e7b4 \u7684\u96dc\u6e4a\u503c\u70ba 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729;\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u7bc0\u9ede\u7269\u4ef6 0 \u7684\u96dc\u6e4a\u503c\u70ba 39053774;\n
built_in_hash.go
// Go \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -2465384235396674631\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u9663\u5217 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u96dc\u6e4a\u503c\u70ba -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode \u7684\u96dc\u6e4a\u503c\u70ba -2434780518035996159\n
built_in_hash.js
// JavaScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.ts
// TypeScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u6797\u503c true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2570631074981783\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u7bc0\u9ede\u7269\u4ef6 Instance of 'ListNode' \u7684\u96dc\u6e4a\u503c\u70ba 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2566941990314602357\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7d44 (12836, \"\u5c0f\u54c8\") \u7684\u96dc\u6e4a\u503c\u70ba 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u7bc0\u9ede\u7269\u4ef6 RefCell { value: ListNode { val: 42, next: None } } \u7684\u96dc\u6e4a\u503c\u70ba15387811073369036852\n
built_in_hash.c
// C \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.kt
val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nval str = \"Hello \u6f14\u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@1d81eb93 \u7684\u96dc\u6e4a\u503c\u70ba 495053715\n
built_in_hash.rb
num = 3\nhash_num = num.hash\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1479186995943067893\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u7bc0\u9ede\u7269\u4ef6 #<ListNode:0x000078133140ab70> \u7684\u96dc\u6e4a\u503c\u70ba 4302940560806366381\n
built_in_hash.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u624d\u53ef\u4f5c\u70ba\u96dc\u6e4a\u8868\u7684 key \u3002\u5047\u5982\u6211\u5011\u5c07\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f5c\u70ba key \uff0c\u7576\u4e32\u5217\u7684\u5167\u5bb9\u767c\u751f\u8b8a\u5316\u6642\uff0c\u5b83\u7684\u96dc\u6e4a\u503c\u4e5f\u96a8\u4e4b\u6539\u8b8a\uff0c\u6211\u5011\u5c31\u7121\u6cd5\u5728\u96dc\u6e4a\u8868\u4e2d\u67e5\u8a62\u5230\u539f\u5148\u7684 value \u4e86\u3002

\u96d6\u7136\u81ea\u5b9a\u7fa9\u7269\u4ef6\uff08\u6bd4\u5982\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff09\u7684\u6210\u54e1\u8b8a\u6578\u662f\u53ef\u8b8a\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u96dc\u6e4a\u7684\u3002\u9019\u662f\u56e0\u70ba\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u901a\u5e38\u662f\u57fa\u65bc\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u7269\u4ef6\u7684\u5167\u5bb9\u767c\u751f\u4e86\u8b8a\u5316\uff0c\u4f46\u5b83\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u4e0d\u8b8a\uff0c\u96dc\u6e4a\u503c\u4ecd\u7136\u662f\u4e0d\u8b8a\u7684\u3002

\u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u767c\u73fe\u5728\u4e0d\u540c\u63a7\u5236\u6aaf\u4e2d\u57f7\u884c\u7a0b\u5f0f\u6642\uff0c\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u662f\u4e0d\u540c\u7684\u3002\u9019\u662f\u56e0\u70ba Python \u76f4\u8b6f\u5668\u5728\u6bcf\u6b21\u555f\u52d5\u6642\uff0c\u90fd\u6703\u70ba\u5b57\u4e32\u96dc\u6e4a\u51fd\u5f0f\u52a0\u5165\u4e00\u500b\u96a8\u6a5f\u7684\u9e7d\uff08salt\uff09\u503c\u3002\u9019\u7a2e\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u64ca\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81","text":"

\u4e0a\u4e00\u7bc0\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u5165\u7a7a\u9593\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff0c\u56e0\u6b64\u7406\u8ad6\u4e0a\u96dc\u6e4a\u885d\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f38\u5165\u7a7a\u9593\u70ba\u5168\u9ad4\u6574\u6578\uff0c\u8f38\u51fa\u7a7a\u9593\u70ba\u9663\u5217\u5bb9\u91cf\u5927\u5c0f\uff0c\u5247\u5fc5\u7136\u6709\u591a\u500b\u6574\u6578\u5c0d\u6620\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

\u96dc\u6e4a\u885d\u7a81\u6703\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u932f\u8aa4\uff0c\u56b4\u91cd\u5f71\u97ff\u96dc\u6e4a\u8868\u7684\u53ef\u7528\u6027\u3002\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6bcf\u7576\u9047\u5230\u96dc\u6e4a\u885d\u7a81\u6642\uff0c\u6211\u5011\u5c31\u9032\u884c\u96dc\u6e4a\u8868\u64f4\u5bb9\uff0c\u76f4\u81f3\u885d\u7a81\u6d88\u5931\u70ba\u6b62\u3002\u6b64\u65b9\u6cd5\u7c21\u55ae\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u8981\u9032\u884c\u5927\u91cf\u7684\u8cc7\u6599\u642c\u904b\u8207\u96dc\u6e4a\u503c\u8a08\u7b97\u3002\u70ba\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

  1. \u6539\u826f\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u4f7f\u5f97\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\u3002
  2. \u50c5\u5728\u5fc5\u8981\u6642\uff0c\u5373\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u624d\u57f7\u884c\u64f4\u5bb9\u64cd\u4f5c\u3002

\u96dc\u6e4a\u8868\u7684\u7d50\u69cb\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u548c\u201c\u958b\u653e\u5b9a\u5740\u201d\u3002

"},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u93c8\u5f0f\u4f4d\u5740","text":"

\u5728\u539f\u59cb\u96dc\u6e4a\u8868\u4e2d\uff0c\u6bcf\u500b\u6876\u50c5\u80fd\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u93c8\u5f0f\u4f4d\u5740\uff08separate chaining\uff09\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u63db\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u9375\u503c\u5c0d\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff0c\u5c07\u6240\u6709\u767c\u751f\u885d\u7a81\u7684\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5728\u540c\u4e00\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u5716 6-5 \u5c55\u793a\u4e86\u4e00\u500b\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u4f8b\u5b50\u3002

\u5716 6-5 \u00a0 \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868

\u57fa\u65bc\u93c8\u5f0f\u4f4d\u5740\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u767c\u751f\u4e86\u4ee5\u4e0b\u8b8a\u5316\u3002

  • \u67e5\u8a62\u5143\u7d20\uff1a\u8f38\u5165 key \uff0c\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4e26\u5c0d\u6bd4 key \u4ee5\u67e5\u8a62\u76ee\u6a19\u9375\u503c\u5c0d\u3002
  • \u65b0\u589e\u5143\u7d20\uff1a\u9996\u5148\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u5c07\u7bc0\u9ede\uff08\u9375\u503c\u5c0d\uff09\u65b0\u589e\u5230\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
  • \u522a\u9664\u5143\u7d20\uff1a\u6839\u64da\u96dc\u6e4a\u51fd\u5f0f\u7684\u7d50\u679c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u63a5\u8457\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4ee5\u67e5\u8a62\u76ee\u6a19\u7bc0\u9ede\u4e26\u5c07\u5176\u522a\u9664\u3002

\u93c8\u5f0f\u4f4d\u5740\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

  • \u4f54\u7528\u7a7a\u9593\u589e\u5927\uff1a\u93c8\u7d50\u4e32\u5217\u5305\u542b\u7bc0\u9ede\u6307\u6a19\uff0c\u5b83\u76f8\u6bd4\u9663\u5217\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u67e5\u8a62\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u70ba\u9700\u8981\u7dda\u6027\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u5c0d\u61c9\u5143\u7d20\u3002

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u7d66\u51fa\u4e86\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u7c21\u55ae\u5be6\u73fe\uff0c\u9700\u8981\u6ce8\u610f\u5169\u9ede\u3002

  • \u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\uff0c\u5f9e\u800c\u7c21\u5316\u7a0b\u5f0f\u78bc\u3002\u5728\u9019\u7a2e\u8a2d\u5b9a\u4e0b\uff0c\u96dc\u6e4a\u8868\uff08\u9663\u5217\uff09\u5305\u542b\u591a\u500b\u6876\uff0c\u6bcf\u500b\u6876\u90fd\u662f\u4e00\u500b\u4e32\u5217\u3002
  • \u4ee5\u4e0b\u5be6\u73fe\u5305\u542b\u96dc\u6e4a\u8868\u64f4\u5bb9\u65b9\u6cd5\u3002\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(\\frac{2}{3}\\) \u6642\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u9663\u5217\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;                   // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres;               // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;                // \u64f4\u5bb9\u500d\u6578\n    vector<vector<Pair *>> buckets; // \u6876\u9663\u5217\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n                delete tmp;                       // \u91cb\u653e\u8a18\u61b6\u9ad4\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int      // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int      // \u64f4\u5bb9\u500d\u6578\n    buckets     [][]pair // \u6876\u9663\u5217\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u522a\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [[Pair]] // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    #buckets: Pair[][]; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  late int size; // \u9375\u503c\u5c0d\u6578\u91cf\n  late int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  late double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  late int extendRatio; // \u64f4\u5bb9\u500d\u6578\n  late List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u5efa\u69cb\u5b50 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        None\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Node **buckets;   // \u6876\u9663\u5217\n} HashMapChaining;\n\n/* \u5efa\u69cb\u5b50 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    val extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        // mutablelist \u7121\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u9375\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapChaining\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) { [] } # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u5f88\u9577\u6642\uff0c\u67e5\u8a62\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u6642\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u201cAVL \u6a39\u201d\u6216\u201c\u7d05\u9ed1\u6a39\u201d\uff0c\u5f9e\u800c\u5c07\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u958b\u653e\u5b9a\u5740","text":"

\u958b\u653e\u5b9a\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u800c\u662f\u900f\u904e\u201c\u591a\u6b21\u63a2\u6e2c\u201d\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\uff0c\u63a2\u6e2c\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\u7b49\u3002

\u4e0b\u9762\u4ee5\u7dda\u6027\u63a2\u67e5\u70ba\u4f8b\uff0c\u4ecb\u7d39\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u6a5f\u5236\u3002

"},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7dda\u6027\u63a2\u67e5","text":"

\u7dda\u6027\u63a2\u67e5\u63a1\u7528\u56fa\u5b9a\u6b65\u9577\u7684\u7dda\u6027\u641c\u5c0b\u4f86\u9032\u884c\u63a2\u6e2c\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u8207\u666e\u901a\u96dc\u6e4a\u8868\u6709\u6240\u4e0d\u540c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u767c\u73fe\u6876\u5167\u5df2\u6709\u5143\u7d20\uff0c\u5247\u5f9e\u885d\u7a81\u4f4d\u7f6e\u5411\u5f8c\u7dda\u6027\u8d70\u8a2a\uff08\u6b65\u9577\u901a\u5e38\u70ba \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c07\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u82e5\u767c\u73fe\u96dc\u6e4a\u885d\u7a81\uff0c\u5247\u4f7f\u7528\u76f8\u540c\u6b65\u9577\u5411\u5f8c\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u76f4\u5230\u627e\u5230\u5c0d\u61c9\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8aaa\u660e\u76ee\u6a19\u5143\u7d20\u4e0d\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

\u5716 6-6 \u5c55\u793a\u4e86\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48\u3002\u6839\u64da\u6b64\u96dc\u6e4a\u51fd\u5f0f\uff0c\u6700\u5f8c\u5169\u4f4d\u76f8\u540c\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u900f\u904e\u7dda\u6027\u63a2\u67e5\uff0c\u5b83\u5011\u88ab\u4f9d\u6b21\u5132\u5b58\u5728\u8a72\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

\u5716 6-6 \u00a0 \u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48

\u7136\u800c\uff0c\u7dda\u6027\u63a2\u67e5\u5bb9\u6613\u7522\u751f\u201c\u805a\u96c6\u73fe\u8c61\u201d\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u9663\u5217\u4e2d\u9023\u7e8c\u88ab\u4f54\u7528\u7684\u4f4d\u7f6e\u8d8a\u9577\uff0c\u9019\u4e9b\u9023\u7e8c\u4f4d\u7f6e\u767c\u751f\u96dc\u6e4a\u885d\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u5f9e\u800c\u9032\u4e00\u6b65\u4fc3\u4f7f\u8a72\u4f4d\u7f6e\u7684\u805a\u5806\u7a4d\u751f\u9577\uff0c\u5f62\u6210\u60e1\u6027\u8ff4\u5708\uff0c\u6700\u7d42\u5c0e\u81f4\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u5011\u4e0d\u80fd\u5728\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u4e2d\u76f4\u63a5\u522a\u9664\u5143\u7d20\u3002\u9019\u662f\u56e0\u70ba\u522a\u9664\u5143\u7d20\u6703\u5728\u9663\u5217\u5167\u7522\u751f\u4e00\u500b\u7a7a\u6876 None \uff0c\u800c\u7576\u67e5\u8a62\u5143\u7d20\u6642\uff0c\u7dda\u6027\u63a2\u67e5\u5230\u8a72\u7a7a\u6876\u5c31\u6703\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8a72\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u7121\u6cd5\u518d\u88ab\u8a2a\u554f\u5230\uff0c\u7a0b\u5f0f\u53ef\u80fd\u8aa4\u5224\u9019\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u5716 6-7 \u6240\u793a\u3002

\u5716 6-7 \u00a0 \u5728\u958b\u653e\u5b9a\u5740\u4e2d\u522a\u9664\u5143\u7d20\u5c0e\u81f4\u7684\u67e5\u8a62\u554f\u984c

\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u61f6\u522a\u9664\uff08lazy deletion\uff09\u6a5f\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u5f9e\u96dc\u6e4a\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u500b\u5e38\u6578 TOMBSTONE \u4f86\u6a19\u8a18\u9019\u500b\u6876\u3002\u5728\u8a72\u6a5f\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u9375\u503c\u5c0d\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7dda\u6027\u63a2\u67e5\u5230 TOMBSTONE \u6642\u61c9\u8a72\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u56e0\u70ba\u5176\u4e4b\u4e0b\u53ef\u80fd\u9084\u5b58\u5728\u9375\u503c\u5c0d\u3002

\u7136\u800c\uff0c\u61f6\u522a\u9664\u53ef\u80fd\u6703\u52a0\u901f\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u9000\u5316\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u6b21\u522a\u9664\u64cd\u4f5c\u90fd\u6703\u7522\u751f\u4e00\u500b\u522a\u9664\u6a19\u8a18\uff0c\u96a8\u8457 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u5c0b\u6642\u9593\u4e5f\u6703\u589e\u52a0\uff0c\u56e0\u70ba\u7dda\u6027\u63a2\u67e5\u53ef\u80fd\u9700\u8981\u8df3\u904e\u591a\u500b TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6a19\u5143\u7d20\u3002

\u70ba\u6b64\uff0c\u8003\u616e\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\u8a18\u9304\u9047\u5230\u7684\u9996\u500b TOMBSTONE \u7684\u7d22\u5f15\uff0c\u4e26\u5c07\u641c\u5c0b\u5230\u7684\u76ee\u6a19\u5143\u7d20\u8207\u8a72 TOMBSTONE \u4ea4\u63db\u4f4d\u7f6e\u3002\u9019\u6a23\u505a\u7684\u597d\u8655\u662f\u7576\u6bcf\u6b21\u67e5\u8a62\u6216\u65b0\u589e\u5143\u7d20\u6642\uff0c\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u81f3\u8ddd\u96e2\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6e2c\u8d77\u59cb\u9ede\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u5f9e\u800c\u6700\u4f73\u5316\u67e5\u8a62\u6548\u7387\u3002

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u5305\u542b\u61f6\u522a\u9664\u7684\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u3002\u70ba\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u770b\u4f5c\u4e00\u500b\u201c\u74b0\u5f62\u9663\u5217\u201d\uff0c\u7576\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u9663\u5217\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u522a\u9664\u6a19\u8a18\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4;                     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    const int extendRatio = 2;            // \u64f4\u5bb9\u500d\u6578\n    vector<Pair *> buckets;               // \u6876\u9663\u5217\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    private int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private final int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    private Pair[] buckets; // \u6876\u9663\u5217\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    Pair[] buckets; // \u6876\u9663\u5217\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int     // \u64f4\u5bb9\u500d\u6578\n    buckets     []*pair // \u6876\u9663\u5217\n    TOMBSTONE   *pair   // \u522a\u9664\u6a19\u8a18\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u64da\u9375\u8a08\u7b97\u96dc\u6e4a\u503c\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8a08\u7b97\u7576\u524d\u8ca0\u8f09\u56e0\u5b50\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u7372\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8a18\u9304\u9047\u5230\u7684\u7b2c\u4e00\u500bTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7dda\u6027\u63a2\u67e5\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    }\n    return \"\" // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val\n    }\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        h.size--\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [Pair?] // \u6876\u9663\u5217\n    var TOMBSTONE: Pair // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n    #TOMBSTONE; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.#capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.#extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u9663\u5217\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    private capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    private buckets: Array<Pair | null>; // \u6876\u9663\u5217\n    private TOMBSTONE: Pair; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u9663\u5217\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u9375\u503c\u5c0d\u6578\u91cf\n  int _capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  int _extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n  late List<Pair?> _buckets; // \u6876\u9663\u5217\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity: usize,            // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extend_ratio: usize,        // \u64f4\u5bb9\u500d\u6578\n    buckets: Vec<Option<Pair>>, // \u6876\u9663\u5217\n    TOMBSTONE: Option<Pair>,    // \u522a\u9664\u6a19\u8a18\n}\n\nimpl HashMapOpenAddressing {\n    /* \u5efa\u69cb\u5b50 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u5efa\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        None\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Pair **buckets;   // \u6876\u9663\u5217\n    Pair *TOMBSTONE;  // \u522a\u9664\u6a19\u8a18\n} HashMapOpenAddressing;\n\n/* \u5efa\u69cb\u5b50 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\";\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u9375\u503c\u5c0d\u6578\u91cf\n    private var capacity: Int           // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private val extendRatio: Int        // \u64f4\u5bb9\u500d\u6578\n    private var buckets: Array<Pair?>   // \u6876\u9663\u5217\n    private val TOMBSTONE: Pair         // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u522a\u9664\u6a19\u8a18\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u958b\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6e2c","text":"

\u5e73\u65b9\u63a2\u6e2c\u8207\u7dda\u6027\u63a2\u67e5\u985e\u4f3c\uff0c\u90fd\u662f\u958b\u653e\u5b9a\u5740\u7684\u5e38\u898b\u7b56\u7565\u4e4b\u4e00\u3002\u7576\u767c\u751f\u885d\u7a81\u6642\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e0d\u662f\u7c21\u55ae\u5730\u8df3\u904e\u4e00\u500b\u56fa\u5b9a\u7684\u6b65\u6578\uff0c\u800c\u662f\u8df3\u904e\u201c\u63a2\u6e2c\u6b21\u6578\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6578\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

\u5e73\u65b9\u63a2\u6e2c\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u512a\u52e2\u3002

  • \u5e73\u65b9\u63a2\u6e2c\u900f\u904e\u8df3\u904e\u63a2\u6e2c\u6b21\u6578\u5e73\u65b9\u7684\u8ddd\u96e2\uff0c\u8a66\u5716\u7de9\u89e3\u7dda\u6027\u63a2\u67e5\u7684\u805a\u96c6\u6548\u61c9\u3002
  • \u5e73\u65b9\u63a2\u6e2c\u6703\u8df3\u904e\u66f4\u5927\u7684\u8ddd\u96e2\u4f86\u5c0b\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u65bc\u8cc7\u6599\u5206\u4f48\u5f97\u66f4\u52a0\u5747\u52fb\u3002

\u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e26\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

  • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73fe\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u4f54\u7528\u3002
  • \u7531\u65bc\u5e73\u65b9\u7684\u589e\u9577\uff0c\u5e73\u65b9\u63a2\u6e2c\u53ef\u80fd\u4e0d\u6703\u63a2\u6e2c\u6574\u500b\u96dc\u6e4a\u8868\uff0c\u9019\u610f\u5473\u8457\u5373\u4f7f\u96dc\u6e4a\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e5f\u53ef\u80fd\u7121\u6cd5\u8a2a\u554f\u5230\u5b83\u3002
"},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u96dc\u6e4a","text":"

\u9867\u540d\u601d\u7fa9\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u9032\u884c\u63a2\u6e2c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\) \u51fa\u73fe\u885d\u7a81\uff0c\u5247\u5617\u8a66 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u5f8c\u63d2\u5165\u5143\u7d20\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u96dc\u6e4a\u51fd\u5f0f\u9806\u5e8f\u4e0b\u9032\u884c\u67e5\u8a62\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6642\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5617\u8a66\u6240\u6709\u96dc\u6e4a\u51fd\u5f0f\uff0c\u8aaa\u660e\u96dc\u6e4a\u8868\u4e2d\u4e0d\u5b58\u5728\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de None \u3002

\u8207\u7dda\u6027\u63a2\u67e5\u76f8\u6bd4\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u6703\u5e36\u4f86\u984d\u5916\u7684\u8a08\u7b97\u91cf\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\uff09\u96dc\u6e4a\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u201d\u7684\u554f\u984c\u3002

"},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u9078\u64c7","text":"

\u5404\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u7b56\u7565\uff0c\u4e0b\u9762\u8209\u5e7e\u500b\u4f8b\u5b50\u3002

  • Python \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u507d\u96a8\u6a5f\u6578\u9032\u884c\u63a2\u6e2c\u3002
  • Java \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002\u81ea JDK 1.8 \u4ee5\u4f86\uff0c\u7576 HashMap \u5167\u9663\u5217\u9577\u5ea6\u9054\u5230 64 \u4e14\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u9054\u5230 8 \u6642\uff0c\u93c8\u7d50\u4e32\u5217\u6703\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u80fd\u3002
  • Go \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002Go \u898f\u5b9a\u6bcf\u500b\u6876\u6700\u591a\u5132\u5b58 8 \u500b\u9375\u503c\u5c0d\uff0c\u8d85\u51fa\u5bb9\u91cf\u5247\u9023\u7dda\u4e00\u500b\u6ea2\u4f4d\u6876\uff1b\u7576\u6ea2\u4f4d\u6876\u904e\u591a\u6642\uff0c\u6703\u57f7\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u64f4\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u78ba\u4fdd\u6548\u80fd\u3002
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u96dc\u6e4a\u8868","text":"

\u96dc\u6e4a\u8868\uff08hash table\uff09\uff0c\u53c8\u7a31\u6563\u5217\u8868\uff0c\u5b83\u900f\u904e\u5efa\u7acb\u9375 key \u8207\u503c value \u4e4b\u9593\u7684\u5c0d\u6620\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u3002\u5177\u9ad4\u800c\u8a00\uff0c\u6211\u5011\u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u4e00\u500b\u9375 key \uff0c\u5247\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u5c0d\u61c9\u7684\u503c value \u3002

\u5982\u5716 6-1 \u6240\u793a\uff0c\u7d66\u5b9a \\(n\\) \u500b\u5b78\u751f\uff0c\u6bcf\u500b\u5b78\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b78\u865f\u201d\u5169\u9805\u8cc7\u6599\u3002\u5047\u5982\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u201c\u8f38\u5165\u4e00\u500b\u5b78\u865f\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u59d3\u540d\u201d\u7684\u67e5\u8a62\u529f\u80fd\uff0c\u5247\u53ef\u4ee5\u63a1\u7528\u5716 6-1 \u6240\u793a\u7684\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002

\u5716 6-1 \u00a0 \u96dc\u6e4a\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u96dc\u6e4a\u8868\u5916\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e5f\u53ef\u4ee5\u5be6\u73fe\u67e5\u8a62\u529f\u80fd\uff0c\u5b83\u5011\u7684\u6548\u7387\u5c0d\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

  • \u65b0\u589e\u5143\u7d20\uff1a\u50c5\u9700\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u662f\u4e82\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u8d70\u8a2a\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u522a\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8a62\u5230\u5143\u7d20\uff0c\u518d\u5f9e\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u4e2d\u522a\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002

\u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8a62\u6548\u7387\u5c0d\u6bd4

\u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u96dc\u6e4a\u8868 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u65b0\u589e\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

\u89c0\u5bdf\u767c\u73fe\uff0c\u5728\u96dc\u6e4a\u8868\u4e2d\u9032\u884c\u589e\u522a\u67e5\u6539\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u96dc\u6e4a\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u96dc\u6e4a\u8868\u7684\u5e38\u898b\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8a62\u64cd\u4f5c\u3001\u65b0\u589e\u9375\u503c\u5c0d\u548c\u522a\u9664\u9375\u503c\u5c0d\u7b49\uff0c\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap: dict = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.pop(10583)\n
hash_map.cpp
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nunordered_map<int, string> map;\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.erase(10583);\n
hash_map.java
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u56c9\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9d28\");\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
hash_map.cs
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nDictionary<int, string> map = new() {\n    /* \u65b0\u589e\u64cd\u4f5c */\n    // \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u56c9\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9d28\" }\n};\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.Remove(10583);\n
hash_map_test.go
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nhmap := make(map[int]string)\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\ndelete(hmap, 10583)\n
hash_map.swift
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\n
hash_map.ts
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map<number, string>();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\nconsole.info('\\n\u65b0\u589e\u5b8c\u6210\u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f38\u5165\u5b78\u865f 15937 \uff0c\u67e5\u8a62\u5230\u59d3\u540d ' + name);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\nconsole.info('\\n\u522a\u9664 10583 \u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<int, String> map = {};\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u56c9\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9d28\".to_string());\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
hash_map.kt
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583)\n
hash_map.rb
# \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.delete(10583)\n
hash_map.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u96dc\u6e4a\u8868\u6709\u4e09\u7a2e\u5e38\u7528\u7684\u8d70\u8a2a\u65b9\u5f0f\uff1a\u8d70\u8a2a\u9375\u503c\u5c0d\u3001\u8d70\u8a2a\u9375\u548c\u8d70\u8a2a\u503c\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key in hmap.keys():\n    print(key)\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u8d70\u8a2a key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys {\n    print(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
hash_map.rs
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
hash_map.kt
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (key in map.keys) {\n    println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
hash_map.rb
# \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nhmap.keys.each { |key| puts key }\n\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nhmap.values.each { |val| puts val }\n
hash_map.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u96dc\u6e4a\u8868\u7c21\u55ae\u5be6\u73fe","text":"

\u6211\u5011\u5148\u8003\u616e\u6700\u7c21\u55ae\u7684\u60c5\u6cc1\uff0c\u50c5\u7528\u4e00\u500b\u9663\u5217\u4f86\u5be6\u73fe\u96dc\u6e4a\u8868\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5c07\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u7a7a\u4f4d\u7a31\u70ba\u6876\uff08bucket\uff09\uff0c\u6bcf\u500b\u6876\u53ef\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u56e0\u6b64\uff0c\u67e5\u8a62\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5c0d\u61c9\u7684\u6876\uff0c\u4e26\u5728\u6876\u4e2d\u7372\u53d6 value \u3002

\u90a3\u9ebc\uff0c\u5982\u4f55\u57fa\u65bc key \u5b9a\u4f4d\u5c0d\u61c9\u7684\u6876\u5462\uff1f\u9019\u662f\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\uff08hash function\uff09\u5be6\u73fe\u7684\u3002\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u8f38\u51fa\u7a7a\u9593\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8f38\u5165\u7a7a\u9593\u662f\u6240\u6709 key \uff0c\u8f38\u51fa\u7a7a\u9593\u662f\u6240\u6709\u6876\uff08\u9663\u5217\u7d22\u5f15\uff09\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u8f38\u5165\u4e00\u500b key \uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u8a72 key \u5c0d\u61c9\u7684\u9375\u503c\u5c0d\u5728\u9663\u5217\u4e2d\u7684\u5132\u5b58\u4f4d\u7f6e\u3002

\u8f38\u5165\u4e00\u500b key \uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u904e\u7a0b\u5206\u70ba\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u900f\u904e\u67d0\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u8a08\u7b97\u5f97\u5230\u96dc\u6e4a\u503c\u3002
  2. \u5c07\u96dc\u6e4a\u503c\u5c0d\u6876\u6578\u91cf\uff08\u9663\u5217\u9577\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u5f9e\u800c\u7372\u53d6\u8a72 key \u5c0d\u61c9\u7684\u9663\u5217\u7d22\u5f15 index \u3002
index = hash(key) % capacity\n

\u96a8\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u96dc\u6e4a\u8868\u4e2d\u8a2a\u554f\u5c0d\u61c9\u7684\u6876\uff0c\u5f9e\u800c\u7372\u53d6 value \u3002

\u8a2d\u9663\u5217\u9577\u5ea6 capacity = 100\u3001\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u96dc\u6e4a\u51fd\u5f0f\u70ba key % 100 \u3002\u5716 6-2 \u4ee5 key \u5b78\u865f\u548c value \u59d3\u540d\u70ba\u4f8b\uff0c\u5c55\u793a\u4e86\u96dc\u6e4a\u51fd\u5f0f\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u5716 6-2 \u00a0 \u96dc\u6e4a\u51fd\u5f0f\u5de5\u4f5c\u539f\u7406

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u7c21\u55ae\u96dc\u6e4a\u8868\u3002\u5176\u4e2d\uff0c\u6211\u5011\u5c07 key \u548c value \u5c01\u88dd\u6210\u4e00\u500b\u985e\u5225 Pair \uff0c\u4ee5\u8868\u793a\u9375\u503c\u5c0d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u9375\u503c\u5c0d\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u9375\u503c\u5c0d */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\u4e26\u7f6e\u70ba nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u9375\u503c\u5c0d */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u9375\u503c\u5c0d int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u9375\u503c\u5c0d */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    a.buckets[index] = nil\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u5c0d */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375 */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u7372\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u9375\u503c\u5c0d */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = nil\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u9375\u503c\u5c0d */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375 */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u9375\u503c\u5c0d */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u9375\u503c\u5c0d int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u5efa\u69cb\u5b50 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375 */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u7372\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u9375\u503c\u5c0d */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u9375\u503c\u5c0d ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 ###\nclass ArrayHashMap\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375 ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u9375\u503c\u5c0d\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u500b\u9577\u5ea6\u70ba 100 \u7684\u6876\uff08\u9663\u5217\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u96dc\u6e4a\u51fd\u5f0f\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8a62\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u65b0\u589e\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u522a\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u7372\u53d6\u6240\u6709\u9375\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u7372\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u5217\u5370\u96dc\u6e4a\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u8207\u64f4\u5bb9","text":"

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u6240\u6709 key \u69cb\u6210\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u9663\u5217\u6240\u6709\u7d22\u5f15\u69cb\u6210\u7684\u8f38\u51fa\u7a7a\u9593\uff0c\u800c\u8f38\u5165\u7a7a\u9593\u5f80\u5f80\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7406\u8ad6\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u76f8\u540c\u8f38\u51fa\u201d\u7684\u60c5\u6cc1\u3002

\u5c0d\u65bc\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u96dc\u6e4a\u51fd\u5f0f\uff0c\u7576\u8f38\u5165\u7684 key \u5f8c\u5169\u4f4d\u76f8\u540c\u6642\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u51fa\u7d50\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8a62\u5b78\u865f\u70ba 12836 \u548c 20336 \u7684\u5169\u500b\u5b78\u751f\u6642\uff0c\u6211\u5011\u5f97\u5230\uff1a

12836 % 100 = 36\n20336 % 100 = 36\n

\u5982\u5716 6-3 \u6240\u793a\uff0c\u5169\u500b\u5b78\u865f\u6307\u5411\u4e86\u540c\u4e00\u500b\u59d3\u540d\uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002\u6211\u5011\u5c07\u9019\u7a2e\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u540c\u4e00\u8f38\u51fa\u7684\u60c5\u6cc1\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\uff08hash collision\uff09\u3002

\u5716 6-3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u793a\u4f8b

\u5bb9\u6613\u60f3\u5230\uff0c\u96dc\u6e4a\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u500b key \u88ab\u5206\u914d\u5230\u540c\u4e00\u500b\u6876\u4e2d\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\uff0c\u885d\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002

\u5982\u5716 6-4 \u6240\u793a\uff0c\u64f4\u5bb9\u524d\u9375\u503c\u5c0d (136, A) \u548c (236, D) \u767c\u751f\u885d\u7a81\uff0c\u64f4\u5bb9\u5f8c\u885d\u7a81\u6d88\u5931\u3002

\u5716 6-4 \u00a0 \u96dc\u6e4a\u8868\u64f4\u5bb9

\u985e\u4f3c\u65bc\u9663\u5217\u64f4\u5bb9\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u5c07\u6240\u6709\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u9077\u79fb\u81f3\u65b0\u96dc\u6e4a\u8868\uff0c\u975e\u5e38\u8017\u6642\uff1b\u4e26\u4e14\u7531\u65bc\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u6539\u8b8a\uff0c\u6211\u5011\u9700\u8981\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u4f86\u91cd\u65b0\u8a08\u7b97\u6240\u6709\u9375\u503c\u5c0d\u7684\u5132\u5b58\u4f4d\u7f6e\uff0c\u9019\u9032\u4e00\u6b65\u589e\u52a0\u4e86\u64f4\u5bb9\u904e\u7a0b\u7684\u8a08\u7b97\u958b\u92b7\u3002\u70ba\u6b64\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u9810\u7559\u8db3\u5920\u5927\u7684\u96dc\u6e4a\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\u3002

\u8ca0\u8f09\u56e0\u5b50\uff08load factor\uff09\u662f\u96dc\u6e4a\u8868\u7684\u4e00\u500b\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u7684\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u7528\u65bc\u8861\u91cf\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u89f8\u767c\u689d\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(0.75\\) \u6642\uff0c\u7cfb\u7d71\u6703\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u8f38\u5165 key \uff0c\u96dc\u6e4a\u8868\u80fd\u5920\u5728 \\(O(1)\\) \u6642\u9593\u5167\u67e5\u8a62\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u898b\u7684\u96dc\u6e4a\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8a62\u3001\u65b0\u589e\u9375\u503c\u5c0d\u3001\u522a\u9664\u9375\u503c\u5c0d\u548c\u8d70\u8a2a\u96dc\u6e4a\u8868\u7b49\u3002
  • \u96dc\u6e4a\u51fd\u5f0f\u5c07 key \u5c0d\u6620\u70ba\u9663\u5217\u7d22\u5f15\uff0c\u5f9e\u800c\u8a2a\u554f\u5c0d\u61c9\u6876\u4e26\u7372\u53d6 value \u3002
  • \u5169\u500b\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f8c\u5f97\u5230\u76f8\u540c\u7684\u9663\u5217\u7d22\u5f15\uff0c\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u51fa\u932f\uff0c\u9019\u7a2e\u73fe\u8c61\u88ab\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\u3002
  • \u96dc\u6e4a\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\u3002\u8207\u9663\u5217\u64f4\u5bb9\u985e\u4f3c\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u64cd\u4f5c\u7684\u958b\u92b7\u5f88\u5927\u3002
  • \u8ca0\u8f09\u56e0\u5b50\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u4e2d\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u53cd\u6620\u4e86\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89f8\u767c\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u689d\u4ef6\u3002
  • \u93c8\u5f0f\u4f4d\u5740\u900f\u904e\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u5316\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u6240\u6709\u885d\u7a81\u5143\u7d20\u5132\u5b58\u5728\u540c\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6703\u964d\u4f4e\u67e5\u8a62\u6548\u7387\uff0c\u53ef\u4ee5\u900f\u904e\u9032\u4e00\u6b65\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4f86\u63d0\u9ad8\u6548\u7387\u3002
  • \u958b\u653e\u5b9a\u5740\u900f\u904e\u591a\u6b21\u63a2\u6e2c\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\u3002\u7dda\u6027\u63a2\u67e5\u4f7f\u7528\u56fa\u5b9a\u6b65\u9577\uff0c\u7f3a\u9ede\u662f\u4e0d\u80fd\u522a\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u7522\u751f\u805a\u96c6\u3002\u591a\u6b21\u96dc\u6e4a\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u9032\u884c\u63a2\u6e2c\uff0c\u76f8\u8f03\u7dda\u6027\u63a2\u67e5\u66f4\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u589e\u52a0\u4e86\u8a08\u7b97\u91cf\u3002
  • \u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u93c8\u5f0f\u4f4d\u5740\uff0c\u800c Python \u7684 Dict \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002
  • \u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5e0c\u671b\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5177\u6709\u78ba\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u52fb\u5206\u4f48\u7684\u7279\u9ede\u3002\u5728\u5bc6\u78bc\u5b78\u4e2d\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9084\u61c9\u8a72\u5177\u5099\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u61c9\u3002
  • \u96dc\u6e4a\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u5747\u52fb\u5206\u4f48\uff0c\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002
  • \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u65bc\u6821\u9a57\u6a94\u6848\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u65bc\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u3002
  • \u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u662f\u53ef\u96dc\u6e4a\u7684\u3002
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f \\(O(n)\\) \uff1f

\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u7576\u96dc\u6e4a\u51fd\u5f0f\u8a2d\u8a08\u5f97\u6bd4\u8f03\u597d\u3001\u5bb9\u91cf\u8a2d\u5b9a\u6bd4\u8f03\u5408\u7406\u3001\u885d\u7a81\u6bd4\u8f03\u5e73\u5747\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u5011\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u96dc\u6e4a\u8868\u6642\uff0c\u901a\u5e38\u8a8d\u70ba\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u4e0d\u4f7f\u7528\u96dc\u6e4a\u51fd\u5f0f \\(f(x) = x\\) \u5462\uff1f\u9019\u6a23\u5c31\u4e0d\u6703\u6709\u885d\u7a81\u4e86\u3002

\u5728 \\(f(x) = x\\) \u96dc\u6e4a\u51fd\u5f0f\u4e0b\uff0c\u6bcf\u500b\u5143\u7d20\u5c0d\u61c9\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u9019\u8207\u9663\u5217\u7b49\u50f9\u3002\u7136\u800c\uff0c\u8f38\u5165\u7a7a\u9593\u901a\u5e38\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff08\u9663\u5217\u9577\u5ea6\uff09\uff0c\u56e0\u6b64\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96dc\u6e4a\u8868\u7684\u76ee\u6a19\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u72c0\u614b\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u7a7a\u9593\uff0c\u4e26\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8a62\u6548\u7387\u3002

Q\uff1a\u96dc\u6e4a\u8868\u5e95\u5c64\u5be6\u73fe\u662f\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u4e8c\u5143\u6a39\uff0c\u4f46\u70ba\u4ec0\u9ebc\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u5011\u66f4\u9ad8\u5462\uff1f

\u9996\u5148\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u6548\u7387\u8b8a\u9ad8\uff0c\u4f46\u7a7a\u9593\u6548\u7387\u8b8a\u4f4e\u4e86\u3002\u96dc\u6e4a\u8868\u6709\u76f8\u7576\u4e00\u90e8\u5206\u8a18\u61b6\u9ad4\u672a\u4f7f\u7528\u3002

\u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u5834\u666f\u4e0b\u6642\u9593\u6548\u7387\u8b8a\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u500b\u529f\u80fd\u80fd\u5920\u5728\u76f8\u540c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u4f7f\u7528\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u90a3\u9ebc\u901a\u5e38\u6bd4\u96dc\u6e4a\u8868\u66f4\u5feb\u3002\u9019\u662f\u56e0\u70ba\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u9700\u8981\u958b\u92b7\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u7684\u5e38\u6578\u9805\u66f4\u5927\u3002

\u6700\u5f8c\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u80fd\u767c\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u93c8\u5f0f\u4f4d\u5740\u4e2d\uff0c\u6211\u5011\u63a1\u53d6\u5728\u93c8\u7d50\u4e32\u5217\u6216\u7d05\u9ed1\u6a39\u4e2d\u57f7\u884c\u67e5\u8a62\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u6642\u9593\u7684\u98a8\u96aa\u3002

Q\uff1a\u591a\u6b21\u96dc\u6e4a\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\u55ce\uff1f\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u9084\u80fd\u518d\u6b21\u4f7f\u7528\u55ce\uff1f

\u591a\u6b21\u96dc\u6e4a\u662f\u958b\u653e\u5b9a\u5740\u7684\u4e00\u7a2e\uff0c\u958b\u653e\u5b9a\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u900f\u904e\u6a19\u8a18\u522a\u9664\u3002\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u7576\u5c07\u65b0\u5143\u7d20\u63d2\u5165\u96dc\u6e4a\u8868\uff0c\u4e26\u4e14\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u4f4d\u7f6e\u6642\uff0c\u8a72\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u9019\u6a23\u505a\u65e2\u80fd\u4fdd\u6301\u96dc\u6e4a\u8868\u7684\u63a2\u6e2c\u5e8f\u5217\u4e0d\u8b8a\uff0c\u53c8\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\u4f7f\u7528\u7387\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\uff0c\u67e5\u8a62\u5143\u7d20\u7684\u6642\u5019\u6703\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u5462\uff1f

\u67e5\u8a62\u7684\u6642\u5019\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u5c0d\u61c9\u7684\u6876\u548c\u9375\u503c\u5c0d\uff0c\u767c\u73fe key \u4e0d\u5339\u914d\uff0c\u9019\u5c31\u4ee3\u8868\u6709\u96dc\u6e4a\u885d\u7a81\u3002\u56e0\u6b64\uff0c\u7dda\u6027\u63a2\u67e5\u6cd5\u6703\u6839\u64da\u9810\u5148\u8a2d\u5b9a\u7684\u6b65\u9577\u4f9d\u6b21\u5411\u4e0b\u67e5\u8a62\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u78ba\u7684\u9375\u503c\u5c0d\u6216\u7121\u6cd5\u627e\u5230\u8df3\u51fa\u70ba\u6b62\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u64f4\u5bb9\u80fd\u5920\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\uff1f

\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\uff0c\u8b93\u8f38\u51fa\u503c\u843d\u5728\u9663\u5217\u7d22\u5f15\u7bc4\u570d\u5167\uff1b\u5728\u64f4\u5bb9\u5f8c\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u767c\u751f\u8b8a\u5316\uff0c\u800c key \u5c0d\u61c9\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u500b\u6876\u7684\u591a\u500b key \uff0c\u5728\u64f4\u5bb9\u5f8c\u53ef\u80fd\u6703\u88ab\u5206\u914d\u5230\u591a\u500b\u6876\u4e2d\uff0c\u5f9e\u800c\u5be6\u73fe\u96dc\u6e4a\u885d\u7a81\u7684\u7de9\u89e3\u3002

"},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806\u7a4d","text":"

Abstract

\u5806\u7a4d\u5c31\u50cf\u662f\u5c71\u5dbd\u5cf0\u5dd2\uff0c\u5c64\u758a\u8d77\u4f0f\u3001\u5f62\u614b\u5404\u7570\u3002

\u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u932f\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u7e3d\u662f\u6700\u5148\u6620\u5165\u773c\u7c3e\u3002

"},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 8.1 \u00a0 \u5806\u7a4d
  • 8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c
  • 8.3 \u00a0 Top-k \u554f\u984c
  • 8.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c","text":"

\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u4f86\u69cb\u5efa\u4e00\u500b\u5806\u7a4d\uff0c\u9019\u500b\u904e\u7a0b\u88ab\u7a31\u70ba\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u3002

"},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u85c9\u52a9\u5165\u5806\u7a4d\u64cd\u4f5c\u5be6\u73fe","text":"

\u6211\u5011\u9996\u5148\u5efa\u7acb\u4e00\u500b\u7a7a\u5806\u7a4d\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e32\u5217\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u5143\u7d20\u57f7\u884c\u201c\u5165\u5806\u7a4d\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u5806\u7a4d\u7684\u5c3e\u90e8\uff0c\u518d\u5c0d\u8a72\u5143\u7d20\u57f7\u884c\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u5806\u7a4d\u5316\u3002

\u6bcf\u7576\u4e00\u500b\u5143\u7d20\u5165\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u65bc\u7bc0\u9ede\u662f\u5f9e\u9802\u5230\u5e95\u4f9d\u6b21\u88ab\u65b0\u589e\u9032\u4e8c\u5143\u6a39\u7684\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u69cb\u5efa\u7684\u3002

\u8a2d\u5143\u7d20\u6578\u91cf\u70ba \\(n\\) \uff0c\u6bcf\u500b\u5143\u7d20\u7684\u5165\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u6642\u9593\uff0c\u56e0\u6b64\u8a72\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u900f\u904e\u8d70\u8a2a\u5806\u7a4d\u5316\u5be6\u73fe","text":"

\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5be6\u73fe\u4e00\u7a2e\u66f4\u70ba\u9ad8\u6548\u7684\u5efa\u5806\u7a4d\u65b9\u6cd5\uff0c\u5171\u5206\u70ba\u5169\u6b65\u3002

  1. \u5c07\u4e32\u5217\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u5730\u65b0\u589e\u5230\u5806\u7a4d\u4e2d\uff0c\u6b64\u6642\u5806\u7a4d\u7684\u6027\u8cea\u5c1a\u672a\u5f97\u5230\u6eff\u8db3\u3002
  2. \u5012\u5e8f\u8d70\u8a2a\u5806\u7a4d\uff08\u5c64\u5e8f\u8d70\u8a2a\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u975e\u8449\u7bc0\u9ede\u57f7\u884c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u3002

\u6bcf\u7576\u5806\u7a4d\u5316\u4e00\u500b\u7bc0\u9ede\u5f8c\uff0c\u4ee5\u8a72\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\u5c31\u5f62\u6210\u4e00\u500b\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\u3002\u800c\u7531\u65bc\u662f\u5012\u5e8f\u8d70\u8a2a\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u69cb\u5efa\u7684\u3002

\u4e4b\u6240\u4ee5\u9078\u64c7\u5012\u5e8f\u8d70\u8a2a\uff0c\u662f\u56e0\u70ba\u9019\u6a23\u80fd\u5920\u4fdd\u8b49\u7576\u524d\u7bc0\u9ede\u4e4b\u4e0b\u7684\u5b50\u6a39\u5df2\u7d93\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u9019\u6a23\u5806\u7a4d\u5316\u7576\u524d\u7bc0\u9ede\u624d\u662f\u6709\u6548\u7684\u3002

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u7531\u65bc\u8449\u7bc0\u9ede\u6c92\u6709\u5b50\u7bc0\u9ede\uff0c\u56e0\u6b64\u5b83\u5011\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u7121\u9808\u5806\u7a4d\u5316\u3002\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u6700\u5f8c\u4e00\u500b\u975e\u8449\u7bc0\u9ede\u662f\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u6211\u5011\u5f9e\u5b83\u958b\u59cb\u5012\u5e8f\u8d70\u8a2a\u4e26\u57f7\u884c\u5806\u7a4d\u5316\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\"\"\"\n    # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    self.max_heap = nums\n    # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(vector<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums;\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<Integer> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new List<int>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\ninit(nums: [Int]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums?: number[]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<int> nums) {\n  // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  _maxHeap = nums;\n  // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\u7a4d\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9802\u5806\u7a4d */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u4e32\u5217\u800c\u975e\u9663\u5217\uff0c\u9019\u6a23\u7121\u9808\u8003\u616e\u64f4\u5bb9\u554f\u984c\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\n    init {\n        // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n        maxHeap.addAll(nums!!)\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u63db\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    fun push(_val: Int) {\n        // \u65b0\u589e\u7bc0\u9ede\n        maxHeap.add(_val)\n        // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n            val p = parent(i)\n            // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, p)\n            // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806\u7a4d */\n    fun pop(): Int {\n        // \u5224\u7a7a\u8655\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u522a\u9664\u7bc0\u9ede\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n        return _val\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, ma)\n            // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n            i = ma\n        }\n    }\n\n    /* \u5217\u5370\u5806\u7a4d\uff08\u4e8c\u5143\u6a39\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u4e0b\u9762\uff0c\u6211\u5011\u4f86\u5617\u8a66\u63a8\u7b97\u7b2c\u4e8c\u7a2e\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

  • \u5047\u8a2d\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u5247\u8449\u7bc0\u9ede\u6578\u91cf\u70ba \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u70ba\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u7a4d\u5316\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\((n - 1) / 2\\) \u3002
  • \u5728\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u7684\u904e\u7a0b\u4e2d\uff0c\u6bcf\u500b\u7bc0\u9ede\u6700\u591a\u5806\u7a4d\u5316\u5230\u8449\u7bc0\u9ede\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u70ba\u4e8c\u5143\u6a39\u9ad8\u5ea6 \\(\\log n\\) \u3002

\u5c07\u4e0a\u8ff0\u5169\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u7a4d\u904e\u7a0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u4f46\u9019\u500b\u4f30\u7b97\u7d50\u679c\u4e26\u4e0d\u6e96\u78ba\uff0c\u56e0\u70ba\u6211\u5011\u6c92\u6709\u8003\u616e\u5230\u4e8c\u5143\u6a39\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf\u9060\u591a\u65bc\u9802\u5c64\u7bc0\u9ede\u7684\u6027\u8cea\u3002

\u63a5\u4e0b\u4f86\u6211\u5011\u4f86\u9032\u884c\u66f4\u70ba\u6e96\u78ba\u7684\u8a08\u7b97\u3002\u70ba\u4e86\u964d\u4f4e\u8a08\u7b97\u96e3\u5ea6\uff0c\u5047\u8a2d\u7d66\u5b9a\u4e00\u500b\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \u3001\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff0c\u8a72\u5047\u8a2d\u4e0d\u6703\u5f71\u97ff\u8a08\u7b97\u7d50\u679c\u7684\u6b63\u78ba\u6027\u3002

\u5716 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u5404\u5c64\u7bc0\u9ede\u6578\u91cf

\u5982\u5716 8-5 \u6240\u793a\uff0c\u7bc0\u9ede\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u7b49\u65bc\u8a72\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u800c\u8a72\u8ddd\u96e2\u6b63\u662f\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u5404\u5c64\u7684\u201c\u7bc0\u9ede\u6578\u91cf \\(\\times\\) \u7bc0\u9ede\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u7bc0\u9ede\u7684\u5806\u7a4d\u5316\u8fed\u4ee3\u6b21\u6578\u7684\u7e3d\u548c\u3002

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

\u5316\u7c21\u4e0a\u5f0f\u9700\u8981\u85c9\u52a9\u4e2d\u5b78\u7684\u6578\u5217\u77e5\u8b58\uff0c\u5148\u5c07 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

\u4f7f\u7528\u932f\u4f4d\u76f8\u6e1b\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u6e1b\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

\u89c0\u5bdf\u4e0a\u5f0f\uff0c\u767c\u73fe \\(T(h)\\) \u662f\u4e00\u500b\u7b49\u6bd4\u6578\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

\u9032\u4e00\u6b65\uff0c\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u8907\u96dc\u5ea6\u70ba \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806\u7a4d","text":"

\u5806\u7a4d\uff08heap\uff09\u662f\u4e00\u7a2e\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u4e3b\u8981\u53ef\u5206\u70ba\u5169\u7a2e\u578b\u5225\uff0c\u5982\u5716 8-1 \u6240\u793a\u3002

  • \u5c0f\u9802\u5806\u7a4d\uff08min heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\leq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002
  • \u5927\u9802\u5806\u7a4d\uff08max heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\geq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002

\u5716 8-1 \u00a0 \u5c0f\u9802\u5806\u7a4d\u8207\u5927\u9802\u5806\u7a4d

\u5806\u7a4d\u4f5c\u70ba\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u6700\u5e95\u5c64\u7bc0\u9ede\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u3002
  • \u6211\u5011\u5c07\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u9802\u201d\uff0c\u5c07\u5e95\u5c64\u6700\u9760\u53f3\u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u5e95\u201d\u3002
  • \u5c0d\u65bc\u5927\u9802\u5806\u7a4d\uff08\u5c0f\u9802\u5806\u7a4d\uff09\uff0c\u5806\u7a4d\u9802\u5143\u7d20\uff08\u6839\u7bc0\u9ede\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u662f\u512a\u5148\u4f47\u5217\uff08priority queue\uff09\uff0c\u9019\u662f\u4e00\u7a2e\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b9a\u7fa9\u70ba\u5177\u6709\u512a\u5148\u9806\u5e8f\u6392\u5e8f\u7684\u4f47\u5217\u3002

\u5be6\u969b\u4e0a\uff0c\u5806\u7a4d\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u512a\u5148\u4f47\u5217\uff0c\u5927\u9802\u5806\u7a4d\u76f8\u7576\u65bc\u5143\u7d20\u6309\u5f9e\u5927\u5230\u5c0f\u7684\u9806\u5e8f\u51fa\u5217\u7684\u512a\u5148\u4f47\u5217\u3002\u5f9e\u4f7f\u7528\u89d2\u5ea6\u4f86\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u201c\u512a\u5148\u4f47\u5217\u201d\u548c\u201c\u5806\u7a4d\u201d\u770b\u4f5c\u7b49\u50f9\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u56e0\u6b64\uff0c\u672c\u66f8\u5c0d\u5169\u8005\u4e0d\u505a\u7279\u5225\u5340\u5206\uff0c\u7d71\u4e00\u7a31\u4f5c\u201c\u5806\u7a4d\u201d\u3002

\u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u898b\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

\u8868 8-1 \u00a0 \u5806\u7a4d\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\) pop() \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) peek() \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\uff08\u5c0d\u65bc\u5927 / \u5c0f\u9802\u5806\u7a4d\u5206\u5225\u70ba\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u7372\u53d6\u5806\u7a4d\u7684\u5143\u7d20\u6578\u91cf \\(O(1)\\) isEmpty() \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a \\(O(1)\\)

\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u5806\u7a4d\u985e\u5225\uff08\u6216\u512a\u5148\u4f47\u5217\u985e\u5225\uff09\u3002

\u985e\u4f3c\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u201c\u5f9e\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u5f9e\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u8a2d\u5b9a\u4e00\u500b flag \u6216\u4fee\u6539 Comparator \u5be6\u73fe\u201c\u5c0f\u9802\u5806\u7a4d\u201d\u8207\u201c\u5927\u9802\u5806\u7a4d\u201d\u4e4b\u9593\u7684\u8f49\u63db\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u7d44\u9810\u8a2d\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n# \u8003\u616e\u5c07\u201c\u5143\u7d20\u53d6\u8ca0\u201d\u5f8c\u518d\u5165\u5806\u7a4d\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5c07\u5927\u5c0f\u95dc\u4fc2\u985b\u5012\uff0c\u5f9e\u800c\u5be6\u73fe\u5927\u9802\u5806\u7a4d\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u6642\u5c0d\u61c9\u5c0f\u9802\u5806\u7a4d\uff0cflag = -1 \u6642\u5c0d\u61c9\u5927\u9802\u5806\u7a4d\n\n# \u5143\u7d20\u5165\u5806\u7a4d\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\n# \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u7372\u53d6\u5806\u7a4d\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8a9e\u8a00\u4e2d\u53ef\u4ee5\u900f\u904e\u5be6\u73fe heap.Interface \u4f86\u69cb\u5efa\u6574\u6578\u5927\u9802\u5806\u7a4d\n// \u5be6\u73fe heap.Interface \u9700\u8981\u540c\u6642\u5be6\u73fe sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u63a8\u5165\u5143\u7d20\u5230\u5806\u7a4d\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u70ba\u53c3\u6578\n    // \u56e0\u70ba\u5b83\u5011\u4e0d\u50c5\u6703\u5c0d\u5207\u7247\u7684\u5167\u5bb9\u9032\u884c\u8abf\u6574\uff0c\u9084\u6703\u4fee\u6539\u5207\u7247\u7684\u9577\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u5f48\u51fa\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u7a4d\u5143\u7d20\u5b58\u653e\u5728\u6700\u5f8c\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\uff0c\u5247\u9700\u8981\u8abf\u6574\u70ba\u5c0f\u65bc\u865f\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806\u7a4d */\n    // \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u65b0\u589e\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u7a4d\u9802\u5143\u7d20\u70ba %d\\n\", top)\n\n    /* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u7a4d\u5143\u7d20\u6578\u91cf\u70ba %d\\n\", size)\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u7a4d\u662f\u5426\u70ba\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// Swift \u7684 Heap \u578b\u5225\u540c\u6642\u652f\u6301\u6700\u5927\u5806\u7a4d\u548c\u6700\u5c0f\u5806\u7a4d\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.kt
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7a4d\u7684\u5be6\u73fe","text":"

\u4e0b\u6587\u5be6\u73fe\u7684\u662f\u5927\u9802\u5806\u7a4d\u3002\u82e5\u8981\u5c07\u5176\u8f49\u63db\u70ba\u5c0f\u9802\u5806\u7a4d\uff0c\u53ea\u9700\u5c07\u6240\u6709\u5927\u5c0f\u908f\u8f2f\u5224\u65b7\u9032\u884c\u9006\u8f49\uff08\u4f8b\u5982\uff0c\u5c07 \\(\\geq\\) \u66ff\u63db\u70ba \\(\\leq\\) \uff09\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

"},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7a4d\u7684\u5132\u5b58\u8207\u8868\u793a","text":"

\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u8b1b\u904e\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u7531\u65bc\u5806\u7a4d\u6b63\u662f\u4e00\u7a2e\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u56e0\u6b64\u6211\u5011\u5c07\u63a1\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002

\u7576\u4f7f\u7528\u9663\u5217\u8868\u793a\u4e8c\u5143\u6a39\u6642\uff0c\u5143\u7d20\u4ee3\u8868\u7bc0\u9ede\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u7bc0\u9ede\u5728\u4e8c\u5143\u6a39\u4e2d\u7684\u4f4d\u7f6e\u3002\u7bc0\u9ede\u6307\u6a19\u900f\u904e\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u4f86\u5be6\u73fe\u3002

\u5982\u5716 8-2 \u6240\u793a\uff0c\u7d66\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 2\\) \uff0c\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u7576\u7d22\u5f15\u8d8a\u754c\u6642\uff0c\u8868\u793a\u7a7a\u7bc0\u9ede\u6216\u7bc0\u9ede\u4e0d\u5b58\u5728\u3002

\u5716 8-2 \u00a0 \u5806\u7a4d\u7684\u8868\u793a\u8207\u5132\u5b58

\u6211\u5011\u53ef\u4ee5\u5c07\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20","text":"

\u5806\u7a4d\u9802\u5143\u7d20\u5373\u70ba\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u4e5f\u5c31\u662f\u4e32\u5217\u7684\u9996\u500b\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806\u7a4d","text":"

\u7d66\u5b9a\u5143\u7d20 val \uff0c\u6211\u5011\u9996\u5148\u5c07\u5176\u65b0\u589e\u5230\u5806\u7a4d\u5e95\u3002\u65b0\u589e\u4e4b\u5f8c\uff0c\u7531\u65bc val \u53ef\u80fd\u5927\u65bc\u5806\u7a4d\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7a4d\u7684\u6210\u7acb\u689d\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u58de\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u5fa9\u5f9e\u63d2\u5165\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u9019\u500b\u64cd\u4f5c\u88ab\u7a31\u70ba\u5806\u7a4d\u5316\uff08heapify\uff09\u3002

\u8003\u616e\u5f9e\u5165\u5806\u7a4d\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u5806\u7a4d\u5316\u3002\u5982\u5716 8-3 \u6240\u793a\uff0c\u6211\u5011\u6bd4\u8f03\u63d2\u5165\u7bc0\u9ede\u8207\u5176\u7236\u7bc0\u9ede\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u7bc0\u9ede\u66f4\u5927\uff0c\u5247\u5c07\u5b83\u5011\u4ea4\u63db\u3002\u7136\u5f8c\u7e7c\u7e8c\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u5f9e\u5e95\u81f3\u9802\u4fee\u5fa9\u5806\u7a4d\u4e2d\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u76f4\u81f3\u8d8a\u904e\u6839\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

<1><2><3><4><5><6><7><8><9>

\u5716 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u7a4d\u6b65\u9a5f

\u8a2d\u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \uff0c\u5247\u6a39\u7684\u9ad8\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u7a4d\u5316\u64cd\u4f5c\u7684\u8ff4\u5708\u8f2a\u6578\u6700\u591a\u70ba \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\u7a4d\"\"\"\n    # \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.append(val)\n    # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p = self.parent(i)\n        # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p)\n        # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.push_back(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap[i], maxHeap[p]);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid Push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.Add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc (h *maxHeap) push(val any) {\n    // \u65b0\u589e\u7bc0\u9ede\n    h.data = append(h.data, val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p := h.parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc push(val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.append(val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = parent(i: i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.#maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.#parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val: number): void {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n  // \u65b0\u589e\u7bc0\u9ede\n  _maxHeap.add(val);\n  // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    int p = _parent(i);\n    // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, p);\n    // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfn push(&mut self, val: i32) {\n    // \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u7bc0\u9ede i \u5df2\u7d93\u662f\u5806\u7a4d\u9802\u7bc0\u9ede\u4e86\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if i == 0 {\n            break;\n        }\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = Self::parent(i);\n        // \u7576\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c\u4e0d\u61c9\u8a72\u65b0\u589e\u9019\u9ebc\u591a\u7bc0\u9ede\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(maxHeap, i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfun push(_val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(_val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        val p = parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806\u7a4d ###\ndef push(val)\n  # \u65b0\u589e\u7bc0\u9ede\n  @max_heap << val\n  # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  sift_up(size - 1)\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    p = parent(i)\n    # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, p)\n    # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\u7a4d\nfn push(self: *Self, val: T) !void {\n    // \u65b0\u589e\u7bc0\u9ede\n    try self.max_heap.?.append(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        var p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d","text":"

\u5806\u7a4d\u9802\u5143\u7d20\u662f\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u5373\u4e32\u5217\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u5011\u76f4\u63a5\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\uff0c\u90a3\u9ebc\u4e8c\u5143\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u7d22\u5f15\u90fd\u6703\u767c\u751f\u8b8a\u5316\uff0c\u9019\u5c07\u4f7f\u5f97\u5f8c\u7e8c\u4f7f\u7528\u5806\u7a4d\u5316\u9032\u884c\u4fee\u5fa9\u8b8a\u5f97\u56f0\u96e3\u3002\u70ba\u4e86\u5118\u91cf\u6e1b\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u8b8a\u52d5\uff0c\u6211\u5011\u63a1\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9a5f\u3002

  1. \u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff09\u3002
  2. \u4ea4\u63db\u5b8c\u6210\u5f8c\uff0c\u5c07\u5806\u7a4d\u5e95\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\uff08\u6ce8\u610f\uff0c\u7531\u65bc\u5df2\u7d93\u4ea4\u63db\uff0c\u56e0\u6b64\u5be6\u969b\u4e0a\u522a\u9664\u7684\u662f\u539f\u4f86\u7684\u5806\u7a4d\u9802\u5143\u7d20\uff09\u3002
  3. \u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u3002

\u5982\u5716 8-4 \u6240\u793a\uff0c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u8207\u201c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\u201d\u76f8\u53cd\uff0c\u6211\u5011\u5c07\u6839\u7bc0\u9ede\u7684\u503c\u8207\u5176\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u503c\u9032\u884c\u6bd4\u8f03\uff0c\u5c07\u6700\u5927\u7684\u5b50\u7bc0\u9ede\u8207\u6839\u7bc0\u9ede\u4ea4\u63db\u3002\u7136\u5f8c\u8ff4\u5708\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

<1><2><3><4><5><6><7><8><9><10>

\u5716 8-4 \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u6b65\u9a5f

\u8207\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\u7a4d\"\"\"\n    # \u5224\u7a7a\u8655\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u522a\u9664\u7bc0\u9ede\n    val = self.max_heap.pop()\n    # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma)\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nvoid pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u7a4d\u70ba\u7a7a\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u522a\u9664\u7bc0\u9ede\n    maxHeap.pop_back();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.remove(size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint Pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u7bc0\u9ede i \u6700\u5927\u201d\u6216\u201c\u8d8a\u904e\u8449\u7bc0\u9ede\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u8655\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u522a\u9664\u7bc0\u9ede\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, max)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u8655\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    let val = maxHeap.remove(at: size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806\u7a4d */\npop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u7a4d\u70ba\u7a7a');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.#maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806\u7a4d */\npop(): number {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n  // \u5224\u7a7a\u8655\u7406\n  if (isEmpty()) throw Exception('\u5806\u7a4d\u70ba\u7a7a');\n  // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u522a\u9664\u7bc0\u9ede\n  int val = _maxHeap.removeLast();\n  // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, ma);\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u8655\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    let val = self.max_heap.pop().unwrap();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, max);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfun pop(): Int {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return _val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806\u7a4d ###\ndef pop\n  # \u5224\u7a7a\u8655\u7406\n  raise IndexError, \"\u5806\u7a4d\u70ba\u7a7a\" if is_empty?\n  # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u522a\u9664\u7bc0\u9ede\n  val = @max_heap.pop\n  # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  val\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, ma)\n    # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\u7a4d\nfn pop(self: *Self) !T {\n    // \u5224\u65b7\u8655\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    var val = self.max_heap.?.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n} \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7a4d\u7684\u5e38\u898b\u61c9\u7528","text":"
  • \u512a\u5148\u4f47\u5217\uff1a\u5806\u7a4d\u901a\u5e38\u4f5c\u70ba\u5be6\u73fe\u512a\u5148\u4f47\u5217\u7684\u9996\u9078\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \uff0c\u800c\u5efa\u968a\u64cd\u4f5c\u70ba \\(O(n)\\) \uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
  • \u5806\u7a4d\u6392\u5e8f\uff1a\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u5b83\u5011\u5efa\u7acb\u4e00\u500b\u5806\u7a4d\uff0c\u7136\u5f8c\u4e0d\u65b7\u5730\u57f7\u884c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u8cc7\u6599\u3002\u7136\u800c\uff0c\u6211\u5011\u901a\u5e38\u6703\u4f7f\u7528\u4e00\u7a2e\u66f4\u512a\u96c5\u7684\u65b9\u5f0f\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\uff0c\u8a73\u898b\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u7ae0\u7bc0\u3002
  • \u7372\u53d6\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\uff1a\u9019\u662f\u4e00\u500b\u7d93\u5178\u7684\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u540c\u6642\u4e5f\u662f\u4e00\u7a2e\u5178\u578b\u61c9\u7528\uff0c\u4f8b\u5982\u9078\u64c7\u71b1\u5ea6\u524d 10 \u7684\u65b0\u805e\u4f5c\u70ba\u5fae\u535a\u71b1\u641c\uff0c\u9078\u53d6\u92b7\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5806\u7a4d\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u6839\u64da\u6210\u7acb\u689d\u4ef6\u53ef\u5206\u70ba\u5927\u9802\u5806\u7a4d\u548c\u5c0f\u9802\u5806\u7a4d\u3002\u5927\uff08\u5c0f\uff09\u9802\u5806\u7a4d\u7684\u5806\u7a4d\u9802\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
  • \u512a\u5148\u4f47\u5217\u7684\u5b9a\u7fa9\u662f\u5177\u6709\u51fa\u5217\u512a\u5148\u9806\u5e8f\u7684\u4f47\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u7a4d\u4f86\u5be6\u73fe\u3002
  • \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\)\u3001\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) \u548c\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
  • \u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u8868\u793a\uff0c\u56e0\u6b64\u6211\u5011\u901a\u5e38\u4f7f\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002
  • \u5806\u7a4d\u5316\u64cd\u4f5c\u7528\u65bc\u7dad\u8b77\u5806\u7a4d\u7684\u6027\u8cea\uff0c\u5728\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u90fd\u6703\u7528\u5230\u3002
  • \u8f38\u5165 \\(n\\) \u500b\u5143\u7d20\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
  • Top-k \u662f\u4e00\u500b\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u9ad8\u6548\u89e3\u6c7a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8cc7\u6599\u7d50\u69cb\u7684\u201c\u5806\u7a4d\u201d\u8207\u8a18\u61b6\u9ad4\u7ba1\u7406\u7684\u201c\u5806\u7a4d\u201d\u662f\u540c\u4e00\u500b\u6982\u5ff5\u55ce\uff1f

\u5169\u8005\u4e0d\u662f\u540c\u4e00\u500b\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u7a4d\u201d\u3002\u8a08\u7b97\u6a5f\u7cfb\u7d71\u8a18\u61b6\u9ad4\u4e2d\u7684\u5806\u7a4d\u662f\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6642\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u5132\u5b58\u8cc7\u6599\u3002\u7a0b\u5f0f\u53ef\u4ee5\u8acb\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u7a4d\u8a18\u61b6\u9ad4\uff0c\u7528\u65bc\u5132\u5b58\u5982\u7269\u4ef6\u548c\u9663\u5217\u7b49\u8907\u96dc\u7d50\u69cb\u3002\u7576\u9019\u4e9b\u8cc7\u6599\u4e0d\u518d\u9700\u8981\u6642\uff0c\u7a0b\u5f0f\u9700\u8981\u91cb\u653e\u9019\u4e9b\u8a18\u61b6\u9ad4\uff0c\u4ee5\u9632\u6b62\u8a18\u61b6\u9ad4\u6d41\u5931\u3002\u76f8\u8f03\u65bc\u5806\u758a\u8a18\u61b6\u9ad4\uff0c\u5806\u7a4d\u8a18\u61b6\u9ad4\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8b39\u614e\uff0c\u4f7f\u7528\u4e0d\u7576\u53ef\u80fd\u6703\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d41\u5931\u548c\u91ce\u6307\u6a19\u7b49\u554f\u984c\u3002

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u7121\u5e8f\u9663\u5217 nums \uff0c\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002

\u5c0d\u65bc\u8a72\u554f\u984c\uff0c\u6211\u5011\u5148\u4ecb\u7d39\u5169\u7a2e\u601d\u8def\u6bd4\u8f03\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7d39\u6548\u7387\u66f4\u9ad8\u7684\u5806\u7a4d\u89e3\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u8d70\u8a2a\u9078\u64c7","text":"

\u6211\u5011\u53ef\u4ee5\u9032\u884c\u5716 8-6 \u6240\u793a\u7684 \\(k\\) \u8f2a\u8d70\u8a2a\uff0c\u5206\u5225\u5728\u6bcf\u8f2a\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\) \u3002

\u6b64\u65b9\u6cd5\u53ea\u9069\u7528\u65bc \\(k \\ll n\\) \u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u7576 \\(k\\) \u8207 \\(n\\) \u6bd4\u8f03\u63a5\u8fd1\u6642\uff0c\u5176\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411\u65bc \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u6642\u3002

\u5716 8-6 \u00a0 \u8d70\u8a2a\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

Tip

\u7576 \\(k = n\\) \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u6642\u7b49\u50f9\u65bc\u201c\u9078\u64c7\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

\u5982\u5716 8-7 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u5c0d\u9663\u5217 nums \u9032\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u908a\u7684 \\(k\\) \u500b\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u986f\u7136\uff0c\u8a72\u65b9\u6cd5\u201c\u8d85\u984d\u201d\u5b8c\u6210\u4efb\u52d9\u4e86\uff0c\u56e0\u70ba\u6211\u5011\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

\u5716 8-7 \u00a0 \u6392\u5e8f\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

"},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806\u7a4d","text":"

\u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u5806\u7a4d\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u6c7a Top-k \u554f\u984c\uff0c\u6d41\u7a0b\u5982\u5716 8-8 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u5176\u5806\u7a4d\u9802\u5143\u7d20\u6700\u5c0f\u3002
  2. \u5148\u5c07\u9663\u5217\u7684\u524d \\(k\\) \u500b\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u7a4d\u3002
  3. \u5f9e\u7b2c \\(k + 1\\) \u500b\u5143\u7d20\u958b\u59cb\uff0c\u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\uff0c\u4e26\u5c07\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\u3002
  4. \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u5806\u7a4d\u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 8-8 \u00a0 \u57fa\u65bc\u5806\u7a4d\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    heap = []\n    # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in range(k, len(nums)):\n        # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    PriorityQueue<int, int> heap = new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u4e26\u5c07\u524d k \u500b\u5143\u7d20\u5efa\u5806\u7a4d\n    var heap = Heap(nums.prefix(k))\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\uff0c\u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9802\u5806\u7a4d\uff0c\u4f7f\u7528 Reverse \u5c07\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\u7684\u51fd\u5f0f\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    val heap = PriorityQueue<Int>()\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (i in k..<nums.size) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n  # \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n  max_heap = MaxHeap.new([])\n\n  # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for i in k...nums.length\n    # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u5171\u57f7\u884c\u4e86 \\(n\\) \u8f2a\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u6700\u5927\u9577\u5ea6\u70ba \\(k\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002\u8a72\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u7576 \\(k\\) \u8f03\u5c0f\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \uff1b\u7576 \\(k\\) \u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u6703\u8d85\u904e \\(O(n \\log n)\\) \u3002

\u53e6\u5916\uff0c\u8a72\u65b9\u6cd5\u9069\u7528\u65bc\u52d5\u614b\u8cc7\u6599\u6d41\u7684\u4f7f\u7528\u5834\u666f\u3002\u5728\u4e0d\u65b7\u52a0\u5165\u8cc7\u6599\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u6301\u7e8c\u7dad\u8b77\u5806\u7a4d\u5167\u7684\u5143\u7d20\uff0c\u5f9e\u800c\u5be6\u73fe\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u7684\u52d5\u614b\u66f4\u65b0\u3002

"},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

\u5e7e\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u528d\u6307 Offer\u201d\u7cfb\u5217\u984c\u89e3\uff0c\u53d7\u5230\u4e86\u8a31\u591a\u8b80\u8005\u7684\u9f13\u52f5\u548c\u652f\u6301\u3002\u5728\u8207\u8b80\u8005\u4ea4\u6d41\u671f\u9593\uff0c\u6211\u6700\u5e38\u88ab\u554f\u7684\u4e00\u500b\u554f\u984c\u662f\u201c\u5982\u4f55\u5165\u9580\u6f14\u7b97\u6cd5\u201d\u3002\u9010\u6f38\u5730\uff0c\u6211\u5c0d\u9019\u500b\u554f\u984c\u7522\u751f\u4e86\u6fc3\u539a\u7684\u8208\u8da3\u3002

\u5169\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u984c\u4f3c\u4e4e\u662f\u6700\u53d7\u6b61\u8fce\u7684\u65b9\u6cd5\uff0c\u7c21\u55ae\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u984c\u5c31\u5982\u540c\u73a9\u201c\u6383\u96f7\u201d\u904a\u6232\uff0c\u81ea\u5b78\u80fd\u529b\u5f37\u7684\u4eba\u80fd\u5920\u9806\u5229\u5c07\u5730\u96f7\u9010\u500b\u6392\u6389\uff0c\u800c\u57fa\u790e\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6eff\u982d\u662f\u5305\uff0c\u4e26\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7e2e\u3002\u901a\u8b80\u6559\u6750\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u505a\u6cd5\uff0c\u4f46\u5c0d\u65bc\u9762\u5411\u6c42\u8077\u7684\u4eba\u4f86\u8aaa\uff0c\u7562\u696d\u8ad6\u6587\u3001\u6295\u905e\u7c21\u6b77\u3001\u6e96\u5099\u7b46\u8a66\u548c\u9762\u8a66\u5df2\u7d93\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u66f8\u5f80\u5f80\u8b8a\u6210\u4e86\u4e00\u9805\u8271\u9245\u7684\u6311\u6230\u3002

\u5982\u679c\u4f60\u4e5f\u9762\u81e8\u985e\u4f3c\u7684\u56f0\u64fe\uff0c\u90a3\u9ebc\u5f88\u5e78\u904b\u9019\u672c\u66f8\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u66f8\u662f\u6211\u5c0d\u9019\u500b\u554f\u984c\u7d66\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u512a\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u7a4d\u6975\u7684\u5617\u8a66\u3002\u672c\u66f8\u96d6\u7136\u4e0d\u8db3\u4ee5\u8b93\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u6703\u5f15\u5c0e\u4f60\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u201c\u77e5\u8b58\u5730\u5716\u201d\uff0c\u5e36\u4f60\u77ad\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72c0\u3001\u5927\u5c0f\u548c\u5206\u4f48\u4f4d\u7f6e\uff0c\u8b93\u4f60\u638c\u63e1\u5404\u7a2e\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u9019\u4e9b\u672c\u9818\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u984c\u548c\u95b1\u8b80\u6587\u737b\uff0c\u9010\u6b65\u69cb\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8b58\u9ad4\u7cfb\u3002

\u6211\u6df1\u6df1\u8d0a\u540c\u8cbb\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u5f9e\u9019\u500b\u610f\u7fa9\u4e0a\u770b\uff0c\u9019\u672c\u66f8\u4e26\u975e\u5b8c\u5168\u201c\u514d\u8cbb\u201d\u3002\u70ba\u4e86\u4e0d\u8f9c\u8ca0\u4f60\u70ba\u672c\u66f8\u6240\u4ed8\u51fa\u7684\u5bf6\u8cb4\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u6703\u7aed\u76e1\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u4f86\u5b8c\u6210\u672c\u66f8\u7684\u5275\u4f5c\u3002

\u672c\u4eba\u81ea\u77e5\u5b78\u758f\u624d\u6dfa\uff0c\u66f8\u4e2d\u5167\u5bb9\u96d6\u7136\u5df2\u7d93\u904e\u4e00\u6bb5\u6642\u9593\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8a31\u591a\u932f\u8aa4\uff0c\u61c7\u8acb\u5404\u4f4d\u8001\u5e2b\u548c\u540c\u5b78\u6279\u8a55\u6307\u6b63\u3002

Hello\uff0c\u6f14\u7b97\u6cd5\uff01

\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u7d66\u4e16\u754c\u5e36\u4f86\u4e86\u5de8\u5927\u8b8a\u9769\uff0c\u5b83\u6191\u85c9\u9ad8\u901f\u7684\u8a08\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7a0b\u5f0f\u8a2d\u8a08\u6027\uff0c\u6210\u70ba\u4e86\u57f7\u884c\u6f14\u7b97\u6cd5\u8207\u8655\u7406\u8cc7\u6599\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u7121\u8ad6\u662f\u96fb\u5b50\u904a\u6232\u7684\u903c\u771f\u756b\u9762\u3001\u81ea\u52d5\u99d5\u99db\u7684\u667a\u6167\u6c7a\u7b56\uff0c\u9084\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4e92\u52d5\uff0c\u9019\u4e9b\u61c9\u7528\u90fd\u662f\u6f14\u7b97\u6cd5\u5728\u8a08\u7b97\u6a5f\u4e0a\u7684\u7cbe\u5999\u6f14\u7e79\u3002

\u4e8b\u5be6\u4e0a\uff0c\u5728\u8a08\u7b97\u6a5f\u554f\u4e16\u4e4b\u524d\uff0c\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u5c31\u5df2\u7d93\u5b58\u5728\u65bc\u4e16\u754c\u7684\u5404\u500b\u89d2\u843d\u3002\u65e9\u671f\u7684\u6f14\u7b97\u6cd5\u76f8\u5c0d\u7c21\u55ae\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8a08\u6578\u65b9\u6cd5\u548c\u5de5\u5177\u88fd\u4f5c\u6b65\u9a5f\u7b49\u3002\u96a8\u8457\u6587\u660e\u7684\u9032\u6b65\uff0c\u6f14\u7b97\u6cd5\u9010\u6f38\u8b8a\u5f97\u66f4\u52a0\u7cbe\u7d30\u548c\u8907\u96dc\u3002\u5f9e\u5de7\u596a\u5929\u5de5\u7684\u5320\u4eba\u6280\u85dd\u3001\u5230\u89e3\u653e\u751f\u7522\u529b\u7684\u5de5\u696d\u7522\u54c1\u3001\u518d\u5230\u5b87\u5b99\u57f7\u884c\u7684\u79d1\u5b78\u898f\u5f8b\uff0c\u5e7e\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u9a5a\u6b4e\u7684\u4e8b\u7269\u80cc\u5f8c\uff0c\u90fd\u96b1\u85cf\u8457\u7cbe\u5999\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002

\u540c\u6a23\uff0c\u8cc7\u6599\u7d50\u69cb\u7121\u8655\u4e0d\u5728\uff1a\u5927\u5230\u793e\u6703\u7db2\u8def\uff0c\u5c0f\u5230\u5730\u9435\u7dda\u8def\uff0c\u8a31\u591a\u7cfb\u7d71\u90fd\u53ef\u4ee5\u5efa\u6a21\u70ba\u201c\u5716\u201d\uff1b\u5927\u5230\u4e00\u500b\u570b\u5bb6\uff0c\u5c0f\u5230\u4e00\u500b\u5bb6\u5ead\uff0c\u793e\u6703\u7684\u4e3b\u8981\u7d44\u7e54\u5f62\u5f0f\u5448\u73fe\u51fa\u201c\u6a39\u201d\u7684\u7279\u5fb5\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u5806\u758a\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u5f8c\u624d\u80fd\u812b\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5247\u5982\u540c\u201c\u4f47\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u500b\u201c\u96dc\u6e4a\u8868\u201d\uff0c\u80fd\u5920\u5feb\u901f\u67e5\u8a62\u76ee\u6a19\u8a5e\u689d\u3002

\u672c\u66f8\u65e8\u5728\u900f\u904e\u6e05\u6670\u6613\u61c2\u7684\u52d5\u756b\u5716\u89e3\u548c\u53ef\u57f7\u884c\u7684\u7a0b\u5f0f\u78bc\u793a\u4f8b\uff0c\u4f7f\u8b80\u8005\u7406\u89e3\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u4e26\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u4f86\u5be6\u73fe\u5b83\u5011\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u672c\u66f8\u81f4\u529b\u65bc\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u8907\u96dc\u4e16\u754c\u4e2d\u7684\u751f\u52d5\u9ad4\u73fe\uff0c\u5c55\u73fe\u6f14\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u66f8\u80fd\u5920\u5e6b\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8b58\u6f14\u7b97\u6cd5","text":"

Abstract

\u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u8207\u8cc7\u6599\u4ea4\u7e54\u5728\u4e00\u8d77\uff0c\u88d9\u896c\u4e0a\u98c4\u63da\u8457\u6f14\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

\u5979\u9080\u8acb\u4f60\u5171\u821e\uff0c\u8acb\u7dca\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6eff\u908f\u8f2f\u8207\u7f8e\u611f\u7684\u6f14\u7b97\u6cd5\u4e16\u754c\u3002

"},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728
  • 1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc
  • 1.3 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728","text":"

\u7576\u6211\u5011\u807d\u5230\u201c\u6f14\u7b97\u6cd5\u201d\u9019\u500b\u8a5e\u6642\uff0c\u5f88\u81ea\u7136\u5730\u6703\u60f3\u5230\u6578\u5b78\u3002\u7136\u800c\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u6d89\u53ca\u8907\u96dc\u6578\u5b78\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8cf4\u57fa\u672c\u908f\u8f2f\uff0c\u9019\u4e9b\u908f\u8f2f\u5728\u6211\u5011\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u8655\u8655\u53ef\u898b\u3002

\u5728\u6b63\u5f0f\u63a2\u8a0e\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u500b\u6709\u8da3\u7684\u4e8b\u5be6\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u4e26\u7fd2\u6163\u5c07\u5b83\u5011\u61c9\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c07\u8209\u5e7e\u500b\u5177\u9ad4\u7684\u4f8b\u5b50\u4f86\u8b49\u5be6\u9019\u4e00\u9ede\u3002

\u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u88e1\uff0c\u6bcf\u500b\u6f22\u5b57\u90fd\u5c0d\u61c9\u4e00\u500b\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\u7684\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u67e5\u8a62\u4e00\u500b\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u6703\u6309\u7167\u5716 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5be6\u73fe\u3002

  1. \u7ffb\u958b\u5b57\u5178\u7d04\u4e00\u534a\u7684\u9801\u6578\uff0c\u6aa2\u8996\u8a72\u9801\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u9ebc\uff0c\u5047\u8a2d\u9996\u5b57\u6bcd\u70ba \\(m\\) \u3002
  2. \u7531\u65bc\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u65bc \\(m\\) \u4e4b\u5f8c\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u8a62\u7bc4\u570d\u7e2e\u5c0f\u5230\u5f8c\u534a\u90e8\u5206\u3002
  3. \u4e0d\u65b7\u91cd\u8907\u6b65\u9a5f 1. \u548c \u6b65\u9a5f 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u9801\u78bc\u70ba\u6b62\u3002
<1><2><3><4><5>

\u5716 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9a5f

\u67e5\u5b57\u5178\u9019\u500b\u5c0f\u5b78\u751f\u5fc5\u5099\u6280\u80fd\uff0c\u5be6\u969b\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u6f14\u7b97\u6cd5\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b57\u5178\u8996\u70ba\u4e00\u500b\u5df2\u6392\u5e8f\u7684\u201c\u9663\u5217\u201d\uff1b\u5f9e\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u3002

\u4f8b\u4e8c\uff1a\u6574\u7406\u64b2\u514b\u3002\u6211\u5011\u5728\u6253\u724c\u6642\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u64b2\u514b\u724c\uff0c\u4f7f\u5176\u5f9e\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5be6\u73fe\u6d41\u7a0b\u5982\u5716 1-2 \u6240\u793a\u3002

  1. \u5c07\u64b2\u514b\u724c\u5283\u5206\u70ba\u201c\u6709\u5e8f\u201d\u548c\u201c\u7121\u5e8f\u201d\u5169\u90e8\u5206\uff0c\u4e26\u5047\u8a2d\u521d\u59cb\u72c0\u614b\u4e0b\u6700\u5de6 1 \u5f35\u64b2\u514b\u724c\u5df2\u7d93\u6709\u5e8f\u3002
  2. \u5728\u7121\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f35\u64b2\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u78ba\u4f4d\u7f6e\uff1b\u5b8c\u6210\u5f8c\u6700\u5de6 2 \u5f35\u64b2\u514b\u5df2\u7d93\u6709\u5e8f\u3002
  3. \u4e0d\u65b7\u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u6bcf\u4e00\u8f2a\u5c07\u4e00\u5f35\u64b2\u514b\u724c\u5f9e\u7121\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u64b2\u514b\u724c\u90fd\u6709\u5e8f\u3002

\u5716 1-2 \u00a0 \u64b2\u514b\u6392\u5e8f\u6b65\u9a5f

\u4e0a\u8ff0\u6574\u7406\u64b2\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\uff0c\u5b83\u5728\u8655\u7406\u5c0f\u578b\u8cc7\u6599\u96c6\u6642\u975e\u5e38\u9ad8\u6548\u3002\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u7684\u6392\u5e8f\u5eab\u51fd\u5f0f\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

\u4f8b\u4e09\uff1a\u8ca8\u5e63\u627e\u96f6\u3002\u5047\u8a2d\u6211\u5011\u5728\u8d85\u5e02\u8cfc\u8cb7\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7d66\u4e86\u6536\u9280\u54e1 \\(100\\) \u5143\uff0c\u5247\u6536\u9280\u54e1\u9700\u8981\u627e\u6211\u5011 \\(31\\) \u5143\u3002\u4ed6\u6703\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u5716 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

  1. \u53ef\u9078\u9805\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8ca8\u5e63\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
  2. \u5f9e\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u9918 \\(31 - 20 = 11\\) \u5143\u3002
  3. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u9918 \\(11 - 10 = 1\\) \u5143\u3002
  4. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u9918 \\(1 - 1 = 0\\) \u5143\u3002
  5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u70ba \\(20 + 10 + 1 = 31\\) \u5143\u3002

\u5716 1-3 \u00a0 \u8ca8\u5e63\u627e\u96f6\u904e\u7a0b

\u5728\u4ee5\u4e0a\u6b65\u9a5f\u4e2d\uff0c\u6211\u5011\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\uff08\u5118\u53ef\u80fd\u7528\u5927\u9762\u984d\u7684\u8ca8\u5e63\uff09\uff0c\u6700\u7d42\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u8caa\u5a6a\u201d\u6f14\u7b97\u6cd5\u3002

\u5c0f\u5230\u70f9\u98ea\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u969b\u822a\u884c\uff0c\u5e7e\u4e4e\u6240\u6709\u554f\u984c\u7684\u89e3\u6c7a\u90fd\u96e2\u4e0d\u958b\u6f14\u7b97\u6cd5\u3002\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u4f7f\u5f97\u6211\u5011\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u5c07\u8cc7\u6599\u7d50\u69cb\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\uff0c\u540c\u6642\u7de8\u5beb\u7a0b\u5f0f\u78bc\u547c\u53eb CPU \u548c GPU \u57f7\u884c\u6f14\u7b97\u6cd5\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u6211\u5011\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u554f\u984c\u8f49\u79fb\u5230\u8a08\u7b97\u6a5f\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u6c7a\u5404\u7a2e\u8907\u96dc\u554f\u984c\u3002

Tip

\u5982\u679c\u4f60\u5c0d\u8cc7\u6599\u7d50\u69cb\u3001\u6f14\u7b97\u6cd5\u3001\u9663\u5217\u548c\u4e8c\u5206\u641c\u5c0b\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8acb\u7e7c\u7e8c\u5f80\u4e0b\u95b1\u8b80\uff0c\u672c\u66f8\u5c07\u5f15\u5c0e\u4f60\u9081\u5165\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u6bbf\u5802\u3002

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7d50","text":"
  • \u6f14\u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u7121\u8655\u4e0d\u5728\uff0c\u4e26\u4e0d\u662f\u9059\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8b58\u3002\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u6c7a\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u554f\u984c\u3002
  • \u67e5\u5b57\u5178\u7684\u539f\u7406\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u9ad4\u73fe\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u6f14\u7b97\u6cd5\u601d\u60f3\u3002
  • \u6574\u7406\u64b2\u514b\u7684\u904e\u7a0b\u8207\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u975e\u5e38\u985e\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u9069\u5408\u6392\u5e8f\u5c0f\u578b\u8cc7\u6599\u96c6\u3002
  • \u8ca8\u5e63\u627e\u96f6\u7684\u6b65\u9a5f\u672c\u8cea\u4e0a\u662f\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\u3002
  • \u6f14\u7b97\u6cd5\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002
  • \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7dca\u5bc6\u76f8\u9023\u3002\u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002
  • \u6211\u5011\u53ef\u4ee5\u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728\uff0c\u7a4d\u6728\u4ee3\u8868\u8cc7\u6599\uff0c\u7a4d\u6728\u7684\u5f62\u72c0\u548c\u9023\u7dda\u65b9\u5f0f\u7b49\u4ee3\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u62fc\u88dd\u7a4d\u6728\u7684\u6b65\u9a5f\u5247\u5c0d\u61c9\u6f14\u7b97\u6cd5\u3002
"},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

Q\uff1a\u4f5c\u70ba\u4e00\u540d\u7a0b\u5f0f\u8a2d\u8a08\u5e2b\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u5f9e\u672a\u7528\u6f14\u7b97\u6cd5\u89e3\u6c7a\u904e\u554f\u984c\uff0c\u5e38\u7528\u6f14\u7b97\u6cd5\u90fd\u88ab\u7a0b\u5f0f\u8a9e\u8a00\u5c01\u88dd\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u9019\u662f\u5426\u610f\u5473\u8457\u6211\u5011\u5de5\u4f5c\u4e2d\u7684\u554f\u984c\u9084\u6c92\u6709\u5230\u9054\u9700\u8981\u6f14\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

\u5982\u679c\u628a\u5177\u9ad4\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8a71\uff0c\u90a3\u9ebc\u57fa\u790e\u79d1\u76ee\u61c9\u8a72\u66f4\u50cf\u662f\u201c\u5167\u529f\u201d\u3002

\u6211\u8a8d\u70ba\u5b78\u6f14\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u790e\u79d1\u76ee\uff09\u7684\u610f\u7fa9\u4e0d\u662f\u5728\u65bc\u5728\u5de5\u4f5c\u4e2d\u5f9e\u96f6\u5be6\u73fe\u5b83\uff0c\u800c\u662f\u57fa\u65bc\u5b78\u5230\u7684\u77e5\u8b58\uff0c\u5728\u89e3\u6c7a\u554f\u984c\u6642\u80fd\u5920\u4f5c\u51fa\u5c08\u696d\u7684\u53cd\u61c9\u548c\u5224\u65b7\uff0c\u5f9e\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u9ad4\u8cea\u91cf\u3002\u8209\u4e00\u500b\u7c21\u55ae\u4f8b\u5b50\uff0c\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u5167\u5efa\u4e86\u6392\u5e8f\u51fd\u5f0f\uff1a

  • \u5982\u679c\u6211\u5011\u6c92\u6709\u5b78\u904e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff0c\u90a3\u9ebc\u7d66\u5b9a\u4efb\u4f55\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u80fd\u90fd\u585e\u7d66\u9019\u500b\u6392\u5e8f\u51fd\u5f0f\u53bb\u505a\u4e86\u3002\u57f7\u884c\u9806\u66a2\u3001\u6548\u80fd\u4e0d\u932f\uff0c\u770b\u4e0a\u53bb\u4e26\u6c92\u6709\u4ec0\u9ebc\u554f\u984c\u3002
  • \u4f46\u5982\u679c\u5b78\u904e\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u5c31\u6703\u77e5\u9053\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7d66\u5b9a\u7684\u8cc7\u6599\u662f\u56fa\u5b9a\u4f4d\u6578\u7684\u6574\u6578\uff08\u4f8b\u5982\u5b78\u865f\uff09\uff0c\u90a3\u9ebc\u6211\u5011\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6578\u6392\u5e8f\u201d\u4f86\u505a\uff0c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u70ba \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u70ba\u4f4d\u6578\u3002\u7576\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u6642\uff0c\u7bc0\u7701\u51fa\u4f86\u7684\u57f7\u884c\u6642\u9593\u5c31\u80fd\u5275\u9020\u8f03\u5927\u50f9\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u9ad4\u9a57\u8b8a\u597d\u7b49\uff09\u3002

\u5728\u5de5\u7a0b\u9818\u57df\u4e2d\uff0c\u5927\u91cf\u554f\u984c\u662f\u96e3\u4ee5\u9054\u5230\u6700\u512a\u89e3\u7684\uff0c\u8a31\u591a\u554f\u984c\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u6c7a\u4e86\u3002\u554f\u984c\u7684\u96e3\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u6c7a\u65bc\u554f\u984c\u672c\u8eab\u7684\u6027\u8cea\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u6c7a\u65bc\u89c0\u6e2c\u554f\u984c\u7684\u4eba\u7684\u77e5\u8b58\u5132\u5099\u3002\u4eba\u7684\u77e5\u8b58\u8d8a\u5b8c\u5099\u3001\u7d93\u9a57\u8d8a\u591a\uff0c\u5206\u6790\u554f\u984c\u5c31\u6703\u8d8a\u6df1\u5165\uff0c\u554f\u984c\u5c31\u80fd\u88ab\u89e3\u6c7a\u5f97\u66f4\u512a\u96c5\u3002

"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u6f14\u7b97\u6cd5\u5b9a\u7fa9","text":"

\u6f14\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u554f\u984c\u662f\u660e\u78ba\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f38\u5165\u548c\u8f38\u51fa\u5b9a\u7fa9\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u5920\u5728\u6709\u9650\u6b65\u9a5f\u3001\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e0b\u5b8c\u6210\u3002
  • \u5404\u6b65\u9a5f\u90fd\u6709\u78ba\u5b9a\u7684\u542b\u7fa9\uff0c\u5728\u76f8\u540c\u7684\u8f38\u5165\u548c\u57f7\u884c\u689d\u4ef6\u4e0b\uff0c\u8f38\u51fa\u59cb\u7d42\u76f8\u540c\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5b9a\u7fa9","text":"

\u8cc7\u6599\u7d50\u69cb\uff08data structure\uff09\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8a2d\u8a08\u76ee\u6a19\u3002

  • \u7a7a\u9593\u4f54\u7528\u5118\u91cf\u5c11\uff0c\u4ee5\u7bc0\u7701\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u3002
  • \u8cc7\u6599\u64cd\u4f5c\u5118\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u84cb\u8cc7\u6599\u8a2a\u554f\u3001\u65b0\u589e\u3001\u522a\u9664\u3001\u66f4\u65b0\u7b49\u3002
  • \u63d0\u4f9b\u7c21\u6f54\u7684\u8cc7\u6599\u8868\u793a\u548c\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4ee5\u4fbf\u6f14\u7b97\u6cd5\u9ad8\u6548\u57f7\u884c\u3002

\u8cc7\u6599\u7d50\u69cb\u8a2d\u8a08\u662f\u4e00\u500b\u5145\u6eff\u6b0a\u8861\u7684\u904e\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u5354\u3002\u4e0b\u9762\u8209\u5169\u500b\u4f8b\u5b50\u3002

  • \u93c8\u7d50\u4e32\u5217\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u5728\u8cc7\u6599\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u72a7\u7272\u4e86\u8cc7\u6599\u8a2a\u554f\u901f\u5ea6\u3002
  • \u5716\u76f8\u8f03\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u63d0\u4f9b\u4e86\u66f4\u8c50\u5bcc\u7684\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4f46\u9700\u8981\u4f54\u7528\u66f4\u5927\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
"},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2","text":"

\u5982\u5716 1-4 \u6240\u793a\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u95dc\u3001\u7dca\u5bc6\u7d50\u5408\uff0c\u5177\u9ad4\u8868\u73fe\u5728\u4ee5\u4e0b\u4e09\u500b\u65b9\u9762\u3002

  • \u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u8cc7\u6599\u7d50\u69cb\u70ba\u6f14\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7d50\u69cb\u5316\u5132\u5b58\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u64cd\u4f5c\u8cc7\u6599\u7684\u65b9\u6cd5\u3002
  • \u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002\u8cc7\u6599\u7d50\u69cb\u672c\u8eab\u50c5\u5132\u5b58\u8cc7\u6599\u8cc7\u8a0a\uff0c\u7d50\u5408\u6f14\u7b97\u6cd5\u624d\u80fd\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u3002
  • \u6f14\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u65bc\u4e0d\u540c\u7684\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u4f46\u57f7\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9078\u64c7\u5408\u9069\u7684\u8cc7\u6599\u7d50\u69cb\u662f\u95dc\u9375\u3002

\u5716 1-4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2

\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7336\u5982\u5716 1-5 \u6240\u793a\u7684\u62fc\u88dd\u7a4d\u6728\u3002\u4e00\u5957\u7a4d\u6728\uff0c\u9664\u4e86\u5305\u542b\u8a31\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u9084\u9644\u6709\u8a73\u7d30\u7684\u7d44\u88dd\u8aaa\u660e\u66f8\u3002\u6211\u5011\u6309\u7167\u8aaa\u660e\u66f8\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7d44\u88dd\u51fa\u7cbe\u7f8e\u7684\u7a4d\u6728\u6a21\u578b\u3002

\u5716 1-5 \u00a0 \u62fc\u88dd\u7a4d\u6728

\u5169\u8005\u7684\u8a73\u7d30\u5c0d\u61c9\u95dc\u4fc2\u5982\u8868 1-1 \u6240\u793a\u3002

\u8868 1-1 \u00a0 \u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728

\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5 \u62fc\u88dd\u7a4d\u6728 \u8f38\u5165\u8cc7\u6599 \u672a\u62fc\u88dd\u7684\u7a4d\u6728 \u8cc7\u6599\u7d50\u69cb \u7a4d\u6728\u7d44\u7e54\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72c0\u3001\u5927\u5c0f\u3001\u9023\u7dda\u65b9\u5f0f\u7b49 \u6f14\u7b97\u6cd5 \u628a\u7a4d\u6728\u62fc\u6210\u76ee\u6a19\u5f62\u614b\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9a5f \u8f38\u51fa\u8cc7\u6599 \u7a4d\u6728\u6a21\u578b

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u662f\u7368\u7acb\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u66f8\u5f97\u4ee5\u63d0\u4f9b\u57fa\u65bc\u591a\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5be6\u73fe\u3002

\u7d04\u5b9a\u4fd7\u6210\u7684\u7c21\u7a31

\u5728\u5be6\u969b\u8a0e\u8ad6\u6642\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u201c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u201d\u7c21\u7a31\u70ba\u201c\u6f14\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u773e\u6240\u5468\u77e5\u7684 LeetCode \u6f14\u7b97\u6cd5\u984c\u76ee\uff0c\u5be6\u969b\u4e0a\u540c\u6642\u8003\u67e5\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u5169\u65b9\u9762\u7684\u77e5\u8b58\u3002

"},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

Abstract

\u6f14\u7b97\u6cd5\u7336\u5982\u7f8e\u5999\u7684\u4ea4\u97ff\u6a02\uff0c\u6bcf\u4e00\u884c\u7a0b\u5f0f\u78bc\u90fd\u50cf\u97fb\u5f8b\u822c\u6d41\u6dcc\u3002

\u9858\u9019\u672c\u66f8\u5728\u4f60\u7684\u8166\u6d77\u4e2d\u8f15\u8f15\u97ff\u8d77\uff0c\u7559\u4e0b\u7368\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

"},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 0.1 \u00a0 \u95dc\u65bc\u672c\u66f8
  • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8
  • 0.3 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u95dc\u65bc\u672c\u66f8","text":"

\u672c\u5c08\u6848\u65e8\u5728\u5efa\u7acb\u4e00\u672c\u958b\u6e90\u3001\u514d\u8cbb\u3001\u5c0d\u65b0\u624b\u53cb\u597d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5165\u9580\u6559\u7a0b\u3002

  • \u5168\u66f8\u63a1\u7528\u52d5\u756b\u5716\u89e3\uff0c\u7d50\u69cb\u5316\u5730\u8b1b\u89e3\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u5167\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\u3002
  • \u6f14\u7b97\u6cd5\u6e90\u7a0b\u5f0f\u78bc\u7686\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8a9e\u8a00\u3002
  • \u9f13\u52f5\u8b80\u8005\u5728\u7dda\u4e0a\u7ae0\u7bc0\u8a55\u8ad6\u5340\u4e92\u5e6b\u4e92\u52a9\u3001\u5171\u540c\u9032\u6b65\uff0c\u63d0\u554f\u8207\u8a55\u8ad6\u901a\u5e38\u53ef\u5728\u5169\u65e5\u5167\u5f97\u5230\u56de\u8986\u3002
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8b80\u8005\u7269\u4ef6","text":"

\u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\uff0c\u5f9e\u672a\u63a5\u89f8\u904e\u6f14\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7d93\u6709\u4e00\u4e9b\u5237\u984c\u7d93\u9a57\uff0c\u5c0d\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8a8d\u8b58\uff0c\u5728\u6703\u8207\u4e0d\u6703\u4e4b\u9593\u53cd\u8986\u6a6b\u8df3\uff0c\u90a3\u9ebc\u672c\u66f8\u6b63\u662f\u70ba\u4f60\u91cf\u8eab\u5b9a\u88fd\u7684\uff01

\u5982\u679c\u4f60\u5df2\u7d93\u7a4d\u7d2f\u4e00\u5b9a\u7684\u5237\u984c\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u984c\u578b\uff0c\u90a3\u9ebc\u672c\u66f8\u53ef\u52a9\u4f60\u56de\u9867\u8207\u68b3\u7406\u6f14\u7b97\u6cd5\u77e5\u8b58\u9ad4\u7cfb\uff0c\u5009\u5eab\u6e90\u7a0b\u5f0f\u78bc\u53ef\u4ee5\u7576\u4f5c\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u6216\u201c\u6f14\u7b97\u6cd5\u5b57\u5178\u201d\u4f86\u4f7f\u7528\u3002

\u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u5011\u671f\u5f85\u6536\u5230\u4f60\u7684\u5bf6\u8cb4\u5efa\u8b70\uff0c\u6216\u8005\u4e00\u8d77\u53c3\u8207\u5275\u4f5c\u3002

\u524d\u7f6e\u689d\u4ef6

\u4f60\u9700\u8981\u81f3\u5c11\u5177\u5099\u4efb\u4e00\u8a9e\u8a00\u7684\u7a0b\u5f0f\u8a2d\u8a08\u57fa\u790e\uff0c\u80fd\u5920\u95b1\u8b80\u548c\u7de8\u5beb\u7c21\u55ae\u7a0b\u5f0f\u78bc\u3002

"},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5167\u5bb9\u7d50\u69cb","text":"

\u672c\u66f8\u7684\u4e3b\u8981\u5167\u5bb9\u5982\u5716 0-1 \u6240\u793a\u3002

  • \u8907\u96dc\u5ea6\u5206\u6790\uff1a\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u7684\u8a55\u50f9\u7dad\u5ea6\u8207\u65b9\u6cd5\u3002\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u898b\u578b\u5225\u3001\u793a\u4f8b\u7b49\u3002
  • \u8cc7\u6599\u7d50\u69cb\uff1a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u5206\u985e\u65b9\u6cd5\u3002\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u898b\u578b\u5225\u3001\u5178\u578b\u61c9\u7528\u3001\u5be6\u73fe\u65b9\u6cd5\u7b49\u3002
  • \u6f14\u7b97\u6cd5\uff1a\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u6548\u7387\u3001\u61c9\u7528\u5834\u666f\u3001\u89e3\u984c\u6b65\u9a5f\u548c\u793a\u4f8b\u554f\u984c\u7b49\u3002

\u5716 0-1 \u00a0 \u672c\u66f8\u4e3b\u8981\u5167\u5bb9

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8b1d","text":"

\u672c\u66f8\u5728\u958b\u6e90\u793e\u7fa4\u773e\u591a\u8ca2\u737b\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65b7\u5b8c\u5584\u3002\u611f\u8b1d\u6bcf\u4e00\u4f4d\u6295\u5165\u6642\u9593\u8207\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u5011\u662f\uff08\u6309\u7167 GitHub \u81ea\u52d5\u751f\u6210\u7684\u9806\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\uff09\u3002\u611f\u8b1d\u4ed6\u5011\u4ed8\u51fa\u7684\u6642\u9593\u8207\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u5011\u78ba\u4fdd\u4e86\u5404\u8a9e\u8a00\u7a0b\u5f0f\u78bc\u7684\u898f\u7bc4\u8207\u7d71\u4e00\u3002

\u5728\u672c\u66f8\u7684\u5275\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8a31\u591a\u4eba\u7684\u5e6b\u52a9\u3002

  • \u611f\u8b1d\u6211\u5728\u516c\u53f8\u7684\u5c0e\u5e2b\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u66a2\u8ac7\u4e2d\u4f60\u9f13\u52f5\u6211\u201c\u5feb\u884c\u52d5\u8d77\u4f86\u201d\uff0c\u5805\u5b9a\u4e86\u6211\u5beb\u9019\u672c\u66f8\u7684\u6c7a\u5fc3\uff1b
  • \u611f\u8b1d\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u70ba\u672c\u66f8\u7684\u9996\u4f4d\u8b80\u8005\uff0c\u5f9e\u6f14\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8a31\u591a\u5bf6\u8cb4\u5efa\u8b70\uff0c\u4f7f\u5f97\u672c\u66f8\u66f4\u9069\u5408\u65b0\u624b\u95b1\u8b80\uff1b
  • \u611f\u8b1d\u9a30\u5bf6\u3001\u7426\u5bf6\u3001\u98db\u5bf6\u70ba\u672c\u66f8\u8d77\u4e86\u4e00\u500b\u5bcc\u6709\u5275\u610f\u7684\u540d\u5b57\uff0c\u559a\u8d77\u5927\u5bb6\u5beb\u4e0b\u7b2c\u4e00\u884c\u7a0b\u5f0f\u78bc\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u61b6\uff1b
  • \u611f\u8b1d\u6821\u9293\u5728\u667a\u6167\u8ca1\u7522\u6b0a\u65b9\u9762\u63d0\u4f9b\u7684\u5c08\u696d\u5e6b\u52a9\uff0c\u9019\u5c0d\u672c\u958b\u6e90\u66f8\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
  • \u611f\u8b1d\u8607\u6f7c\u70ba\u672c\u66f8\u8a2d\u8a08\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u4e26\u5728\u6211\u7684\u5f37\u8feb\u75c7\u7684\u9a45\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
  • \u611f\u8b1d @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8b70\uff0c\u4ee5\u53ca\u4ed6\u958b\u767c\u7684\u958b\u6e90\u6587\u4ef6\u4e3b\u984c Material-for-MkDocs \u3002

\u5728\u5beb\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u95b1\u8b80\u4e86\u8a31\u591a\u95dc\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u9019\u4e9b\u4f5c\u54c1\u70ba\u672c\u66f8\u63d0\u4f9b\u4e86\u512a\u79c0\u7684\u7bc4\u672c\uff0c\u78ba\u4fdd\u4e86\u672c\u66f8\u5167\u5bb9\u7684\u6e96\u78ba\u6027\u8207\u54c1\u8cea\u3002\u5728\u6b64\u611f\u8b1d\u6240\u6709\u8001\u5e2b\u548c\u524d\u8f29\u7684\u5091\u51fa\u8ca2\u737b\uff01

\u672c\u66f8\u5021\u5c0e\u624b\u8166\u4e26\u7528\u7684\u5b78\u7fd2\u65b9\u5f0f\uff0c\u5728\u9019\u4e00\u9ede\u4e0a\u6211\u6df1\u53d7\u300a\u52d5\u624b\u5b78\u6df1\u5ea6\u5b78\u7fd2\u300b\u7684\u555f\u767c\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8b80\u8005\u5f37\u70c8\u63a8\u85a6\u9019\u672c\u512a\u79c0\u7684\u8457\u4f5c\u3002

\u8877\u5fc3\u611f\u8b1d\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u5011\u4e00\u76f4\u4ee5\u4f86\u7684\u652f\u6301\u8207\u9f13\u52f5\uff0c\u8b93\u6211\u6709\u6a5f\u6703\u505a\u9019\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8","text":"

Tip

\u70ba\u4e86\u7372\u5f97\u6700\u4f73\u7684\u95b1\u8b80\u9ad4\u9a57\uff0c\u5efa\u8b70\u4f60\u901a\u8b80\u672c\u7bc0\u5167\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98a8\u683c\u7d04\u5b9a","text":"
  • \u6a19\u984c\u5f8c\u6a19\u8a3b * \u7684\u662f\u9078\u8b80\u7ae0\u7bc0\uff0c\u5167\u5bb9\u76f8\u5c0d\u56f0\u96e3\u3002\u5982\u679c\u4f60\u7684\u6642\u9593\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\u3002
  • \u5c08\u696d\u8853\u8a9e\u6703\u4f7f\u7528\u9ed1\u9ad4\uff08\u7d19\u8cea\u7248\u548c PDF \u7248\uff09\u6216\u65b0\u589e\u4e0b\u5283\u7dda\uff08\u7db2\u9801\u7248\uff09\uff0c\u4f8b\u5982\u9663\u5217\uff08array\uff09\u3002\u5efa\u8b70\u8a18\u4f4f\u5b83\u5011\uff0c\u4ee5\u4fbf\u95b1\u8b80\u6587\u737b\u3002
  • \u91cd\u9ede\u5167\u5bb9\u548c\u7e3d\u7d50\u6027\u8a9e\u53e5\u6703 \u52a0\u7c97\uff0c\u9019\u985e\u6587\u5b57\u503c\u5f97\u7279\u5225\u95dc\u6ce8\u3002
  • \u6709\u7279\u6307\u542b\u7fa9\u7684\u8a5e\u53e5\u6703\u4f7f\u7528\u201c\u5f15\u865f\u201d\u6a19\u8a3b\uff0c\u4ee5\u907f\u514d\u6b67\u7fa9\u3002
  • \u7576\u6d89\u53ca\u7a0b\u5f0f\u8a9e\u8a00\u4e4b\u9593\u4e0d\u4e00\u81f4\u7684\u540d\u8a5e\u6642\uff0c\u672c\u66f8\u5747\u4ee5 Python \u70ba\u6e96\uff0c\u4f8b\u5982\u4f7f\u7528 None \u4f86\u8868\u793a\u201c\u7a7a\u201d\u3002
  • \u672c\u66f8\u90e8\u5206\u653e\u68c4\u4e86\u7a0b\u5f0f\u8a9e\u8a00\u7684\u8a3b\u91cb\u898f\u7bc4\uff0c\u4ee5\u63db\u53d6\u66f4\u52a0\u7dca\u6e4a\u7684\u5167\u5bb9\u6392\u7248\u3002\u8a3b\u91cb\u4e3b\u8981\u5206\u70ba\u4e09\u7a2e\u985e\u578b\uff1a\u6a19\u984c\u8a3b\u91cb\u3001\u5167\u5bb9\u8a3b\u91cb\u3001\u591a\u884c\u8a3b\u91cb\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
\"\"\"\u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\"\"\"\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n\"\"\"\n\u591a\u884c\n\u8a3b\u91cb\n\"\"\"\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
### \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 ###\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n# \u591a\u884c\n# \u8a3b\u91cb\n
// \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n// \u591a\u884c\n// \u8a3b\u91cb\n
"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52d5\u756b\u5716\u89e3\u4e2d\u9ad8\u6548\u5b78\u7fd2","text":"

\u76f8\u8f03\u65bc\u6587\u5b57\uff0c\u5f71\u7247\u548c\u5716\u7247\u5177\u6709\u66f4\u9ad8\u7684\u8cc7\u8a0a\u5bc6\u5ea6\u548c\u7d50\u69cb\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u65bc\u7406\u89e3\u3002\u5728\u672c\u66f8\u4e2d\uff0c\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u5c07\u4e3b\u8981\u900f\u904e\u52d5\u756b\u4ee5\u5716\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5247\u4f5c\u70ba\u89e3\u91cb\u8207\u88dc\u5145\u3002

\u5982\u679c\u4f60\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u767c\u73fe\u67d0\u6bb5\u5167\u5bb9\u63d0\u4f9b\u77ad\u5982\u5716 0-2 \u6240\u793a\u7684\u52d5\u756b\u5716\u89e3\uff0c\u8acb\u4ee5\u5716\u70ba\u4e3b\u3001\u4ee5\u6587\u5b57\u70ba\u8f14\uff0c\u7d9c\u5408\u5169\u8005\u4f86\u7406\u89e3\u5167\u5bb9\u3002

\u5716 0-2 \u00a0 \u52d5\u756b\u5716\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u7a0b\u5f0f\u78bc\u5be6\u8e10\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u66f8\u7684\u914d\u5957\u7a0b\u5f0f\u78bc\u8a17\u7ba1\u5728 GitHub \u5009\u5eab\u3002\u5982\u5716 0-3 \u6240\u793a\uff0c\u6e90\u7a0b\u5f0f\u78bc\u9644\u6709\u6e2c\u8a66\u6a23\u4f8b\uff0c\u53ef\u4e00\u9375\u57f7\u884c\u3002

\u5982\u679c\u6642\u9593\u5141\u8a31\uff0c\u5efa\u8b70\u4f60\u53c3\u7167\u7a0b\u5f0f\u78bc\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b78\u7fd2\u6642\u9593\u6709\u9650\uff0c\u8acb\u81f3\u5c11\u901a\u8b80\u4e26\u57f7\u884c\u6240\u6709\u7a0b\u5f0f\u78bc\u3002

\u8207\u95b1\u8b80\u7a0b\u5f0f\u78bc\u76f8\u6bd4\uff0c\u7de8\u5beb\u7a0b\u5f0f\u78bc\u7684\u904e\u7a0b\u5f80\u5f80\u80fd\u5e36\u4f86\u66f4\u591a\u6536\u7a6b\u3002\u52d5\u624b\u5b78\uff0c\u624d\u662f\u771f\u7684\u5b78\u3002

\u5716 0-3 \u00a0 \u57f7\u884c\u7a0b\u5f0f\u78bc\u793a\u4f8b

\u57f7\u884c\u7a0b\u5f0f\u78bc\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\u3002

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88dd\u672c\u5730\u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u3002\u8acb\u53c3\u7167\u9644\u9304\u6240\u793a\u7684\u6559\u7a0b\u9032\u884c\u5b89\u88dd\uff0c\u5982\u679c\u5df2\u5b89\u88dd\uff0c\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002

\u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u5009\u5eab\u3002\u524d\u5f80 GitHub \u5009\u5eab\u3002\u5982\u679c\u5df2\u7d93\u5b89\u88dd Git \uff0c\u53ef\u4ee5\u900f\u904e\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u5009\u5eab\uff1a

git clone https://github.com/krahets/hello-algo.git\n

\u7576\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5716 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u9ede\u9078\u201cDownload ZIP\u201d\u6309\u9215\u76f4\u63a5\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u58d3\u7e2e\u5305\uff0c\u7136\u5f8c\u5728\u672c\u5730\u89e3\u58d3\u5373\u53ef\u3002

\u5716 0-4 \u00a0 \u514b\u9686\u5009\u5eab\u8207\u4e0b\u8f09\u7a0b\u5f0f\u78bc

\u7b2c\u4e09\u6b65\uff1a\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 0-5 \u6240\u793a\uff0c\u5c0d\u65bc\u9802\u90e8\u6a19\u6709\u6a94\u6848\u540d\u7a31\u7684\u7a0b\u5f0f\u78bc\u584a\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u5009\u5eab\u7684 codes \u6a94\u6848\u593e\u5167\u627e\u5230\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u3002\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5c07\u5e6b\u52a9\u4f60\u7bc0\u7701\u4e0d\u5fc5\u8981\u7684\u9664\u932f\u6642\u9593\uff0c\u8b93\u4f60\u80fd\u5920\u5c08\u6ce8\u65bc\u5b78\u7fd2\u5167\u5bb9\u3002

\u5716 0-5 \u00a0 \u7a0b\u5f0f\u78bc\u584a\u8207\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848

\u9664\u4e86\u672c\u5730\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u7db2\u9801\u7248\u9084\u652f\u6301 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c\uff08\u57fa\u65bc pythontutor \u5be6\u73fe\uff09\u3002\u5982\u5716 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u9ede\u9078\u7a0b\u5f0f\u78bc\u584a\u4e0b\u65b9\u7684\u201c\u8996\u89ba\u5316\u57f7\u884c\u201d\u4f86\u5c55\u958b\u6aa2\u8996\uff0c\u89c0\u5bdf\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u9ede\u9078\u201c\u5168\u5c4f\u89c0\u770b\u201d\uff0c\u4ee5\u7372\u5f97\u66f4\u597d\u7684\u95b1\u89bd\u9ad4\u9a57\u3002

\u5716 0-6 \u00a0 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u554f\u8a0e\u8ad6\u4e2d\u5171\u540c\u6210\u9577","text":"

\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u8acb\u4e0d\u8981\u8f15\u6613\u8df3\u904e\u90a3\u4e9b\u6c92\u5b78\u660e\u767d\u7684\u77e5\u8b58\u9ede\u3002\u6b61\u8fce\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u4f60\u7684\u554f\u984c\uff0c\u6211\u548c\u5c0f\u5925\u4f34\u5011\u5c07\u7aed\u8aa0\u70ba\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u6cc1\u4e0b\u53ef\u5728\u5169\u5929\u5167\u56de\u8986\u3002

\u5982\u5716 0-7 \u6240\u793a\uff0c\u7db2\u9801\u7248\u6bcf\u500b\u7ae0\u7bc0\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8a55\u8ad6\u5340\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u95dc\u6ce8\u8a55\u8ad6\u5340\u7684\u5167\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u77ad\u89e3\u5927\u5bb6\u9047\u5230\u7684\u554f\u984c\uff0c\u5f9e\u800c\u67e5\u6f0f\u88dc\u7f3a\uff0c\u6fc0\u767c\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u5925\u4f34\u7684\u554f\u984c\uff0c\u5206\u4eab\u4f60\u7684\u898b\u89e3\uff0c\u5e6b\u52a9\u4ed6\u4eba\u9032\u6b65\u3002

\u5716 0-7 \u00a0 \u8a55\u8ad6\u5340\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda","text":"

\u5f9e\u7e3d\u9ad4\u4e0a\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u904e\u7a0b\u5283\u5206\u70ba\u4e09\u500b\u968e\u6bb5\u3002

  1. \u968e\u6bb5\u4e00\uff1a\u6f14\u7b97\u6cd5\u5165\u9580\u3002\u6211\u5011\u9700\u8981\u719f\u6089\u5404\u7a2e\u8cc7\u6599\u7d50\u69cb\u7684\u7279\u9ede\u548c\u7528\u6cd5\uff0c\u5b78\u7fd2\u4e0d\u540c\u6f14\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5167\u5bb9\u3002
  2. \u968e\u6bb5\u4e8c\uff1a\u5237\u6f14\u7b97\u6cd5\u984c\u3002\u5efa\u8b70\u5f9e\u71b1\u9580\u984c\u76ee\u958b\u5237\uff0c\u5148\u7a4d\u7d2f\u81f3\u5c11 100 \u9053\u984c\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u3002\u521d\u6b21\u5237\u984c\u6642\uff0c\u201c\u77e5\u8b58\u907a\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u500b\u6311\u6230\uff0c\u4f46\u8acb\u653e\u5fc3\uff0c\u9019\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u5011\u53ef\u4ee5\u6309\u7167\u201c\u827e\u8cd3\u6d69\u65af\u907a\u5fd8\u66f2\u7dda\u201d\u4f86\u8907\u7fd2\u984c\u76ee\uff0c\u901a\u5e38\u5728\u9032\u884c 3\uff5e5 \u8f2a\u7684\u91cd\u8907\u5f8c\uff0c\u5c31\u80fd\u5c07\u5176\u7262\u8a18\u5728\u5fc3\u3002\u63a8\u85a6\u7684\u984c\u55ae\u548c\u5237\u984c\u8a08\u5283\u8acb\u898b\u6b64 GitHub \u5009\u5eab\u3002
  3. \u968e\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5b78\u7fd2\u65b9\u9762\uff0c\u6211\u5011\u53ef\u4ee5\u95b1\u8b80\u6f14\u7b97\u6cd5\u5c08\u6b04\u6587\u7ae0\u3001\u89e3\u984c\u6846\u67b6\u548c\u6f14\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65b7\u8c50\u5bcc\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5237\u984c\u65b9\u9762\uff0c\u53ef\u4ee5\u5617\u8a66\u63a1\u7528\u9032\u968e\u5237\u984c\u7b56\u7565\uff0c\u5982\u6309\u5c08\u984c\u5206\u985e\u3001\u4e00\u984c\u591a\u89e3\u3001\u4e00\u89e3\u591a\u984c\u7b49\uff0c\u76f8\u95dc\u7684\u5237\u984c\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u500b\u793e\u7fa4\u627e\u5230\u3002

\u5982\u5716 0-8 \u6240\u793a\uff0c\u672c\u66f8\u5167\u5bb9\u4e3b\u8981\u6db5\u84cb\u201c\u968e\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e6b\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u958b\u968e\u6bb5\u4e8c\u548c\u968e\u6bb5\u4e09\u7684\u5b78\u7fd2\u3002

\u5716 0-8 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7d50","text":"
  • \u672c\u66f8\u7684\u4e3b\u8981\u53d7\u773e\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u790e\uff0c\u672c\u66f8\u80fd\u5e6b\u52a9\u4f60\u7cfb\u7d71\u56de\u9867\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u66f8\u4e2d\u6e90\u7a0b\u5f0f\u78bc\u4e5f\u53ef\u4f5c\u70ba\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u4f7f\u7528\u3002
  • \u66f8\u4e2d\u5167\u5bb9\u4e3b\u8981\u5305\u62ec\u8907\u96dc\u5ea6\u5206\u6790\u3001\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u84cb\u4e86\u8a72\u9818\u57df\u7684\u5927\u90e8\u5206\u4e3b\u984c\u3002
  • \u5c0d\u65bc\u6f14\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b78\u968e\u6bb5\u95b1\u8b80\u4e00\u672c\u5165\u9580\u66f8\u81f3\u95dc\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8a31\u591a\u5f4e\u8def\u3002
  • \u66f8\u4e2d\u7684\u52d5\u756b\u5716\u89e3\u901a\u5e38\u7528\u65bc\u4ecb\u7d39\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u3002\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u61c9\u7d66\u4e88\u9019\u4e9b\u5167\u5bb9\u66f4\u591a\u95dc\u6ce8\u3002
  • \u5be6\u8e10\u4e43\u5b78\u7fd2\u7a0b\u5f0f\u8a2d\u8a08\u4e4b\u6700\u4f73\u9014\u5f91\u3002\u5f37\u70c8\u5efa\u8b70\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u4e26\u89aa\u81ea\u6572\u7a0b\u5f0f\u78bc\u3002
  • \u672c\u66f8\u7db2\u9801\u7248\u7684\u6bcf\u500b\u7ae0\u7bc0\u90fd\u8a2d\u6709\u8a55\u8ad6\u5340\uff0c\u6b61\u8fce\u96a8\u6642\u5206\u4eab\u4f60\u7684\u7591\u60d1\u8207\u898b\u89e3\u3002
"},{"location":"chapter_reference/","title":"\u53c3\u8003\u6587\u737b","text":"

[1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

[2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

[3] Robert Sedgewick, et al. Algorithms (4th Edition).

[4] \u56b4\u851a\u654f. \u8cc7\u6599\u7d50\u69cb\uff08C \u8a9e\u8a00\u7248\uff09.

[5] \u9127\u4fca\u8f1d. \u8cc7\u6599\u7d50\u69cb\uff08C++ \u8a9e\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[6] \u99ac\u514b \u827e\u502b \u7dad\u65af\u8457\uff0c\u9673\u8d8a\u8b6f. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5206\u6790\uff1aJava\u8a9e\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

[7] \u7a0b\u5091. \u5927\u8a71\u8cc7\u6599\u7d50\u69cb.

[8] \u738b\u722d. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u7f8e.

[9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[10] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u5c0b","text":"

Abstract

\u641c\u5c0b\u662f\u4e00\u5834\u672a\u77e5\u7684\u5192\u96aa\uff0c\u6211\u5011\u6216\u8a31\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u9593\u7684\u6bcf\u500b\u89d2\u843d\uff0c\u53c8\u6216\u8a31\u53ef\u4ee5\u5feb\u901f\u9396\u5b9a\u76ee\u6a19\u3002

\u5728\u9019\u5834\u5c0b\u8993\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u500b\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

"},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b
  • 10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede
  • 10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c
  • 10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565
  • 10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5
  • 10.6 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b","text":"

\u4e8c\u5206\u641c\u5c0b\uff08binary search\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\u641c\u5c0b\u7bc4\u570d\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u70ba\u6b62\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5143\u7d20\u6309\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u8907\u3002\u8acb\u67e5\u8a62\u4e26\u8fd4\u56de\u5143\u7d20 target \u5728\u8a72\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 10-1 \u6240\u793a\u3002

\u5716 10-1 \u00a0 \u4e8c\u5206\u641c\u5c0b\u793a\u4f8b\u8cc7\u6599

\u5982\u5716 10-2 \u6240\u793a\uff0c\u6211\u5011\u5148\u521d\u59cb\u5316\u6307\u6a19 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u5c0b\u5340\u9593 \\([0, n - 1]\\) \u3002\u8acb\u6ce8\u610f\uff0c\u4e2d\u62ec\u865f\u8868\u793a\u9589\u5340\u9593\uff0c\u5176\u5305\u542b\u908a\u754c\u503c\u672c\u8eab\u3002

\u63a5\u4e0b\u4f86\uff0c\u8ff4\u5708\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
  2. \u5224\u65b7 nums[m] \u548c target \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u4e09\u7a2e\u60c5\u6cc1\u3002
    1. \u7576 nums[m] < target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(i = m + 1\\) \u3002
    2. \u7576 nums[m] > target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(j = m - 1\\) \u3002
    3. \u7576 nums[m] = target \u6642\uff0c\u8aaa\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

\u82e5\u9663\u5217\u4e0d\u5305\u542b\u76ee\u6a19\u5143\u7d20\uff0c\u641c\u5c0b\u5340\u9593\u6700\u7d42\u6703\u7e2e\u5c0f\u70ba\u7a7a\u3002\u6b64\u6642\u8fd4\u56de \\(-1\\) \u3002

<1><2><3><4><5><6><7>

\u5716 10-2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u6d41\u7a0b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u578b\u5225\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u6703\u8d85\u51fa int \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u3002\u70ba\u4e86\u907f\u514d\u5927\u6578\u8d8a\u754c\uff0c\u6211\u5011\u901a\u5e38\u63a1\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u4f86\u8a08\u7b97\u4e2d\u9ede\u3002

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8ad6\u4e0a Python \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while i <= j\n    # \u7406\u8ad6\u4e0a Ruby \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n    m = (i + j) / 2   # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u8ff4\u5708\u4e2d\uff0c\u5340\u9593\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u70ba \\(\\log_2 n\\) \u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7a7a\u9593\u3002

"},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u5340\u9593\u8868\u793a\u65b9\u6cd5","text":"

\u9664\u4e86\u4e0a\u8ff0\u96d9\u9589\u5340\u9593\u5916\uff0c\u5e38\u898b\u7684\u5340\u9593\u8868\u793a\u9084\u6709\u201c\u5de6\u9589\u53f3\u958b\u201d\u5340\u9593\uff0c\u5b9a\u7fa9\u70ba \\([0, n)\\) \uff0c\u5373\u5de6\u908a\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u908a\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8a72\u8868\u793a\u4e0b\uff0c\u5340\u9593 \\([i, j)\\) \u5728 \\(i = j\\) \u6642\u70ba\u7a7a\u3002

\u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u8a72\u8868\u793a\u5be6\u73fe\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while i < j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 10-3 \u6240\u793a\uff0c\u5728\u5169\u7a2e\u5340\u9593\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u8ff4\u5708\u689d\u4ef6\u548c\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

\u7531\u65bc\u201c\u96d9\u9589\u5340\u9593\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u908a\u754c\u90fd\u88ab\u5b9a\u7fa9\u70ba\u9589\u5340\u9593\uff0c\u56e0\u6b64\u900f\u904e\u6307\u6a19 \\(i\\) \u548c\u6307\u6a19 \\(j\\) \u7e2e\u5c0f\u5340\u9593\u7684\u64cd\u4f5c\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u9019\u6a23\u66f4\u4e0d\u5bb9\u6613\u51fa\u932f\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8b70\u63a1\u7528\u201c\u96d9\u9589\u5340\u9593\u201d\u7684\u5beb\u6cd5\u3002

\u5716 10-3 \u00a0 \u5169\u7a2e\u5340\u9593\u5b9a\u7fa9

"},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u4e8c\u5206\u641c\u5c0b\u5728\u6642\u9593\u548c\u7a7a\u9593\u65b9\u9762\u90fd\u6709\u8f03\u597d\u7684\u6548\u80fd\u3002

  • \u4e8c\u5206\u641c\u5c0b\u7684\u6642\u9593\u6548\u7387\u9ad8\u3002\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\uff0c\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5177\u6709\u986f\u8457\u512a\u52e2\u3002\u4f8b\u5982\uff0c\u7576\u8cc7\u6599\u5927\u5c0f \\(n = 2^{20}\\) \u6642\uff0c\u7dda\u6027\u67e5\u8a62\u9700\u8981 \\(2^{20} = 1048576\\) \u8f2a\u8ff4\u5708\uff0c\u800c\u4e8c\u5206\u641c\u5c0b\u50c5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f2a\u8ff4\u5708\u3002
  • \u4e8c\u5206\u641c\u5c0b\u7121\u9808\u984d\u5916\u7a7a\u9593\u3002\u76f8\u8f03\u65bc\u9700\u8981\u85c9\u52a9\u984d\u5916\u7a7a\u9593\u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08\u4f8b\u5982\u96dc\u6e4a\u67e5\u8a62\uff09\uff0c\u4e8c\u5206\u641c\u5c0b\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002

\u7136\u800c\uff0c\u4e8c\u5206\u641c\u5c0b\u4e26\u975e\u9069\u7528\u65bc\u6240\u6709\u60c5\u6cc1\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u6709\u5e8f\u8cc7\u6599\u3002\u82e5\u8f38\u5165\u8cc7\u6599\u7121\u5e8f\uff0c\u70ba\u4e86\u4f7f\u7528\u4e8c\u5206\u641c\u5c0b\u800c\u5c08\u9580\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u511f\u5931\u3002\u56e0\u70ba\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u6bd4\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u90fd\u66f4\u9ad8\u3002\u5c0d\u65bc\u983b\u7e41\u63d2\u5165\u5143\u7d20\u7684\u5834\u666f\uff0c\u70ba\u4fdd\u6301\u9663\u5217\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c07\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8cb4\u7684\u3002
  • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u8df3\u8e8d\u5f0f\uff08\u975e\u9023\u7e8c\u5730\uff09\u8a2a\u554f\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u57f7\u884c\u8df3\u8e8d\u5f0f\u8a2a\u554f\u7684\u6548\u7387\u8f03\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u61c9\u7528\u5728\u93c8\u7d50\u4e32\u5217\u6216\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u5c0f\u8cc7\u6599\u91cf\u4e0b\uff0c\u7dda\u6027\u67e5\u8a62\u6548\u80fd\u66f4\u4f73\u3002\u7dda\u4e0a\u6027\u67e5\u8a62\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u9700 1 \u6b21\u5224\u65b7\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65b7\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u6e1b\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u7576\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5c0f\u6642\uff0c\u7dda\u6027\u67e5\u8a62\u53cd\u800c\u6bd4\u4e8c\u5206\u641c\u5c0b\u66f4\u5feb\u3002
"},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u8a62\u5de6\u908a\u754c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\u3002\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e2d\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

\u56de\u61b6\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u7684\u65b9\u6cd5\uff0c\u641c\u5c0b\u5b8c\u6210\u5f8c \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target \uff0c\u56e0\u6b64\u67e5\u8a62\u63d2\u5165\u9ede\u672c\u8cea\u4e0a\u662f\u5728\u67e5\u8a62\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002

\u8003\u616e\u900f\u904e\u67e5\u8a62\u63d2\u5165\u9ede\u7684\u51fd\u5f0f\u5be6\u73fe\u67e5\u8a62\u5de6\u908a\u754c\u3002\u8acb\u6ce8\u610f\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u9019\u7a2e\u60c5\u6cc1\u53ef\u80fd\u5c0e\u81f4\u4ee5\u4e0b\u5169\u7a2e\u7d50\u679c\u3002

  • \u63d2\u5165\u9ede\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
  • \u5143\u7d20 nums[i] \u8207 target \u4e0d\u76f8\u7b49\u3002

\u7576\u9047\u5230\u4ee5\u4e0a\u5169\u7a2e\u60c5\u6cc1\u6642\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target\"\"\"\n    # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
binary_search_edge.cpp
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchLeftEdge}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u8a62\u53f3\u908a\u754c","text":"

\u90a3\u9ebc\u5982\u4f55\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u7a0b\u5f0f\u78bc\uff0c\u66ff\u63db\u5728 nums[m] == target \u60c5\u6cc1\u4e0b\u7684\u6307\u6a19\u6536\u7e2e\u64cd\u4f5c\u3002\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

\u4e0b\u9762\u6211\u5011\u4ecb\u7d39\u5169\u7a2e\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

"},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u8907\u7528\u67e5\u8a62\u5de6\u908a\u754c","text":"

\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u67e5\u8a62\u6700\u5de6\u5143\u7d20\u7684\u51fd\u5f0f\u4f86\u67e5\u8a62\u6700\u53f3\u5143\u7d20\uff0c\u5177\u9ad4\u65b9\u6cd5\u70ba\uff1a\u5c07\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\u3002

\u5982\u5716 10-7 \u6240\u793a\uff0c\u67e5\u8a62\u5b8c\u6210\u5f8c\uff0c\u6307\u6a19 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

\u5716 10-7 \u00a0 \u5c07\u67e5\u8a62\u53f3\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5de6\u908a\u754c

\u8acb\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u9ede\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c07\u5176\u6e1b \\(1\\) \uff0c\u5f9e\u800c\u7372\u5f97 \\(j\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target\"\"\"\n    # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
binary_search_edge.cpp
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchRightEdge}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20","text":"

\u6211\u5011\u77e5\u9053\uff0c\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u6700\u7d42 \\(i\\) \u548c \\(j\\) \u6703\u5206\u5225\u6307\u5411\u9996\u500b\u5927\u65bc\u3001\u5c0f\u65bc target \u7684\u5143\u7d20\u3002

\u56e0\u6b64\uff0c\u5982\u5716 10-8 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u69cb\u9020\u4e00\u500b\u9663\u5217\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u65bc\u67e5\u8a62\u5de6\u53f3\u908a\u754c\u3002

  • \u67e5\u8a62\u6700\u5de6\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target - 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(i\\) \u3002
  • \u67e5\u8a62\u6700\u53f3\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target + 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(j\\) \u3002

\u5716 10-8 \u00a0 \u5c07\u67e5\u8a62\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20

\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u5169\u9ede\u503c\u5f97\u6ce8\u610f\u3002

  • \u7d66\u5b9a\u9663\u5217\u4e0d\u5305\u542b\u5c0f\u6578\uff0c\u9019\u610f\u5473\u8457\u6211\u5011\u7121\u9808\u95dc\u5fc3\u5982\u4f55\u8655\u7406\u76f8\u7b49\u7684\u60c5\u6cc1\u3002
  • \u56e0\u70ba\u8a72\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6578\uff0c\u6240\u4ee5\u9700\u8981\u5c07\u51fd\u5f0f\u4e2d\u7684\u8b8a\u6578 target \u6539\u70ba\u6d6e\u9ede\u6578\u578b\u5225\uff08Python \u7121\u9808\u6539\u52d5\uff09\u3002
"},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede","text":"

\u4e8c\u5206\u641c\u5c0b\u4e0d\u50c5\u53ef\u7528\u65bc\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\uff0c\u9084\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u8b8a\u7a2e\u554f\u984c\uff0c\u6bd4\u5982\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

"},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \u548c\u4e00\u500b\u5143\u7d20 target \uff0c\u9663\u5217\u4e0d\u5b58\u5728\u91cd\u8907\u5143\u7d20\u3002\u73fe\u5c07 target \u63d2\u5165\u9663\u5217 nums \u4e2d\uff0c\u4e26\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u9663\u5217\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5247\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8acb\u8fd4\u56de\u63d2\u5165\u5f8c target \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u5716 10-4 \u6240\u793a\u3002

\u5716 10-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u793a\u4f8b\u8cc7\u6599

\u5982\u679c\u60f3\u8907\u7528\u4e0a\u4e00\u7bc0\u7684\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\uff0c\u5247\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u5169\u500b\u554f\u984c\u3002

\u554f\u984c\u4e00\uff1a\u7576\u9663\u5217\u4e2d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u662f\u5426\u662f\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u984c\u76ee\u8981\u6c42\u5c07 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u908a\uff0c\u9019\u610f\u5473\u8457\u65b0\u63d2\u5165\u7684 target \u66ff\u63db\u4e86\u539f\u4f86 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u7576\u9663\u5217\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u5c31\u662f\u8a72 target \u7684\u7d22\u5f15\u3002

\u554f\u984c\u4e8c\uff1a\u7576\u9663\u5217\u4e2d\u4e0d\u5b58\u5728 target \u6642\uff0c\u63d2\u5165\u9ede\u662f\u54ea\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u9032\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u641c\u5c0b\u904e\u7a0b\uff1a\u7576 nums[m] < target \u6642 \\(i\\) \u79fb\u52d5\uff0c\u9019\u610f\u5473\u8457\u6307\u6a19 \\(i\\) \u5728\u5411\u5927\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u6a19 \\(j\\) \u59cb\u7d42\u5728\u5411\u5c0f\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u56e0\u6b64\u4e8c\u5206\u7d50\u675f\u6642\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u3002\u6613\u5f97\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u7d22\u5f15\u70ba \\(i\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertionSimple}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u5728\u4e0a\u4e00\u984c\u7684\u57fa\u790e\u4e0a\uff0c\u898f\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u5176\u9918\u4e0d\u8b8a\u3002

\u5047\u8a2d\u9663\u5217\u4e2d\u5b58\u5728\u591a\u500b target \uff0c\u5247\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u800c\u7121\u6cd5\u78ba\u5b9a\u8a72\u5143\u7d20\u7684\u5de6\u908a\u548c\u53f3\u908a\u9084\u6709\u591a\u5c11 target\u3002

\u984c\u76ee\u8981\u6c42\u5c07\u76ee\u6a19\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u908a\uff0c\u6240\u4ee5\u6211\u5011\u9700\u8981\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u616e\u900f\u904e\u5716 10-5 \u6240\u793a\u7684\u6b65\u9a5f\u5be6\u73fe\u3002

  1. \u57f7\u884c\u4e8c\u5206\u641c\u5c0b\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\(k\\) \u3002
  2. \u5f9e\u7d22\u5f15 \\(k\\) \u958b\u59cb\uff0c\u5411\u5de6\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u7576\u627e\u5230\u6700\u5de6\u908a\u7684 target \u6642\u8fd4\u56de\u3002

\u5716 10-5 \u00a0 \u7dda\u6027\u67e5\u8a62\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede

\u6b64\u65b9\u6cd5\u96d6\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7dda\u6027\u67e5\u8a62\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u7576\u9663\u5217\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u8907\u7684 target \u6642\uff0c\u8a72\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

\u73fe\u8003\u616e\u62d3\u5c55\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 10-6 \u6240\u793a\uff0c\u6574\u9ad4\u6d41\u7a0b\u4fdd\u6301\u4e0d\u8b8a\uff0c\u6bcf\u8f2a\u5148\u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65b7 target \u548c nums[m] \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u5e7e\u7a2e\u60c5\u6cc1\u3002

  • \u7576 nums[m] < target \u6216 nums[m] > target \u6642\uff0c\u8aaa\u660e\u9084\u6c92\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u63a1\u7528\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u7684\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
  • \u7576 nums[m] == target \u6642\uff0c\u8aaa\u660e\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u63a1\u7528 \\(j = m - 1\\) \u4f86\u7e2e\u5c0f\u5340\u9593\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(j\\) \u5411\u5c0f\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u8ff4\u5708\u5b8c\u6210\u5f8c\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u908a\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u9ede\u3002

<1><2><3><4><5><6><7><8>

\u5716 10-6 \u00a0 \u4e8c\u5206\u641c\u5c0b\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede\u7684\u6b65\u9a5f

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5224\u65b7\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u5169\u8005\u53ef\u4ee5\u5408\u4f75\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5c07\u5224\u65b7\u689d\u4ef6\u4fdd\u6301\u5c55\u958b\uff0c\u56e0\u70ba\u5176\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8b80\u6027\u66f4\u597d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertion}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u672c\u7bc0\u7684\u7a0b\u5f0f\u78bc\u90fd\u662f\u201c\u96d9\u9589\u5340\u9593\u201d\u5beb\u6cd5\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u201c\u5de6\u9589\u53f3\u958b\u201d\u5beb\u6cd5\u3002

\u7e3d\u7684\u4f86\u770b\uff0c\u4e8c\u5206\u641c\u5c0b\u7121\u975e\u5c31\u662f\u7d66\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5225\u8a2d\u5b9a\u641c\u5c0b\u76ee\u6a19\uff0c\u76ee\u6a19\u53ef\u80fd\u662f\u4e00\u500b\u5177\u9ad4\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u500b\u5143\u7d20\u7bc4\u570d\uff08\u4f8b\u5982\u5c0f\u65bc target \u7684\u5143\u7d20\uff09\u3002

\u5728\u4e0d\u65b7\u7684\u8ff4\u5708\u4e8c\u5206\u4e2d\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6f38\u903c\u8fd1\u9810\u5148\u8a2d\u5b9a\u7684\u76ee\u6a19\u3002\u6700\u7d42\uff0c\u5b83\u5011\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u904e\u908a\u754c\u5f8c\u505c\u6b62\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565","text":"

\u5728\u6f14\u7b97\u6cd5\u984c\u4e2d\uff0c\u6211\u5011\u5e38\u900f\u904e\u5c07\u7dda\u6027\u67e5\u8a62\u66ff\u63db\u70ba\u96dc\u6e4a\u67e5\u8a62\u4f86\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u6f14\u7b97\u6cd5\u984c\u4f86\u52a0\u6df1\u7406\u89e3\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u5143\u7d20 target \uff0c\u8acb\u5728\u9663\u5217\u4e2d\u641c\u7d22\u201c\u548c\u201d\u70ba target \u7684\u5169\u500b\u5143\u7d20\uff0c\u4e26\u8fd4\u56de\u5b83\u5011\u7684\u9663\u5217\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u500b\u89e3\u5373\u53ef\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7dda\u6027\u67e5\u8a62\uff1a\u4ee5\u6642\u9593\u63db\u7a7a\u9593","text":"

\u8003\u616e\u76f4\u63a5\u8d70\u8a2a\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\u3002\u5982\u5716 10-9 \u6240\u793a\uff0c\u6211\u5011\u958b\u555f\u4e00\u500b\u5169\u5c64\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u5224\u65b7\u5169\u500b\u6574\u6578\u7684\u548c\u662f\u5426\u70ba target \uff0c\u82e5\u662f\uff0c\u5247\u8fd4\u56de\u5b83\u5011\u7684\u7d22\u5f15\u3002

\u5716 10-9 \u00a0 \u7dda\u6027\u67e5\u8a62\u6c42\u89e3\u5169\u6578\u4e4b\u548c

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209\"\"\"\n    # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u5217\u8209 */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 ###\ndef two_sum_brute_force(nums, target)\n  # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6b64\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u975e\u5e38\u8017\u6642\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u96dc\u6e4a\u67e5\u8a62\uff1a\u4ee5\u7a7a\u9593\u63db\u6642\u9593","text":"

\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u9375\u503c\u5c0d\u5206\u5225\u70ba\u9663\u5217\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u8ff4\u5708\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u57f7\u884c\u5716 10-10 \u6240\u793a\u7684\u6b65\u9a5f\u3002

  1. \u5224\u65b7\u6578\u5b57 target - nums[i] \u662f\u5426\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u9019\u5169\u500b\u5143\u7d20\u7684\u7d22\u5f15\u3002
  2. \u5c07\u9375\u503c\u5c0d nums[i] \u548c\u7d22\u5f15 i \u65b0\u589e\u9032\u96dc\u6e4a\u8868\u3002
<1><2><3>

\u5716 10-10 \u00a0 \u8f14\u52a9\u96dc\u6e4a\u8868\u6c42\u89e3\u5169\u6578\u4e4b\u548c

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff0c\u50c5\u9700\u55ae\u5c64\u8ff4\u5708\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868\"\"\"\n    # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    dic = {}\n    # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    unordered_map<int, int> dic;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Dictionary<int, int> dic = [];\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    hashTable := map[int]int{}\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic: [Int: Int] = [:]\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m = {};\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m: Map<number, number> = new Map();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e8c\uff1a \u8f14\u52a9\u96dc\u6e4a\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  Map<int, int> dic = HashMap();\n  // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let mut dic = HashMap::new();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
two_sum.c
/* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u96dc\u6e4a\u8868\u67e5\u8a62 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u96dc\u6e4a\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    val dic = HashMap<Int, Int>()\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  dic = {}\n  # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6b64\u65b9\u6cd5\u900f\u904e\u96dc\u6e4a\u67e5\u8a62\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u57f7\u884c\u6548\u7387\u3002

\u7531\u65bc\u9700\u8981\u7dad\u8b77\u4e00\u500b\u984d\u5916\u7684\u96dc\u6e4a\u8868\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5118\u7ba1\u5982\u6b64\uff0c\u8a72\u65b9\u6cd5\u7684\u6574\u9ad4\u6642\u7a7a\u6548\u7387\u66f4\u70ba\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u984c\u7684\u6700\u512a\u89e3\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5","text":"

\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u65bc\u5728\u8cc7\u6599\u7d50\u69cb\uff08\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u6216\u5716\uff09\u4e2d\u641c\u7d22\u4e00\u500b\u6216\u4e00\u7d44\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5143\u7d20\u3002

\u641c\u5c0b\u6f14\u7b97\u6cd5\u53ef\u6839\u64da\u5be6\u73fe\u601d\u8def\u5206\u70ba\u4ee5\u4e0b\u5169\u985e\u3002

  • \u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\uff0c\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u8d70\u8a2a\u7b49\u3002
  • \u5229\u7528\u8cc7\u6599\u7d44\u7e54\u7d50\u69cb\u6216\u8cc7\u6599\u5305\u542b\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u5be6\u73fe\u9ad8\u6548\u5143\u7d20\u67e5\u8a62\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u3001\u96dc\u6e4a\u67e5\u8a62\u548c\u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7b49\u3002

\u4e0d\u96e3\u767c\u73fe\uff0c\u9019\u4e9b\u77e5\u8b58\u9ede\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u56e0\u6b64\u641c\u5c0b\u6f14\u7b97\u6cd5\u5c0d\u65bc\u6211\u5011\u4f86\u8aaa\u4e26\u4e0d\u964c\u751f\u3002\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5c07\u5f9e\u66f4\u52a0\u7cfb\u7d71\u7684\u8996\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5be9\u8996\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u5c0b","text":"

\u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u7684\u6bcf\u500b\u5143\u7d20\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

  • \u201c\u7dda\u6027\u641c\u5c0b\u201d\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7b49\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u5b83\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u4e00\u7aef\u958b\u59cb\uff0c\u9010\u500b\u8a2a\u554f\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u5230\u9054\u53e6\u4e00\u7aef\u4ecd\u6c92\u6709\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
  • \u201c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u548c\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u662f\u5716\u548c\u6a39\u7684\u5169\u7a2e\u8d70\u8a2a\u7b56\u7565\u3002\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\u9010\u5c64\u641c\u5c0b\uff0c\u7531\u8fd1\u53ca\u9060\u5730\u8a2a\u554f\u5404\u500b\u7bc0\u9ede\u3002\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\uff0c\u6cbf\u8457\u4e00\u689d\u8def\u5f91\u8d70\u5230\u982d\uff0c\u518d\u56de\u6eaf\u4e26\u5617\u8a66\u5176\u4ed6\u8def\u5f91\uff0c\u76f4\u5230\u8d70\u8a2a\u5b8c\u6574\u500b\u8cc7\u6599\u7d50\u69cb\u3002

\u66b4\u529b\u641c\u5c0b\u7684\u512a\u9ede\u662f\u7c21\u55ae\u4e14\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u505a\u9810\u8655\u7406\u548c\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\u3002

\u7136\u800c\uff0c\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u5143\u7d20\u6578\u91cf\uff0c\u56e0\u6b64\u5728\u8cc7\u6599\u91cf\u8f03\u5927\u7684\u60c5\u6cc1\u4e0b\u6548\u80fd\u8f03\u5dee\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9069\u61c9\u641c\u5c0b","text":"

\u81ea\u9069\u61c9\u641c\u5c0b\u5229\u7528\u8cc7\u6599\u7684\u7279\u6709\u5c6c\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u4f86\u6700\u4f73\u5316\u641c\u5c0b\u904e\u7a0b\uff0c\u5f9e\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

  • \u201c\u4e8c\u5206\u641c\u5c0b\u201d\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u5be6\u73fe\u9ad8\u6548\u67e5\u8a62\uff0c\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002
  • \u201c\u96dc\u6e4a\u67e5\u8a62\u201d\u5229\u7528\u96dc\u6e4a\u8868\u5c07\u641c\u5c0b\u8cc7\u6599\u548c\u76ee\u6a19\u8cc7\u6599\u5efa\u7acb\u70ba\u9375\u503c\u5c0d\u5c0d\u6620\uff0c\u5f9e\u800c\u5be6\u73fe\u67e5\u8a62\u64cd\u4f5c\u3002
  • \u201c\u6a39\u67e5\u8a62\u201d\u5728\u7279\u5b9a\u7684\u6a39\u7d50\u69cb\uff08\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\uff09\u4e2d\uff0c\u57fa\u65bc\u6bd4\u8f03\u7bc0\u9ede\u503c\u4f86\u5feb\u901f\u6392\u9664\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u662f\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u7136\u800c\uff0c\u4f7f\u7528\u9019\u4e9b\u6f14\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u9810\u5148\u5c0d\u9663\u5217\u9032\u884c\u6392\u5e8f\uff0c\u96dc\u6e4a\u67e5\u8a62\u548c\u6a39\u67e5\u8a62\u90fd\u9700\u8981\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u7dad\u8b77\u9019\u4e9b\u8cc7\u6599\u7d50\u69cb\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u958b\u92b7\u3002

Tip

\u81ea\u9069\u61c9\u641c\u5c0b\u6f14\u7b97\u6cd5\u5e38\u88ab\u7a31\u70ba\u67e5\u8a62\u6f14\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u65bc\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u6aa2\u7d22\u76ee\u6a19\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u5c0b\u65b9\u6cd5\u9078\u53d6","text":"

\u7d66\u5b9a\u5927\u5c0f\u70ba \\(n\\) \u7684\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u7dda\u6027\u641c\u5c0b\u3001\u4e8c\u5206\u641c\u5c0b\u3001\u6a39\u67e5\u8a62\u3001\u96dc\u6e4a\u67e5\u8a62\u7b49\u591a\u7a2e\u65b9\u6cd5\u5f9e\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\u3002\u5404\u500b\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u5716 10-11 \u6240\u793a\u3002

\u5716 10-11 \u00a0 \u591a\u7a2e\u641c\u5c0b\u7b56\u7565

\u4e0a\u8ff0\u5e7e\u7a2e\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u8207\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

\u8868 10-1 \u00a0 \u67e5\u8a62\u6f14\u7b97\u6cd5\u6548\u7387\u5c0d\u6bd4

\u7dda\u6027\u641c\u5c0b \u4e8c\u5206\u641c\u5c0b \u6a39\u67e5\u8a62 \u96dc\u6e4a\u67e5\u8a62 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u984d\u5916\u7a7a\u9593 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u8cc7\u6599\u9810\u8655\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6a39 \\(O(n \\log n)\\) \u5efa\u96dc\u6e4a\u8868 \\(O(n)\\) \u8cc7\u6599\u662f\u5426\u6709\u5e8f \u7121\u5e8f \u6709\u5e8f \u6709\u5e8f \u7121\u5e8f

\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u9078\u64c7\u9084\u53d6\u6c7a\u65bc\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u8207\u66f4\u65b0\u983b\u7387\u7b49\u3002

\u7dda\u6027\u641c\u5c0b

  • \u901a\u7528\u6027\u8f03\u597d\uff0c\u7121\u9808\u4efb\u4f55\u8cc7\u6599\u9810\u8655\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u5011\u50c5\u9700\u67e5\u8a62\u4e00\u6b21\u8cc7\u6599\uff0c\u90a3\u9ebc\u5176\u4ed6\u4e09\u7a2e\u65b9\u6cd5\u7684\u8cc7\u6599\u9810\u8655\u7406\u7684\u6642\u9593\u6bd4\u7dda\u6027\u641c\u5c0b\u7684\u6642\u9593\u9084\u8981\u66f4\u9577\u3002
  • \u9069\u7528\u65bc\u9ad4\u91cf\u8f03\u5c0f\u7684\u8cc7\u6599\uff0c\u6b64\u60c5\u6cc1\u4e0b\u6642\u9593\u8907\u96dc\u5ea6\u5c0d\u6548\u7387\u5f71\u97ff\u8f03\u5c0f\u3002
  • \u9069\u7528\u65bc\u8cc7\u6599\u66f4\u65b0\u983b\u7387\u8f03\u9ad8\u7684\u5834\u666f\uff0c\u56e0\u70ba\u8a72\u65b9\u6cd5\u4e0d\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u4efb\u4f55\u984d\u5916\u7dad\u8b77\u3002

\u4e8c\u5206\u641c\u5c0b

  • \u9069\u7528\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u6548\u7387\u8868\u73fe\u7a69\u5b9a\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002
  • \u8cc7\u6599\u91cf\u4e0d\u80fd\u904e\u5927\uff0c\u56e0\u70ba\u5132\u5b58\u9663\u5217\u9700\u8981\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u4e0d\u9069\u7528\u65bc\u9ad8\u983b\u589e\u522a\u8cc7\u6599\u7684\u5834\u666f\uff0c\u56e0\u70ba\u7dad\u8b77\u6709\u5e8f\u9663\u5217\u7684\u958b\u92b7\u8f03\u5927\u3002

\u96dc\u6e4a\u67e5\u8a62

  • \u9069\u5408\u5c0d\u67e5\u8a62\u6548\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u5834\u666f\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002
  • \u4e0d\u9069\u5408\u9700\u8981\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u7121\u6cd5\u7dad\u8b77\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u3002
  • \u5c0d\u96dc\u6e4a\u51fd\u5f0f\u548c\u96dc\u6e4a\u885d\u7a81\u8655\u7406\u7b56\u7565\u7684\u4f9d\u8cf4\u6027\u8f03\u9ad8\uff0c\u5177\u6709\u8f03\u5927\u7684\u6548\u80fd\u52a3\u5316\u98a8\u96aa\u3002
  • \u4e0d\u9069\u5408\u8cc7\u6599\u91cf\u904e\u5927\u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u9700\u8981\u984d\u5916\u7a7a\u9593\u4f86\u6700\u5927\u7a0b\u5ea6\u5730\u6e1b\u5c11\u885d\u7a81\uff0c\u5f9e\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8a62\u6548\u80fd\u3002

\u6a39\u67e5\u8a62

  • \u9069\u7528\u65bc\u6d77\u91cf\u8cc7\u6599\uff0c\u56e0\u70ba\u6a39\u7bc0\u9ede\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u5206\u6563\u5132\u5b58\u7684\u3002
  • \u9069\u5408\u9700\u8981\u7dad\u8b77\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\u3002
  • \u5728\u6301\u7e8c\u589e\u522a\u7bc0\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u7522\u751f\u50be\u659c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • \u82e5\u4f7f\u7528 AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5247\u5404\u9805\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a69\u5b9a\u57f7\u884c\uff0c\u4f46\u7dad\u8b77\u6a39\u5e73\u8861\u7684\u64cd\u4f5c\u6703\u589e\u52a0\u984d\u5916\u7684\u958b\u92b7\u3002
"},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7d50","text":"
  • \u4e8c\u5206\u641c\u5c0b\u4f9d\u8cf4\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u900f\u904e\u8ff4\u5708\u9010\u6b65\u7e2e\u6e1b\u4e00\u534a\u641c\u5c0b\u5340\u9593\u4f86\u9032\u884c\u67e5\u8a62\u3002\u5b83\u8981\u6c42\u8f38\u5165\u8cc7\u6599\u6709\u5e8f\uff0c\u4e14\u50c5\u9069\u7528\u65bc\u9663\u5217\u6216\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u8cc7\u6599\u3002\u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\uff0c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u548c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u9069\u7528\u65bc\u5716\u548c\u6a39\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\uff0c\u4f46\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u8f03\u9ad8\u3002
  • \u96dc\u6e4a\u67e5\u8a62\u3001\u6a39\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u5c6c\u65bc\u9ad8\u6548\u641c\u5c0b\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u85c9\u52a9\u984d\u5916\u8cc7\u6599\u7d50\u69cb\u3002
  • \u5be6\u969b\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5c0d\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u548c\u66f4\u65b0\u983b\u7387\u7b49\u56e0\u7d20\u9032\u884c\u5177\u9ad4\u5206\u6790\uff0c\u5f9e\u800c\u9078\u64c7\u5408\u9069\u7684\u641c\u5c0b\u65b9\u6cd5\u3002
  • \u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u5c0f\u578b\u6216\u983b\u7e41\u66f4\u65b0\u7684\u8cc7\u6599\uff1b\u4e8c\u5206\u641c\u5c0b\u9069\u7528\u65bc\u5927\u578b\u3001\u6392\u5e8f\u7684\u8cc7\u6599\uff1b\u96dc\u6e4a\u67e5\u8a62\u9069\u7528\u65bc\u5c0d\u67e5\u8a62\u6548\u7387\u8981\u6c42\u8f03\u9ad8\u4e14\u7121\u9808\u7bc4\u570d\u67e5\u8a62\u7684\u8cc7\u6599\uff1b\u6a39\u67e5\u8a62\u9069\u7528\u65bc\u9700\u8981\u7dad\u8b77\u9806\u5e8f\u548c\u652f\u6301\u7bc4\u570d\u67e5\u8a62\u7684\u5927\u578b\u52d5\u614b\u8cc7\u6599\u3002
  • \u7528\u96dc\u6e4a\u67e5\u8a62\u66ff\u63db\u7dda\u6027\u67e5\u8a62\u662f\u4e00\u7a2e\u5e38\u7528\u7684\u6700\u4f73\u5316\u57f7\u884c\u6642\u9593\u7684\u7b56\u7565\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

Abstract

\u6392\u5e8f\u7336\u5982\u4e00\u628a\u5c07\u6df7\u4e82\u8b8a\u70ba\u79e9\u5e8f\u7684\u9b54\u6cd5\u9470\u5319\uff0c\u4f7f\u6211\u5011\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u8207\u8655\u7406\u8cc7\u6599\u3002

\u7121\u8ad6\u662f\u7c21\u55ae\u7684\u5347\u5e8f\uff0c\u9084\u662f\u8907\u96dc\u7684\u5206\u985e\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u5011\u5c55\u793a\u4e86\u8cc7\u6599\u7684\u548c\u8ae7\u7f8e\u611f\u3002

"},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5
  • 11.2 \u00a0 \u9078\u64c7\u6392\u5e8f
  • 11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f
  • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
  • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
  • 11.6 \u00a0 \u5408\u4f75\u6392\u5e8f
  • 11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f
  • 11.8 \u00a0 \u6876\u6392\u5e8f
  • 11.9 \u00a0 \u8a08\u6578\u6392\u5e8f
  • 11.10 \u00a0 \u57fa\u6578\u6392\u5e8f
  • 11.11 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f","text":"

\u6ce1\u6cab\u6392\u5e8f\uff08bubble sort\uff09\u900f\u904e\u9023\u7e8c\u5730\u6bd4\u8f03\u8207\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u5be6\u73fe\u6392\u5e8f\u3002\u9019\u500b\u904e\u7a0b\u5c31\u50cf\u6c23\u6ce1\u5f9e\u5e95\u90e8\u5347\u5230\u9802\u90e8\u4e00\u6a23\uff0c\u56e0\u6b64\u5f97\u540d\u6ce1\u6cab\u6392\u5e8f\u3002

\u5982\u5716 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u904e\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u4f86\u6a21\u64ec\uff1a\u5f9e\u9663\u5217\u6700\u5de6\u7aef\u958b\u59cb\u5411\u53f3\u8d70\u8a2a\uff0c\u4f9d\u6b21\u6bd4\u8f03\u76f8\u9130\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u63db\u4e8c\u8005\u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u7684\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u5230\u9663\u5217\u7684\u6700\u53f3\u7aef\u3002

<1><2><3><4><5><6><7>

\u5716 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u6a21\u64ec\u5192\u6ce1

"},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6b65\u9a5f\u5982\u5716 11-5 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5c0d \\(n\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  2. \u63a5\u4e0b\u4f86\uff0c\u5c0d\u5269\u9918 \\(n - 1\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  3. \u4ee5\u6b64\u985e\u63a8\uff0c\u7d93\u904e \\(n - 1\\) \u8f2a\u201c\u5192\u6ce1\u201d\u5f8c\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  4. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002

\u5716 11-5 \u00a0 \u6ce1\u6cab\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.cpp
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.java
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.cs
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.go
/* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
bubble_sort.swift
/* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
bubble_sort.js
/* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.ts
/* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.dart
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
bubble_sort.rs
/* \u6ce1\u6cab\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.c
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
bubble_sort.kt
/* \u6ce1\u6cab\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort}\n
bubble_sort.zig
// \u6ce1\u6cab\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u6700\u4f73\u5316","text":"

\u6211\u5011\u767c\u73fe\uff0c\u5982\u679c\u67d0\u8f2a\u201c\u5192\u6ce1\u201d\u4e2d\u6c92\u6709\u57f7\u884c\u4efb\u4f55\u4ea4\u63db\u64cd\u4f5c\uff0c\u8aaa\u660e\u9663\u5217\u5df2\u7d93\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7d50\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u500b\u6a19\u8a8c\u4f4d flag \u4f86\u76e3\u6e2c\u9019\u7a2e\u60c5\u6cc1\uff0c\u4e00\u65e6\u51fa\u73fe\u5c31\u7acb\u5373\u8fd4\u56de\u3002

\u7d93\u904e\u6700\u4f73\u5316\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(n^2)\\) \uff1b\u4f46\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u53ef\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.cpp
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.java
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.cs
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.go
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.swift
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.js
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.ts
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.dart
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
bubble_sort.rs
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
bubble_sort.c
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
bubble_sort.kt
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort_with_flag}\n
bubble_sort.zig
// \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5404\u8f2a\u201c\u5192\u6ce1\u201d\u8d70\u8a2a\u7684\u9663\u5217\u9577\u5ea6\u4f9d\u6b21\u70ba \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u7e3d\u548c\u70ba \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u6700\u4f73\u5316\u5f8c\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u63db\u3002
"},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u5e7e\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u90fd\u5c6c\u65bc\u201c\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u900f\u904e\u6bd4\u8f03\u5143\u7d20\u9593\u7684\u5927\u5c0f\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u6b64\u985e\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7121\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u63a2\u8a0e\u5e7e\u7a2e\u201c\u975e\u6bd4\u8f03\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u7dda\u6027\u968e\u3002

\u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u900f\u904e\u8a2d\u5b9a\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u9806\u5e8f\u7684\u6876\uff0c\u6bcf\u500b\u6876\u5c0d\u61c9\u4e00\u500b\u6578\u64da\u7bc4\u570d\uff0c\u5c07\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff1b\u7136\u5f8c\uff0c\u5728\u6bcf\u500b\u6876\u5167\u90e8\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff1b\u6700\u7d42\u6309\u7167\u6876\u7684\u9806\u5e8f\u5c07\u6240\u6709\u8cc7\u6599\u5408\u4f75\u3002

"},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u616e\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u5176\u5143\u7d20\u662f\u7bc4\u570d \\([0, 1)\\) \u5167\u7684\u6d6e\u9ede\u6578\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-13 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316 \\(k\\) \u500b\u6876\uff0c\u5c07 \\(n\\) \u500b\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u500b\u6876\u4e2d\u3002
  2. \u5c0d\u6bcf\u500b\u6876\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff08\u9019\u88e1\u63a1\u7528\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff09\u3002
  3. \u6309\u7167\u6876\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u5408\u4f75\u7d50\u679c\u3002

\u5716 11-13 \u00a0 \u6876\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums:\n        # \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i = int(num * k)\n        # \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
bucket_sort.cpp
/* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = num * k;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.java
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int) (num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int)(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
bucket_sort.go
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i := int(num * float64(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5167\u5efa\u5207\u7247\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
bucket_sort.swift
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
bucket_sort.js
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.ts
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.dart
/* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 _num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c07 _num \u65b0\u589e\u9032\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
bucket_sort.rs
/* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
bucket_sort.c
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8a18\u9304\u6bcf\u500b\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52d5\u614b\u9663\u5217\u7684\u9663\u5217\uff08\u6876\uff09\n    // \u70ba\u6bcf\u500b\u6876\u9810\u5206\u914d\u8db3\u5920\u7684\u7a7a\u9593\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u4f75\u6392\u5e8f\u5f8c\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(buckets[i]);\n    }\n}\n
bucket_sort.kt
/* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
bucket_sort.rb
[class]{}-[func]{bucket_sort}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u6876\u6392\u5e8f\u9069\u7528\u65bc\u8655\u7406\u9ad4\u91cf\u5f88\u5927\u7684\u8cc7\u6599\u3002\u4f8b\u5982\uff0c\u8f38\u5165\u8cc7\u6599\u5305\u542b 100 \u842c\u500b\u5143\u7d20\uff0c\u7531\u65bc\u7a7a\u9593\u9650\u5236\uff0c\u7cfb\u7d71\u8a18\u61b6\u9ad4\u7121\u6cd5\u4e00\u6b21\u6027\u8f09\u5165\u6240\u6709\u8cc7\u6599\u3002\u6b64\u6642\uff0c\u53ef\u4ee5\u5c07\u8cc7\u6599\u5206\u6210 1000 \u500b\u6876\uff0c\u7136\u5f8c\u5206\u5225\u5c0d\u6bcf\u500b\u6876\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5408\u4f75\u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\) \uff1a\u5047\u8a2d\u5143\u7d20\u5728\u5404\u500b\u6876\u5167\u5e73\u5747\u5206\u4f48\uff0c\u90a3\u9ebc\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u6578\u91cf\u70ba \\(\\frac{n}{k}\\) \u3002\u5047\u8a2d\u6392\u5e8f\u55ae\u500b\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u6642\u9593\uff0c\u5247\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u6642\u9593\u3002\u7576\u6876\u6578\u91cf \\(k\\) \u6bd4\u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5247\u8da8\u5411\u65bc \\(O(n)\\) \u3002\u5408\u4f75\u7d50\u679c\u6642\u9700\u8981\u8d70\u8a2a\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8cbb \\(O(n + k)\\) \u6642\u9593\u3002
  • \u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u8cc7\u6599\u88ab\u5206\u914d\u5230\u4e00\u500b\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8a72\u6876\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u85c9\u52a9 \\(k\\) \u500b\u6876\u548c\u7e3d\u5171 \\(n\\) \u500b\u5143\u7d20\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u6876\u6392\u5e8f\u662f\u5426\u7a69\u5b9a\u53d6\u6c7a\u65bc\u6392\u5e8f\u6876\u5167\u5143\u7d20\u7684\u6f14\u7b97\u6cd5\u662f\u5426\u7a69\u5b9a\u3002
"},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5be6\u73fe\u5e73\u5747\u5206\u914d","text":"

\u6876\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7406\u8ad6\u4e0a\u53ef\u4ee5\u9054\u5230 \\(O(n)\\) \uff0c\u95dc\u9375\u5728\u65bc\u5c07\u5143\u7d20\u5747\u52fb\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u56e0\u70ba\u5be6\u969b\u8cc7\u6599\u5f80\u5f80\u4e0d\u662f\u5747\u52fb\u5206\u4f48\u7684\u3002\u4f8b\u5982\uff0c\u6211\u5011\u60f3\u8981\u5c07\u6dd8\u5bf6\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u50f9\u683c\u7bc4\u570d\u5e73\u5747\u5206\u914d\u5230 10 \u500b\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u50f9\u683c\u5206\u4f48\u4e0d\u5747\uff0c\u4f4e\u65bc 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u65bc 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c07\u50f9\u683c\u5340\u9593\u5e73\u5747\u5283\u5206\u70ba 10 \u500b\uff0c\u5404\u500b\u6876\u4e2d\u7684\u5546\u54c1\u6578\u91cf\u5dee\u8ddd\u6703\u975e\u5e38\u5927\u3002

\u70ba\u5be6\u73fe\u5e73\u5747\u5206\u914d\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u8a2d\u5b9a\u4e00\u689d\u5927\u81f4\u7684\u5206\u754c\u7dda\uff0c\u5c07\u8cc7\u6599\u7c97\u7565\u5730\u5206\u5230 3 \u500b\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u7562\u5f8c\uff0c\u518d\u5c07\u5546\u54c1\u8f03\u591a\u7684\u6876\u7e7c\u7e8c\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6578\u91cf\u5927\u81f4\u76f8\u7b49\u3002

\u5982\u5716 11-14 \u6240\u793a\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u5efa\u7acb\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u76ee\u6a19\u662f\u8b93\u8449\u7bc0\u9ede\u7684\u503c\u5118\u53ef\u80fd\u5e73\u5747\u3002\u7576\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f2a\u5c07\u8cc7\u6599\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u5177\u9ad4\u5283\u5206\u65b9\u5f0f\u53ef\u6839\u64da\u8cc7\u6599\u7279\u9ede\u9748\u6d3b\u9078\u64c7\u3002

\u5716 11-14 \u00a0 \u905e\u8ff4\u5283\u5206\u6876

\u5982\u679c\u6211\u5011\u63d0\u524d\u77e5\u9053\u5546\u54c1\u50f9\u683c\u7684\u6a5f\u7387\u5206\u4f48\uff0c\u5247\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u6a5f\u7387\u5206\u4f48\u8a2d\u5b9a\u6bcf\u500b\u6876\u7684\u50f9\u683c\u5206\u754c\u7dda\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8cc7\u6599\u5206\u4f48\u4e26\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7d71\u8a08\uff0c\u4e5f\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u7279\u9ede\u63a1\u7528\u67d0\u7a2e\u6a5f\u7387\u6a21\u578b\u9032\u884c\u8fd1\u4f3c\u3002

\u5982\u5716 11-15 \u6240\u793a\uff0c\u6211\u5011\u5047\u8a2d\u5546\u54c1\u50f9\u683c\u670d\u5f9e\u6b63\u614b\u5206\u4f48\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8a2d\u5b9a\u50f9\u683c\u5340\u9593\uff0c\u5f9e\u800c\u5c07\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\u3002

\u5716 11-15 \u00a0 \u6839\u64da\u6a5f\u7387\u5206\u4f48\u5283\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8a08\u6578\u6392\u5e8f","text":"

\u8a08\u6578\u6392\u5e8f\uff08counting sort\uff09\u900f\u904e\u7d71\u8a08\u5143\u7d20\u6578\u91cf\u4f86\u5be6\u73fe\u6392\u5e8f\uff0c\u901a\u5e38\u61c9\u7528\u65bc\u6574\u6578\u9663\u5217\u3002

"},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7c21\u55ae\u5be6\u73fe","text":"

\u5148\u4f86\u770b\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\u3002\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8ca0\u6574\u6578\u201d\uff0c\u8a08\u6578\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-16 \u6240\u793a\u3002

  1. \u8d70\u8a2a\u9663\u5217\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6578\u5b57\uff0c\u8a18\u70ba \\(m\\) \uff0c\u7136\u5f8c\u5efa\u7acb\u4e00\u500b\u9577\u5ea6\u70ba \\(m + 1\\) \u7684\u8f14\u52a9\u9663\u5217 counter \u3002
  2. \u85c9\u52a9 counter \u7d71\u8a08 nums \u4e2d\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\uff0c\u5176\u4e2d counter[num] \u5c0d\u61c9\u6578\u5b57 num \u7684\u51fa\u73fe\u6b21\u6578\u3002\u7d71\u8a08\u65b9\u6cd5\u5f88\u7c21\u55ae\uff0c\u53ea\u9700\u8d70\u8a2a nums\uff08\u8a2d\u7576\u524d\u6578\u5b57\u70ba num\uff09\uff0c\u6bcf\u8f2a\u5c07 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
  3. \u7531\u65bc counter \u7684\u5404\u500b\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u7576\u65bc\u6240\u6709\u6578\u5b57\u5df2\u7d93\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8d70\u8a2a counter \uff0c\u6839\u64da\u5404\u6578\u5b57\u51fa\u73fe\u6b21\u6578\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

\u5716 11-16 \u00a0 \u8a08\u6578\u6392\u5e8f\u6d41\u7a0b

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
counting_sort.cpp
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.java
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.cs
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.go
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
counting_sort.swift
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
counting_sort.js
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.ts
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.dart
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
counting_sort.rs
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
counting_sort.c
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
counting_sort.kt
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort_naive}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8a08\u6578\u6392\u5e8f\u8207\u6876\u6392\u5e8f\u7684\u95dc\u806f

\u5f9e\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u6578\u6392\u5e8f\u4e2d\u7684\u8a08\u6578\u9663\u5217 counter \u7684\u6bcf\u500b\u7d22\u5f15\u8996\u70ba\u4e00\u500b\u6876\uff0c\u5c07\u7d71\u8a08\u6578\u91cf\u7684\u904e\u7a0b\u770b\u4f5c\u5c07\u5404\u500b\u5143\u7d20\u5206\u914d\u5230\u5c0d\u61c9\u7684\u6876\u4e2d\u3002\u672c\u8cea\u4e0a\uff0c\u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u8cc7\u6599\u4e0b\u7684\u4e00\u500b\u7279\u4f8b\u3002

"},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5be6\u73fe","text":"

\u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u5982\u679c\u8f38\u5165\u8cc7\u6599\u662f\u7269\u4ef6\uff0c\u4e0a\u8ff0\u6b65\u9a5f 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u662f\u5546\u54c1\u7269\u4ef6\uff0c\u6211\u5011\u60f3\u6309\u7167\u5546\u54c1\u50f9\u683c\uff08\u985e\u5225\u7684\u6210\u54e1\u8b8a\u6578\uff09\u5c0d\u5546\u54c1\u9032\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u6f14\u7b97\u6cd5\u53ea\u80fd\u7d66\u51fa\u50f9\u683c\u7684\u6392\u5e8f\u7d50\u679c\u3002

\u90a3\u9ebc\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u8cc7\u6599\u7684\u6392\u5e8f\u7d50\u679c\u5462\uff1f\u6211\u5011\u9996\u5148\u8a08\u7b97 counter \u7684\u201c\u524d\u7db4\u548c\u201d\u3002\u9867\u540d\u601d\u7fa9\uff0c\u7d22\u5f15 i \u8655\u7684\u524d\u7db4\u548c prefix[i] \u7b49\u65bc\u9663\u5217\u524d i \u500b\u5143\u7d20\u4e4b\u548c\uff1a

\\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

\u524d\u7db4\u548c\u5177\u6709\u660e\u78ba\u7684\u610f\u7fa9\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7d50\u679c\u9663\u5217 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\u3002\u9019\u500b\u8cc7\u8a0a\u975e\u5e38\u95dc\u9375\uff0c\u56e0\u70ba\u5b83\u544a\u8a34\u6211\u5011\u5404\u500b\u5143\u7d20\u61c9\u8a72\u51fa\u73fe\u5728\u7d50\u679c\u9663\u5217\u7684\u54ea\u500b\u4f4d\u7f6e\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5012\u5e8f\u8d70\u8a2a\u539f\u9663\u5217 nums \u7684\u6bcf\u500b\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u5c07 num \u586b\u5165\u9663\u5217 res \u7684\u7d22\u5f15 prefix[num] - 1 \u8655\u3002
  2. \u4ee4\u524d\u7db4\u548c prefix[num] \u6e1b\u5c0f \\(1\\) \uff0c\u5f9e\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u9663\u5217 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7d50\u679c\uff0c\u6700\u5f8c\u4f7f\u7528 res \u8986\u84cb\u539f\u9663\u5217 nums \u5373\u53ef\u3002\u5716 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8a08\u6578\u6392\u5e8f\u6d41\u7a0b\u3002

<1><2><3><4><5><6><7><8>

\u5716 11-17 \u00a0 \u8a08\u6578\u6392\u5e8f\u6b65\u9a5f

\u8a08\u6578\u6392\u5e8f\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    # \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1  # \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n
counting_sort.cpp
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    nums = res;\n}\n
counting_sort.java
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.cs
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.go
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    copy(nums, res)\n}\n
counting_sort.swift
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1 // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.js
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.ts
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.dart
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n  // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c07 _num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n    counter[_num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  nums.setAll(0, res);\n}\n
counting_sort.rs
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.c
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
counting_sort.kt
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]-- // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f \uff1a\u6d89\u53ca\u8d70\u8a2a nums \u548c\u8d70\u8a2a counter \uff0c\u90fd\u4f7f\u7528\u7dda\u6027\u6642\u9593\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b \\(n \\gg m\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u65bc \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u85c9\u52a9\u4e86\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \u7684\u9663\u5217 res \u548c counter \u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u9806\u5e8f\u662f\u201c\u5f9e\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u8d70\u8a2a nums \u53ef\u4ee5\u907f\u514d\u6539\u8b8a\u76f8\u7b49\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5be6\u73fe\u7a69\u5b9a\u6392\u5e8f\u3002\u5be6\u969b\u4e0a\uff0c\u6b63\u5e8f\u8d70\u8a2a nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\uff0c\u4f46\u7d50\u679c\u662f\u975e\u7a69\u5b9a\u7684\u3002
"},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u4fb7\u9650\u6027","text":"

\u770b\u5230\u9019\u88e1\uff0c\u4f60\u4e5f\u8a31\u6703\u89ba\u5f97\u8a08\u6578\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u50c5\u900f\u904e\u7d71\u8a08\u6578\u91cf\u5c31\u53ef\u4ee5\u5be6\u73fe\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\u76f8\u5c0d\u8f03\u70ba\u56b4\u683c\u3002

\u8a08\u6578\u6392\u5e8f\u53ea\u9069\u7528\u65bc\u975e\u8ca0\u6574\u6578\u3002\u82e5\u60f3\u5c07\u5176\u7528\u65bc\u5176\u4ed6\u578b\u5225\u7684\u8cc7\u6599\uff0c\u9700\u8981\u78ba\u4fdd\u9019\u4e9b\u8cc7\u6599\u53ef\u4ee5\u8f49\u63db\u70ba\u975e\u8ca0\u6574\u6578\uff0c\u4e26\u4e14\u5728\u8f49\u63db\u904e\u7a0b\u4e2d\u4e0d\u80fd\u6539\u8b8a\u5404\u500b\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u5927\u5c0f\u95dc\u4fc2\u3002\u4f8b\u5982\uff0c\u5c0d\u65bc\u5305\u542b\u8ca0\u6578\u7684\u6574\u6578\u9663\u5217\uff0c\u53ef\u4ee5\u5148\u7d66\u6240\u6709\u6578\u5b57\u52a0\u4e0a\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5168\u90e8\u6578\u5b57\u8f49\u5316\u70ba\u6b63\u6578\uff0c\u6392\u5e8f\u5b8c\u6210\u5f8c\u518d\u8f49\u63db\u56de\u53bb\u3002

\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5247\u6703\u4f54\u7528\u904e\u591a\u7a7a\u9593\u3002\u800c\u7576 \\(n \\ll m\\) \u6642\uff0c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u9084\u8981\u6162\u3002

"},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f","text":"

Tip

\u95b1\u8b80\u672c\u7bc0\u524d\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b78\u5b8c\u201c\u5806\u7a4d\u201c\u7ae0\u7bc0\u3002

\u5806\u7a4d\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\u7684\u9ad8\u6548\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u6211\u5011\u53ef\u4ee5\u5229\u7528\u5df2\u7d93\u5b78\u904e\u7684\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u201d\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\u3002

  1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5c0f\u9802\u5806\u7a4d\uff0c\u6b64\u6642\u6700\u5c0f\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
  2. \u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8a18\u9304\u51fa\u5806\u7a4d\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

\u4ee5\u4e0a\u65b9\u6cd5\u96d6\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u85c9\u52a9\u4e00\u500b\u984d\u5916\u9663\u5217\u4f86\u5132\u5b58\u5f48\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f03\u6d6a\u8cbb\u7a7a\u9593\u3002\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u4e00\u7a2e\u66f4\u52a0\u512a\u96c5\u7684\u5be6\u73fe\u65b9\u5f0f\u3002

"},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5806\u7a4d\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-12 \u6240\u793a\u3002

  1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5927\u9802\u5806\u7a4d\u3002\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
  2. \u5c07\u5806\u7a4d\u9802\u5143\u7d20\uff08\u7b2c\u4e00\u500b\u5143\u7d20\uff09\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u6700\u5f8c\u4e00\u500b\u5143\u7d20\uff09\u4ea4\u63db\u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u6e1b \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6578\u91cf\u52a0 \\(1\\) \u3002
  3. \u5f9e\u5806\u7a4d\u9802\u5143\u7d20\u958b\u59cb\uff0c\u5f9e\u9802\u5230\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u7a4d\u5316\u5f8c\uff0c\u5806\u7a4d\u7684\u6027\u8cea\u5f97\u5230\u4fee\u5fa9\u3002
  4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u8ff4\u5708 \\(n - 1\\) \u8f2a\u5f8c\uff0c\u5373\u53ef\u5b8c\u6210\u9663\u5217\u6392\u5e8f\u3002

Tip

\u5be6\u969b\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u500b\u5f48\u51fa\u5143\u7d20\u7684\u6b65\u9a5f\u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u5716 11-12 \u00a0 \u5806\u7a4d\u6392\u5e8f\u6b65\u9a5f

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u4f7f\u7528\u4e86\u8207\u201c\u5806\u7a4d\u201d\u7ae0\u7bc0\u76f8\u540c\u7684\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 sift_down() \u51fd\u5f0f\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u5806\u7a4d\u7684\u9577\u5ea6\u6703\u96a8\u8457\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u6e1b\u5c0f\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u7d66 sift_down() \u51fd\u5f0f\u65b0\u589e\u4e00\u500b\u9577\u5ea6\u53c3\u6578 \\(n\\) \uff0c\u7528\u65bc\u6307\u5b9a\u5806\u7a4d\u7684\u7576\u524d\u6709\u6548\u9577\u5ea6\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u7a4d\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0)\n
heap_sort.cpp
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.java
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.cs
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
heap_sort.go
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.swift
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums.swapAt(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
heap_sort.js
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.ts
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.dart
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
heap_sort.rs
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
heap_sort.c
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.kt
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.rb
[class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
heap_sort.zig
[class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5efa\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff0c\u5171\u8ff4\u5708 \\(n - 1\\) \u8f2a\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u4f7f\u7528 \\(O(1)\\) \u7a7a\u9593\u3002\u5143\u7d20\u4ea4\u63db\u548c\u5806\u7a4d\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u548c\u5806\u7a4d\u5e95\u5143\u7d20\u6642\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5c0d\u4f4d\u7f6e\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002
"},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u7a2e\u7c21\u55ae\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u8207\u624b\u52d5\u6574\u7406\u4e00\u526f\u724c\u7684\u904e\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

\u5177\u9ad4\u4f86\u8aaa\uff0c\u6211\u5011\u5728\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u4e00\u500b\u57fa\u6e96\u5143\u7d20\uff0c\u5c07\u8a72\u5143\u7d20\u8207\u5176\u5de6\u5074\u5df2\u6392\u5e8f\u5340\u9593\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f03\u5927\u5c0f\uff0c\u4e26\u5c07\u8a72\u5143\u7d20\u63d2\u5165\u5230\u6b63\u78ba\u7684\u4f4d\u7f6e\u3002

\u5716 11-6 \u5c55\u793a\u4e86\u9663\u5217\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8a2d\u57fa\u6e96\u5143\u7d20\u70ba base \uff0c\u6211\u5011\u9700\u8981\u5c07\u5f9e\u76ee\u6a19\u7d22\u5f15\u5230 base \u4e4b\u9593\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\uff0c\u7136\u5f8c\u5c07 base \u8ce6\u503c\u7d66\u76ee\u6a19\u7d22\u5f15\u3002

\u5716 11-6 \u00a0 \u55ae\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-7 \u6240\u793a\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u9663\u5217\u7684\u7b2c 1 \u500b\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
  2. \u9078\u53d6\u9663\u5217\u7684\u7b2c 2 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9078\u53d6\u7b2c 3 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 3 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u985e\u63a8\uff0c\u5728\u6700\u5f8c\u4e00\u8f2a\u4e2d\uff0c\u9078\u53d6\u6700\u5f8c\u4e00\u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

\u5716 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.swift
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.js
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.ts
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.dart
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  }\n}\n
insertion_sort.rs
/* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.c
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
insertion_sort.kt
/* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u8ff4\u5708: \u5df2\u6392\u5e8f\u5143\u7d20\u70ba 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.rb
### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  end\nend\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u5225\u9700\u8981\u8ff4\u5708 \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u8cc7\u6599\u6642\uff0c\u63d2\u5165\u64cd\u4f5c\u6703\u63d0\u524d\u7d42\u6b62\u3002\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u63d2\u5165\u6392\u5e8f\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u6703\u5c07\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\uff0c\u4e0d\u6703\u6539\u8b8a\u5b83\u5011\u7684\u9806\u5e8f\u3002
"},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u512a\u52e2","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u800c\u6211\u5011\u5373\u5c07\u5b78\u7fd2\u7684\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u5118\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u7684\u60c5\u6cc1\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

\u9019\u500b\u7d50\u8ad6\u8207\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u7684\u9069\u7528\u60c5\u6cc1\u7684\u7d50\u8ad6\u985e\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u9019\u985e \\(O(n \\log n)\\) \u7684\u6f14\u7b97\u6cd5\u5c6c\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u55ae\u5143\u8a08\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6578\u503c\u6bd4\u8f03\u63a5\u8fd1\uff0c\u8907\u96dc\u5ea6\u4e0d\u4f54\u4e3b\u5c0e\u5730\u4f4d\uff0c\u6bcf\u8f2a\u4e2d\u7684\u55ae\u5143\u64cd\u4f5c\u6578\u91cf\u8d77\u5230\u6c7a\u5b9a\u6027\u4f5c\u7528\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u63a1\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u70ba\uff1a\u5c0d\u65bc\u9577\u9663\u5217\uff0c\u63a1\u7528\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5c0d\u65bc\u77ed\u9663\u5217\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

\u96d6\u7136\u6ce1\u6cab\u6392\u5e8f\u3001\u9078\u64c7\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \uff0c\u4f46\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u983b\u7387\u986f\u8457\u9ad8\u65bc\u6ce1\u6cab\u6392\u5e8f\u548c\u9078\u64c7\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u6ce1\u6cab\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u4ea4\u63db\u5be6\u73fe\uff0c\u9700\u8981\u85c9\u52a9\u4e00\u500b\u81e8\u6642\u8b8a\u6578\uff0c\u5171\u6d89\u53ca 3 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u8ce6\u503c\u5be6\u73fe\uff0c\u50c5\u9700 1 \u500b\u55ae\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u8a08\u7b97\u958b\u92b7\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
  • \u9078\u64c7\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u6cc1\u4e0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002\u5982\u679c\u7d66\u5b9a\u4e00\u7d44\u90e8\u5206\u6709\u5e8f\u7684\u8cc7\u6599\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9078\u64c7\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
  • \u9078\u64c7\u6392\u5e8f\u4e0d\u7a69\u5b9a\uff0c\u7121\u6cd5\u61c9\u7528\u65bc\u591a\u7d1a\u6392\u5e8f\u3002
"},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5408\u4f75\u6392\u5e8f","text":"

\u5408\u4f75\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5305\u542b\u5716 11-10 \u6240\u793a\u7684\u201c\u5283\u5206\u201d\u548c\u201c\u5408\u4f75\u201d\u968e\u6bb5\u3002

  1. \u5283\u5206\u968e\u6bb5\uff1a\u900f\u904e\u905e\u8ff4\u4e0d\u65b7\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u958b\uff0c\u5c07\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u8f49\u63db\u70ba\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002
  2. \u5408\u4f75\u968e\u6bb5\uff1a\u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u5283\u5206\uff0c\u958b\u59cb\u5408\u4f75\uff0c\u6301\u7e8c\u5730\u5c07\u5de6\u53f3\u5169\u500b\u8f03\u77ed\u7684\u6709\u5e8f\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u8f03\u9577\u7684\u6709\u5e8f\u9663\u5217\uff0c\u76f4\u81f3\u7d50\u675f\u3002

\u5716 11-10 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5283\u5206\u8207\u5408\u4f75\u968e\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u5982\u5716 11-11 \u6240\u793a\uff0c\u201c\u5283\u5206\u968e\u6bb5\u201d\u5f9e\u9802\u81f3\u5e95\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u5207\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002

  1. \u8a08\u7b97\u9663\u5217\u4e2d\u9ede mid \uff0c\u905e\u8ff4\u5283\u5206\u5de6\u5b50\u9663\u5217\uff08\u5340\u9593 [left, mid] \uff09\u548c\u53f3\u5b50\u9663\u5217\uff08\u5340\u9593 [mid + 1, right] \uff09\u3002
  2. \u905e\u8ff4\u57f7\u884c\u6b65\u9a5f 1. \uff0c\u76f4\u81f3\u5b50\u9663\u5217\u5340\u9593\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u3002

\u201c\u5408\u4f75\u968e\u6bb5\u201d\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f9e\u9577\u5ea6\u70ba 1 \u7684\u5b50\u9663\u5217\u958b\u59cb\u5408\u4f75\uff0c\u5408\u4f75\u968e\u6bb5\u4e2d\u7684\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u662f\u6709\u5e8f\u7684\u3002

<1><2><3><4><5><6><7><8><9><10>

\u5716 11-11 \u00a0 \u5408\u4f75\u6392\u5e8f\u6b65\u9a5f

\u89c0\u5bdf\u767c\u73fe\uff0c\u5408\u4f75\u6392\u5e8f\u8207\u4e8c\u5143\u6a39\u5f8c\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u9806\u5e8f\u662f\u4e00\u81f4\u7684\u3002

  • \u5f8c\u5e8f\u8d70\u8a2a\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u6a39\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u6a39\uff0c\u6700\u5f8c\u8655\u7406\u6839\u7bc0\u9ede\u3002
  • \u5408\u4f75\u6392\u5e8f\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u9663\u5217\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u9663\u5217\uff0c\u6700\u5f8c\u8655\u7406\u5408\u4f75\u3002

\u5408\u4f75\u6392\u5e8f\u7684\u5be6\u73fe\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\u3002\u8acb\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u4f75\u5340\u9593\u70ba [left, right] \uff0c\u800c tmp \u7684\u5c0d\u61c9\u5340\u9593\u70ba [0, right - left] \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\"\"\"\n    # \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    # \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5408\u4f75\u6392\u5e8f\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if left >= right:\n        return  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    # \u5283\u5206\u968e\u6bb5\n    mid = (left + right) // 2  # \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid)  # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right)  # \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    # \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n
merge_sort.cpp
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.java
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;       // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    MergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    MergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    Merge(nums, left, mid, right);\n}\n
merge_sort.go
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.swift
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right { // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums: &nums, left: left, right: mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
merge_sort.js
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.dart
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n  // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  // \u5283\u5206\u968e\u6bb5\n  int mid = (left + right) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\n  mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n  mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n  // \u5408\u4f75\u968e\u6bb5\n  merge(nums, left, mid, right);\n}\n
merge_sort.rs
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    }\n\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.c
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.kt
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else \n            tmp[k++] = nums[j++]\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return  // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    val mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.rb
[class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
merge_sort.zig
// \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n// \u5de6\u5b50\u9663\u5217\u5340\u9593 [left, mid]\n// \u53f3\u5b50\u9663\u5217\u5340\u9593 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f14\u52a9\u9663\u5217\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u5225\u6307\u5411\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u900f\u904e\u8986\u84cb\u539f\u9663\u5217 nums \u4f86\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u53f3\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 <= \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u5de6\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u672a\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 > \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5408\u4f75\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;              // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    var mid = (left + right) / 2;           // \u8a08\u7b97\u4e2d\u9ede\n    try mergeSort(nums, left, mid);         // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    try mergeSort(nums, mid + 1, right);    // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    try merge(nums, left, mid, right);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5283\u5206\u7522\u751f\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u5c64\u5408\u4f75\u7684\u7e3d\u64cd\u4f5c\u6578\u91cf\u70ba \\(n\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u905e\u8ff4\u6df1\u5ea6\u70ba \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u5408\u4f75\u64cd\u4f5c\u9700\u8981\u85c9\u52a9\u8f14\u52a9\u9663\u5217\u5be6\u73fe\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u4f75\u904e\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u8b8a\u3002
"},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u93c8\u7d50\u4e32\u5217\u6392\u5e8f","text":"

\u5c0d\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u5408\u4f75\u6392\u5e8f\u76f8\u8f03\u65bc\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\u5177\u6709\u986f\u8457\u512a\u52e2\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u6392\u5e8f\u4efb\u52d9\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002

  • \u5283\u5206\u968e\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u905e\u8ff4\u201d\u4f86\u5be6\u73fe\u93c8\u7d50\u4e32\u5217\u5283\u5206\u5de5\u4f5c\uff0c\u5f9e\u800c\u7701\u53bb\u905e\u8ff4\u4f7f\u7528\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
  • \u5408\u4f75\u968e\u6bb5\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u50c5\u9700\u6539\u8b8a\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u5be6\u73fe\uff0c\u56e0\u6b64\u5408\u4f75\u968e\u6bb5\uff08\u5c07\u5169\u500b\u77ed\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\u5408\u4f75\u70ba\u4e00\u500b\u9577\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\uff09\u7121\u9808\u5efa\u7acb\u984d\u5916\u93c8\u7d50\u4e32\u5217\u3002

\u5177\u9ad4\u5be6\u73fe\u7d30\u7bc0\u6bd4\u8f03\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u76f8\u95dc\u8cc7\u6599\u9032\u884c\u5b78\u7fd2\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u57f7\u884c\u9ad8\u6548\uff0c\u61c9\u7528\u5ee3\u6cdb\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5176\u76ee\u6a19\u662f\uff1a\u9078\u64c7\u9663\u5217\u4e2d\u7684\u67d0\u500b\u5143\u7d20\u4f5c\u70ba\u201c\u57fa\u6e96\u6578\u201d\uff0c\u5c07\u6240\u6709\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u5074\uff0c\u800c\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u5074\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u54e8\u5175\u5283\u5206\u7684\u6d41\u7a0b\u5982\u5716 11-8 \u6240\u793a\u3002

  1. \u9078\u53d6\u9663\u5217\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u521d\u59cb\u5316\u5169\u500b\u6307\u6a19 i \u548c j \u5206\u5225\u6307\u5411\u9663\u5217\u7684\u5169\u7aef\u3002
  2. \u8a2d\u5b9a\u4e00\u500b\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u5225\u5c0b\u627e\u7b2c\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u5f8c\u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\u3002
  3. \u8ff4\u5708\u57f7\u884c\u6b65\u9a5f 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u6642\u505c\u6b62\uff0c\u6700\u5f8c\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u500b\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 11-8 \u00a0 \u54e8\u5175\u5283\u5206\u6b65\u9a5f

\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u539f\u9663\u5217\u88ab\u5283\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u9663\u5217\u3001\u57fa\u6e96\u6578\u3001\u53f3\u5b50\u9663\u5217\uff0c\u4e14\u6eff\u8db3\u201c\u5de6\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u6e96\u6578 \\(\\leq\\) \u53f3\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u53ea\u9700\u5c0d\u9019\u5169\u500b\u5b50\u9663\u5217\u9032\u884c\u6392\u5e8f\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

\u54e8\u5175\u5283\u5206\u7684\u5be6\u8cea\u662f\u5c07\u4e00\u500b\u8f03\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u7c21\u5316\u70ba\u5169\u500b\u8f03\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u63db */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u54e8\u5175\u5283\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u54e8\u5175\u5283\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u63db */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u5143\u7d20\u4ea4\u63db */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u5143\u7d20\u4ea4\u63db */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u54e8\u5175\u5283\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n    return i;\n}\n
quick_sort.kt
/* \u5143\u7d20\u4ea4\u63db */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i              // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{partition}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u63db\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5283\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u5feb\u901f\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-9 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5c0d\u539f\u9663\u5217\u57f7\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u3002
  2. \u7136\u5f8c\uff0c\u5c0d\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5206\u5225\u905e\u8ff4\u57f7\u884c\u201c\u54e8\u5175\u5283\u5206\u201d\u3002
  3. \u6301\u7e8c\u905e\u8ff4\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\uff0c\u5f9e\u800c\u5b8c\u6210\u6574\u500b\u9663\u5217\u7684\u6392\u5e8f\u3002

\u5716 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right:\n        return\n    # \u54e8\u5175\u5283\u5206\n    pivot = self.partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = Partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    pivot := q.partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  if (left >= right) return;\n  // \u54e8\u5175\u5283\u5206\n  int pivot = _partition(nums, left, right);\n  // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return\n    // \u54e8\u5175\u5283\u5206\n    val pivot = partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    var pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u6cc1\u4e0b\uff0c\u54e8\u5175\u5283\u5206\u7684\u905e\u8ff4\u5c64\u6578\u70ba \\(\\log n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u7e3d\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n \\log n)\\) \u6642\u9593\u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u5283\u5206\u70ba\u9577\u5ea6\u70ba \\(0\\) \u548c \\(n - 1\\) \u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u6b64\u6642\u905e\u8ff4\u5c64\u6578\u9054\u5230 \\(n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f38\u5165\u9663\u5217\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u6cc1\u4e0b\uff0c\u9054\u5230\u6700\u5dee\u905e\u8ff4\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\uff0c\u672a\u85c9\u52a9\u984d\u5916\u9663\u5217\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5283\u5206\u7684\u6700\u5f8c\u4e00\u6b65\uff0c\u57fa\u6e96\u6578\u53ef\u80fd\u6703\u88ab\u4ea4\u63db\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\u3002
"},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u70ba\u4ec0\u9ebc\u5feb","text":"

\u5f9e\u540d\u7a31\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u61c9\u8a72\u5177\u6709\u4e00\u5b9a\u7684\u512a\u52e2\u3002\u5118\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u8207\u201c\u5408\u4f75\u6392\u5e8f\u201d\u548c\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u51fa\u73fe\u6700\u5dee\u60c5\u6cc1\u7684\u6a5f\u7387\u5f88\u4f4e\uff1a\u96d6\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u6c92\u6709\u5408\u4f75\u6392\u5e8f\u7a69\u5b9a\uff0c\u4f46\u5728\u7d55\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u57f7\u884c\u3002
  • \u5feb\u53d6\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u57f7\u884c\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u6642\uff0c\u7cfb\u7d71\u53ef\u5c07\u6574\u500b\u5b50\u9663\u5217\u8f09\u5165\u5230\u5feb\u53d6\uff0c\u56e0\u6b64\u8a2a\u554f\u5143\u7d20\u7684\u6548\u7387\u8f03\u9ad8\u3002\u800c\u50cf\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u9019\u985e\u6f14\u7b97\u6cd5\u9700\u8981\u8df3\u8e8d\u5f0f\u8a2a\u554f\u5143\u7d20\uff0c\u5f9e\u800c\u7f3a\u4e4f\u9019\u4e00\u7279\u6027\u3002
  • \u8907\u96dc\u5ea6\u7684\u5e38\u6578\u4fc2\u6578\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u7a2e\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f03\u3001\u8ce6\u503c\u3001\u4ea4\u63db\u7b49\u64cd\u4f5c\u7684\u7e3d\u6578\u91cf\u6700\u5c11\u3002\u9019\u8207\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u985e\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u6e96\u6578\u6700\u4f73\u5316","text":"

\u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\u7684\u6642\u9593\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u8209\u4e00\u500b\u6975\u7aef\u4f8b\u5b50\uff0c\u5047\u8a2d\u8f38\u5165\u9663\u5217\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u65bc\u6211\u5011\u9078\u64c7\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u5728\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u57fa\u6e96\u6578\u88ab\u4ea4\u63db\u81f3\u9663\u5217\u6700\u53f3\u7aef\uff0c\u5c0e\u81f4\u5de6\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(n - 1\\)\u3001\u53f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(0\\) \u3002\u5982\u6b64\u905e\u8ff4\u4e0b\u53bb\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u5f8c\u90fd\u6709\u4e00\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u70ba\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

\u70ba\u4e86\u5118\u91cf\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u767c\u751f\uff0c\u6211\u5011\u53ef\u4ee5\u6700\u4f73\u5316\u54e8\u5175\u5283\u5206\u4e2d\u7684\u57fa\u6e96\u6578\u7684\u9078\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u5011\u53ef\u4ee5\u96a8\u6a5f\u9078\u53d6\u4e00\u500b\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u7136\u800c\uff0c\u5982\u679c\u904b\u6c23\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9078\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u6e96\u6578\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u76e1\u5982\u4eba\u610f\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u507d\u96a8\u6a5f\u6578\u201d\u3002\u5982\u679c\u6211\u5011\u91dd\u5c0d\u507d\u96a8\u6a5f\u6578\u5e8f\u5217\u69cb\u5efa\u4e00\u500b\u7279\u5b9a\u7684\u6e2c\u8a66\u6a23\u4f8b\uff0c\u90a3\u9ebc\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

\u70ba\u4e86\u9032\u4e00\u6b65\u6539\u9032\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u9663\u5217\u4e2d\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\uff08\u901a\u5e38\u70ba\u9663\u5217\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u9ede\u5143\u7d20\uff09\uff0c\u4e26\u5c07\u9019\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u57fa\u6e96\u6578\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6a5f\u7387\u5c07\u5927\u5e45\u63d0\u5347\u3002\u7576\u7136\uff0c\u6211\u5011\u9084\u53ef\u4ee5\u9078\u53d6\u66f4\u591a\u5019\u9078\u5143\u7d20\uff0c\u4ee5\u9032\u4e00\u6b65\u63d0\u9ad8\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002\u63a1\u7528\u9019\u7a2e\u65b9\u6cd5\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6a5f\u7387\u5927\u5927\u964d\u4f4e\u3002

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u9593\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u9593\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.js
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u9593\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u9593\n  return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.kt
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i                         // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
quick_sort.zig
// \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n// \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u905e\u8ff4\u6700\u4f73\u5316","text":"

\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u4f54\u7528\u7a7a\u9593\u8f03\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f38\u5165\u9663\u5217\u70ba\u4f8b\uff0c\u8a2d\u905e\u8ff4\u4e2d\u7684\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(m\\) \uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u7522\u751f\u9577\u5ea6\u70ba \\(0\\) \u7684\u5de6\u5b50\u9663\u5217\u548c\u9577\u5ea6\u70ba \\(m - 1\\) \u7684\u53f3\u5b50\u9663\u5217\uff0c\u9019\u610f\u5473\u8457\u6bcf\u4e00\u5c64\u905e\u8ff4\u547c\u53eb\u6e1b\u5c11\u7684\u554f\u984c\u898f\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u6e1b\u5c11\u4e00\u500b\u5143\u7d20\uff09\uff0c\u905e\u8ff4\u6a39\u7684\u9ad8\u5ea6\u6703\u9054\u5230 \\(n - 1\\) \uff0c\u6b64\u6642\u9700\u8981\u4f54\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002

\u70ba\u4e86\u9632\u6b62\u5806\u758a\u5e40\u7a7a\u9593\u7684\u7d2f\u7a4d\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u6bcf\u8f2a\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u5f8c\uff0c\u6bd4\u8f03\u5169\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\uff0c\u50c5\u5c0d\u8f03\u77ed\u7684\u5b50\u9663\u5217\u9032\u884c\u905e\u8ff4\u3002\u7531\u65bc\u8f03\u77ed\u5b50\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u6703\u8d85\u904e \\(n / 2\\) \uff0c\u56e0\u6b64\u9019\u7a2e\u65b9\u6cd5\u80fd\u78ba\u4fdd\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff0c\u5f9e\u800c\u5c07\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right:\n        # \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    for left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n      left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n      right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    }\n  }\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            l = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            r = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.rb
[class]{QuickSortTailCall}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                   // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6578\u6392\u5e8f","text":"

\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u8a08\u6578\u6392\u5e8f\uff0c\u5b83\u9069\u7528\u65bc\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5927\u4f46\u8cc7\u6599\u7bc4\u570d \\(m\\) \u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u5c0d \\(n = 10^6\\) \u500b\u5b78\u865f\u9032\u884c\u6392\u5e8f\uff0c\u800c\u5b78\u865f\u662f\u4e00\u500b \\(8\\) \u4f4d\u6578\u5b57\uff0c\u9019\u610f\u5473\u8457\u8cc7\u6599\u7bc4\u570d \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u800c\u57fa\u6578\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u3002

\u57fa\u6578\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u8207\u8a08\u6578\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u900f\u904e\u7d71\u8a08\u500b\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u57fa\u6578\u6392\u5e8f\u5229\u7528\u6578\u5b57\u5404\u4f4d\u4e4b\u9593\u7684\u905e\u9032\u95dc\u4fc2\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u4e00\u4f4d\u9032\u884c\u6392\u5e8f\uff0c\u5f9e\u800c\u5f97\u5230\u6700\u7d42\u7684\u6392\u5e8f\u7d50\u679c\u3002

"},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u4ee5\u5b78\u865f\u8cc7\u6599\u70ba\u4f8b\uff0c\u5047\u8a2d\u6578\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6578\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-18 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4f4d\u6578 \\(k = 1\\) \u3002
  2. \u5c0d\u5b78\u865f\u7684\u7b2c \\(k\\) \u4f4d\u57f7\u884c\u201c\u8a08\u6578\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u5f8c\uff0c\u8cc7\u6599\u6703\u6839\u64da\u7b2c \\(k\\) \u4f4d\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u3002
  3. \u5c07 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u5f8c\u8fd4\u56de\u6b65\u9a5f 2. \u7e7c\u7e8c\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u5f8c\u7d50\u675f\u3002

\u5716 11-18 \u00a0 \u57fa\u6578\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u5256\u6790\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u65bc\u4e00\u500b \\(d\\) \u9032\u4f4d\u5236\u7684\u6578\u5b57 \\(x\\) \uff0c\u8981\u7372\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8a08\u7b97\u516c\u5f0f\uff1a

\\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5c0d\u6d6e\u9ede\u6578 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5c0d \\(d\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\u3002\u5c0d\u65bc\u5b78\u865f\u8cc7\u6599\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

\u6b64\u5916\uff0c\u6211\u5011\u9700\u8981\u5c0f\u5e45\u6539\u52d5\u8a08\u6578\u6392\u5e8f\u7a0b\u5f0f\u78bc\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u64da\u6578\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u9032\u884c\u6392\u5e8f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
def digit(num: int, exp: int) -> int:\n    \"\"\"\u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter = [0] * 10\n    n = len(nums)\n    # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1  # \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6578\u6392\u5e8f\"\"\"\n    # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    m = max(nums)\n    # \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    exp = 1\n    while exp <= m:\n        # \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
radix_sort.cpp
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
radix_sort.java
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.cs
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
radix_sort.go
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++             // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
radix_sort.swift
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var counter = Array(repeating: 0, count: 10)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1 // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
radix_sort.js
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.ts
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.dart
/* \u7372\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n    counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n  }\n  // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n  }\n  // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  // dart \u4e2d int \u7684\u9577\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
radix_sort.rs
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
radix_sort.c
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < size; i++) {\n        // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        int d = digit(nums[i], exp);\n        // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
radix_sort.kt
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    while (exp <= m) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
radix_sort.rb
[class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
radix_sort.zig
// \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6578\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u70ba\u4ec0\u9ebc\u5f9e\u6700\u4f4e\u4f4d\u958b\u59cb\u6392\u5e8f\uff1f

\u5728\u9023\u7e8c\u7684\u6392\u5e8f\u8f2a\u6b21\u4e2d\uff0c\u5f8c\u4e00\u8f2a\u6392\u5e8f\u6703\u8986\u84cb\u524d\u4e00\u8f2a\u6392\u5e8f\u7684\u7d50\u679c\u3002\u8209\u4f8b\u4f86\u8aaa\uff0c\u5982\u679c\u7b2c\u4e00\u8f2a\u6392\u5e8f\u7d50\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f2a\u6392\u5e8f\u7d50\u679c \\(a > b\\) \uff0c\u90a3\u9ebc\u7b2c\u4e8c\u8f2a\u7684\u7d50\u679c\u5c07\u53d6\u4ee3\u7b2c\u4e00\u8f2a\u7684\u7d50\u679c\u3002\u7531\u65bc\u6578\u5b57\u7684\u9ad8\u4f4d\u512a\u5148\u9806\u5e8f\u9ad8\u65bc\u4f4e\u4f4d\uff0c\u56e0\u6b64\u61c9\u8a72\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u76f8\u8f03\u65bc\u8a08\u6578\u6392\u5e8f\uff0c\u57fa\u6578\u6392\u5e8f\u9069\u7528\u65bc\u6578\u503c\u7bc4\u570d\u8f03\u5927\u7684\u60c5\u6cc1\uff0c\u4f46\u524d\u63d0\u662f\u8cc7\u6599\u5fc5\u9808\u53ef\u4ee5\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6578\u4e0d\u80fd\u904e\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u9ede\u6578\u4e0d\u9069\u5408\u4f7f\u7528\u57fa\u6578\u6392\u5e8f\uff0c\u56e0\u70ba\u5176\u4f4d\u6578 \\(k\\) \u904e\u5927\uff0c\u53ef\u80fd\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u8a2d\u8cc7\u6599\u91cf\u70ba \\(n\\)\u3001\u8cc7\u6599\u70ba \\(d\\) \u9032\u4f4d\u5236\u3001\u6700\u5927\u4f4d\u6578\u70ba \\(k\\) \uff0c\u5247\u5c0d\u67d0\u4e00\u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u6642\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5c0d\u8f03\u5c0f\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u8207\u8a08\u6578\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6578\u6392\u5e8f\u9700\u8981\u85c9\u52a9\u9577\u5ea6\u70ba \\(n\\) \u548c \\(d\\) \u7684\u9663\u5217 res \u548c counter \u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7576\u8a08\u6578\u6392\u5e8f\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u4e5f\u7a69\u5b9a\uff1b\u7576\u8a08\u6578\u6392\u5e8f\u4e0d\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u7121\u6cd5\u4fdd\u8b49\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\u3002
"},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9078\u64c7\u6392\u5e8f","text":"

\u9078\u64c7\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7c21\u55ae\uff1a\u958b\u555f\u4e00\u500b\u8ff4\u5708\uff0c\u6bcf\u8f2a\u5f9e\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c07\u5176\u653e\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u672b\u5c3e\u3002

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u9078\u64c7\u6392\u5e8f\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 11-2 \u6240\u793a\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u5340\u9593\u70ba \\([0, n-1]\\) \u3002
  2. \u9078\u53d6\u5340\u9593 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(0\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 1 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9078\u53d6\u5340\u9593 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(1\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u985e\u63a8\u3002\u7d93\u904e \\(n - 1\\) \u8f2a\u9078\u64c7\u8207\u4ea4\u63db\u5f8c\uff0c\u9663\u5217\u524d \\(n - 1\\) \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  5. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u5716 11-2 \u00a0 \u9078\u64c7\u6392\u5e8f\u6b65\u9a5f

\u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u7528 \\(k\\) \u4f86\u8a18\u9304\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
def selection_sort(nums: list[int]):\n    \"\"\"\u9078\u64c7\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in range(n - 1):\n        # \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n
selection_sort.cpp
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        swap(nums[i], nums[k]);\n    }\n}\n
selection_sort.java
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.cs
/* \u9078\u64c7\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
selection_sort.go
/* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
selection_sort.swift
/* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swapAt(i, k)\n    }\n}\n
selection_sort.js
/* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.ts
/* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.dart
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
selection_sort.rs
/* \u9078\u64c7\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in 0..n - 1 {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swap(i, k);\n    }\n}\n
selection_sort.c
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.kt
/* \u9078\u64c7\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
selection_sort.rb
[class]{}-[func]{selection_sort}\n
selection_sort.zig
[class]{}-[func]{selectionSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5916\u8ff4\u5708\u5171 \\(n - 1\\) \u8f2a\uff0c\u7b2c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6700\u5f8c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(2\\) \uff0c\u5373\u5404\u8f2a\u5916\u8ff4\u5708\u5206\u5225\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f2a\u5167\u8ff4\u5708\uff0c\u6c42\u548c\u70ba \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5982\u5716 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u63db\u81f3\u8207\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u908a\uff0c\u5c0e\u81f4\u5169\u8005\u7684\u76f8\u5c0d\u9806\u5e8f\u767c\u751f\u6539\u8b8a\u3002

\u5716 11-3 \u00a0 \u9078\u64c7\u6392\u5e8f\u975e\u7a69\u5b9a\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

\u6392\u5e8f\u6f14\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u65bc\u5c0d\u4e00\u7d44\u8cc7\u6599\u6309\u7167\u7279\u5b9a\u9806\u5e8f\u9032\u884c\u6392\u5217\u3002\u6392\u5e8f\u6f14\u7b97\u6cd5\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\uff0c\u56e0\u70ba\u6709\u5e8f\u8cc7\u6599\u901a\u5e38\u80fd\u5920\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u8a62\u3001\u5206\u6790\u548c\u8655\u7406\u3002

\u5982\u5716 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u8cc7\u6599\u578b\u5225\u53ef\u4ee5\u662f\u6574\u6578\u3001\u6d6e\u9ede\u6578\u3001\u5b57\u5143\u6216\u5b57\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65b7\u898f\u5247\u53ef\u6839\u64da\u9700\u6c42\u8a2d\u5b9a\uff0c\u5982\u6578\u5b57\u5927\u5c0f\u3001\u5b57\u5143 ASCII \u78bc\u9806\u5e8f\u6216\u81ea\u5b9a\u7fa9\u898f\u5247\u3002

\u5716 11-1 \u00a0 \u8cc7\u6599\u578b\u5225\u548c\u5224\u65b7\u898f\u5247\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8a55\u50f9\u7dad\u5ea6","text":"

\u57f7\u884c\u6548\u7387\uff1a\u6211\u5011\u671f\u671b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5118\u91cf\u4f4e\uff0c\u4e14\u7e3d\u9ad4\u64cd\u4f5c\u6578\u91cf\u8f03\u5c11\uff08\u6642\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\uff09\u3002\u5c0d\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u57f7\u884c\u6548\u7387\u986f\u5f97\u5c24\u70ba\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u9867\u540d\u601d\u7fa9\uff0c\u539f\u5730\u6392\u5e8f\u900f\u904e\u5728\u539f\u9663\u5217\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\uff0c\u7121\u9808\u85c9\u52a9\u984d\u5916\u7684\u8f14\u52a9\u9663\u5217\uff0c\u5f9e\u800c\u7bc0\u7701\u8a18\u61b6\u9ad4\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u8cc7\u6599\u642c\u904b\u64cd\u4f5c\u8f03\u5c11\uff0c\u57f7\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

\u7a69\u5b9a\u6027\uff1a\u7a69\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u5f8c\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u76f8\u5c0d\u9806\u5e8f\u4e0d\u767c\u751f\u6539\u8b8a\u3002

\u7a69\u5b9a\u6392\u5e8f\u662f\u591a\u7d1a\u6392\u5e8f\u5834\u666f\u7684\u5fc5\u8981\u689d\u4ef6\u3002\u5047\u8a2d\u6211\u5011\u6709\u4e00\u500b\u5132\u5b58\u5b78\u751f\u8cc7\u8a0a\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u5225\u662f\u59d3\u540d\u548c\u5e74\u9f61\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u975e\u7a69\u5b9a\u6392\u5e8f\u53ef\u80fd\u5c0e\u81f4\u8f38\u5165\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u55aa\u5931\uff1a

# \u8f38\u5165\u8cc7\u6599\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8a2d\u4f7f\u7528\u975e\u7a69\u5b9a\u6392\u5e8f\u6f14\u7b97\u6cd5\u6309\u5e74\u9f61\u6392\u5e8f\u4e32\u5217\uff0c\n# \u7d50\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5c0d\u4f4d\u7f6e\u6539\u8b8a\uff0c\n# \u8f38\u5165\u8cc7\u6599\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8cea\u4e1f\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

\u81ea\u9069\u61c9\u6027\uff1a\u81ea\u9069\u61c9\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u53d7\u8f38\u5165\u8cc7\u6599\u7684\u5f71\u97ff\uff0c\u5373\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u3001\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4e26\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

\u81ea\u9069\u61c9\u6027\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u4f86\u8a55\u4f30\u3002\u5982\u679c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u5dee\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u8aaa\u660e\u6392\u5e8f\u6f14\u7b97\u6cd5\u5728\u67d0\u4e9b\u8cc7\u6599\u4e0b\u6548\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u8996\u70ba\u8ca0\u9762\u5c6c\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u5247\u88ab\u8996\u70ba\u6b63\u9762\u5c6c\u6027\u3002

\u662f\u5426\u57fa\u65bc\u6bd4\u8f03\uff1a\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u4f9d\u8cf4\u6bd4\u8f03\u904b\u7b97\u5b50\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u4f86\u5224\u65b7\u5143\u7d20\u7684\u76f8\u5c0d\u9806\u5e8f\uff0c\u5f9e\u800c\u6392\u5e8f\u6574\u500b\u9663\u5217\uff0c\u7406\u8ad6\u6700\u512a\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f03\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f03\u904b\u7b97\u5b50\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5c0d\u8f03\u5dee\u3002

"},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

\u57f7\u884c\u5feb\u3001\u539f\u5730\u3001\u7a69\u5b9a\u3001\u6b63\u5411\u81ea\u9069\u61c9\u3001\u901a\u7528\u6027\u597d\u3002\u986f\u7136\uff0c\u8fc4\u4eca\u70ba\u6b62\u5c1a\u672a\u767c\u73fe\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9078\u64c7\u6392\u5e8f\u6f14\u7b97\u6cd5\u6642\uff0c\u9700\u8981\u6839\u64da\u5177\u9ad4\u7684\u8cc7\u6599\u7279\u9ede\u548c\u554f\u984c\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u5171\u540c\u5b78\u7fd2\u5404\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4e26\u57fa\u65bc\u4e0a\u8ff0\u8a55\u50f9\u7dad\u5ea6\u5c0d\u5404\u500b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u512a\u7f3a\u9ede\u9032\u884c\u5206\u6790\u3002

"},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u6ce1\u6cab\u6392\u5e8f\u900f\u904e\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u900f\u904e\u65b0\u589e\u4e00\u500b\u6a19\u8a8c\u4f4d\u4f86\u5be6\u73fe\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(n)\\) \u3002
  • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f2a\u5c07\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u6b63\u78ba\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u96d6\u7136\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u4f46\u7531\u65bc\u55ae\u5143\u64cd\u4f5c\u76f8\u5c0d\u8f03\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u8cc7\u6599\u91cf\u7684\u6392\u5e8f\u4efb\u52d9\u4e2d\u975e\u5e38\u53d7\u6b61\u8fce\u3002
  • \u5feb\u901f\u6392\u5e8f\u57fa\u65bc\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5283\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9078\u53d6\u5230\u6700\u5dee\u7684\u57fa\u6e96\u6578\uff0c\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6578\u57fa\u6e96\u6578\u6216\u96a8\u6a5f\u57fa\u6e96\u6578\u53ef\u4ee5\u964d\u4f4e\u9019\u7a2e\u52a3\u5316\u7684\u6a5f\u7387\u3002\u5c3e\u905e\u8ff4\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u6e1b\u5c11\u905e\u8ff4\u6df1\u5ea6\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(\\log n)\\) \u3002
  • \u5408\u4f75\u6392\u5e8f\u5305\u62ec\u5283\u5206\u548c\u5408\u4e26\u5169\u500b\u968e\u6bb5\uff0c\u5178\u578b\u5730\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5408\u4f75\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u9663\u5217\u9700\u8981\u5efa\u7acb\u8f14\u52a9\u9663\u5217\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u93c8\u7d50\u4e32\u5217\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002
  • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u500b\u6b65\u9a5f\uff1a\u8cc7\u6599\u5206\u6876\u3001\u6876\u5167\u6392\u5e8f\u548c\u5408\u4e26\u7d50\u679c\u3002\u5b83\u540c\u6a23\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9069\u7528\u65bc\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u3002\u6876\u6392\u5e8f\u7684\u95dc\u9375\u5728\u65bc\u5c0d\u8cc7\u6599\u9032\u884c\u5e73\u5747\u5206\u914d\u3002
  • \u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5b83\u900f\u904e\u7d71\u8a08\u8cc7\u6599\u51fa\u73fe\u7684\u6b21\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u6709\u9650\u7684\u60c5\u6cc1\uff0c\u4e26\u4e14\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8f49\u63db\u70ba\u6b63\u6574\u6578\u3002
  • \u57fa\u6578\u6392\u5e8f\u900f\u904e\u9010\u4f4d\u6392\u5e8f\u4f86\u5be6\u73fe\u8cc7\u6599\u6392\u5e8f\uff0c\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u6578\u5b57\u3002
  • \u7e3d\u7684\u4f86\u8aaa\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a69\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9069\u61c9\u6027\u7b49\u512a\u9ede\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u6c92\u6709\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u80fd\u5920\u540c\u6642\u6eff\u8db3\u6240\u6709\u9019\u4e9b\u689d\u4ef6\u3002\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u9700\u8981\u6839\u64da\u8cc7\u6599\u7684\u7279\u6027\u4f86\u9078\u64c7\u5408\u9069\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002
  • \u5716 11-19 \u5c0d\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a69\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9069\u61c9\u6027\u7b49\u3002

\u5716 11-19 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5\u5c0d\u6bd4

"},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6392\u5e8f\u6f14\u7b97\u6cd5\u7a69\u5b9a\u6027\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

\u5728\u73fe\u5be6\u4e2d\uff0c\u6211\u5011\u6709\u53ef\u80fd\u57fa\u65bc\u7269\u4ef6\u7684\u67d0\u500b\u5c6c\u6027\u9032\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b78\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u5169\u500b\u5c6c\u6027\uff0c\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u4e00\u500b\u591a\u7d1a\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5c0d\u8eab\u9ad8\u9032\u884c\u6392\u5e8f\u3002\u7531\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e0d\u7a69\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

\u53ef\u4ee5\u767c\u73fe\uff0c\u5b78\u751f D \u548c C \u7684\u4f4d\u7f6e\u767c\u751f\u4e86\u4ea4\u63db\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u58de\u4e86\uff0c\u800c\u9019\u662f\u6211\u5011\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

Q\uff1a\u54e8\u5175\u5283\u5206\u4e2d\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u8207\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u7684\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\u55ce\uff1f

\u4e0d\u884c\uff0c\u7576\u6211\u5011\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u70ba\u57fa\u6e96\u6578\u6642\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u518d\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002\u9019\u500b\u7d50\u8ad6\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u6211\u5011\u4f86\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

\u54e8\u5175\u5283\u5206 partition() \u7684\u6700\u5f8c\u4e00\u6b65\u662f\u4ea4\u63db nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u57fa\u6e96\u6578\u5de6\u908a\u7684\u5143\u7d20\u90fd <= \u57fa\u6e96\u6578\uff0c\u9019\u5c31\u8981\u6c42\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u524d nums[left] >= nums[i] \u5fc5\u9808\u6210\u7acb\u3002\u5047\u8a2d\u6211\u5011\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\uff0c\u90a3\u9ebc\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5247\u6703\u5728 i == j \u6642\u8df3\u51fa\u8ff4\u5708\uff0c\u6b64\u6642\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6b64\u6642\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u64cd\u4f5c\u6703\u628a\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\uff0c\u5c0e\u81f4\u54e8\u5175\u5283\u5206\u5931\u6557\u3002

\u8209\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u9663\u5217 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u5f9e\u5de6\u5411\u53f3\u67e5\u8a62\u201d\uff0c\u54e8\u5175\u5283\u5206\u5f8c\u9663\u5217\u70ba [1, 0, 0, 0, 0] \uff0c\u9019\u500b\u7d50\u679c\u662f\u4e0d\u6b63\u78ba\u7684\u3002

\u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u5011\u9078\u64c7 nums[right] \u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u6b63\u597d\u53cd\u904e\u4f86\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002

Q\uff1a\u95dc\u65bc\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u70ba\u4ec0\u9ebc\u9078\u77ed\u7684\u9663\u5217\u80fd\u4fdd\u8b49\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff1f

\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f\u7576\u524d\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u65b9\u6cd5\u7684\u6578\u91cf\u3002\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u6211\u5011\u5c07\u539f\u9663\u5217\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002\u5728\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u5f8c\uff0c\u5411\u4e0b\u905e\u8ff4\u7684\u5b50\u9663\u5217\u9577\u5ea6\u6700\u5927\u70ba\u539f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8a2d\u6700\u5dee\u60c5\u6cc1\uff0c\u4e00\u76f4\u70ba\u4e00\u534a\u9577\u5ea6\uff0c\u90a3\u9ebc\u6700\u7d42\u7684\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

\u56de\u9867\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u5011\u6709\u53ef\u80fd\u6703\u9023\u7e8c\u5730\u905e\u8ff4\u9577\u5ea6\u8f03\u5927\u7684\u9663\u5217\uff0c\u6700\u5dee\u60c5\u6cc1\u4e0b\u70ba \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u51fa\u73fe\u3002

Q\uff1a\u7576\u9663\u5217\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u6642\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n^2)\\) \u55ce\uff1f\u8a72\u5982\u4f55\u8655\u7406\u9019\u7a2e\u9000\u5316\u60c5\u6cc1\uff1f

\u662f\u7684\u3002\u5c0d\u65bc\u9019\u7a2e\u60c5\u6cc1\uff0c\u53ef\u4ee5\u8003\u616e\u900f\u904e\u54e8\u5175\u5283\u5206\u5c07\u9663\u5217\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\uff1a\u5c0f\u65bc\u3001\u7b49\u65bc\u3001\u5927\u65bc\u57fa\u6e96\u6578\u3002\u50c5\u5411\u4e0b\u905e\u8ff4\u5c0f\u65bc\u548c\u5927\u65bc\u7684\u5169\u90e8\u5206\u3002\u5728\u8a72\u65b9\u6cd5\u4e0b\uff0c\u8f38\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u9663\u5217\uff0c\u50c5\u4e00\u8f2a\u54e8\u5175\u5283\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u4ec0\u9ebc\u662f \\(O(n^2)\\) \uff1f

\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u500b\u6876\u4e2d\u3002\u5982\u679c\u6211\u5011\u63a1\u7528\u4e00\u500b \\(O(n^2)\\) \u6f14\u7b97\u6cd5\u4f86\u6392\u5e8f\u9019\u4e9b\u5143\u7d20\uff0c\u5247\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u5806\u758a\u8207\u4f47\u5217","text":"

Abstract

\u5806\u758a\u5982\u540c\u758a\u8c93\u8c93\uff0c\u800c\u4f47\u5217\u5c31\u50cf\u8c93\u8c93\u6392\u968a\u3002

\u5169\u8005\u5206\u5225\u4ee3\u8868\u5148\u5165\u5f8c\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u908f\u8f2f\u95dc\u4fc2\u3002

"},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 5.1 \u00a0 \u5806\u758a
  • 5.2 \u00a0 \u4f47\u5217
  • 5.3 \u00a0 \u96d9\u5411\u4f47\u5217
  • 5.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u96d9\u5411\u4f47\u5217","text":"

\u5728\u4f47\u5217\u4e2d\uff0c\u6211\u5011\u50c5\u80fd\u522a\u9664\u982d\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u3002\u5982\u5716 5-7 \u6240\u793a\uff0c\u96d9\u5411\u4f47\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u9748\u6d3b\u6027\uff0c\u5141\u8a31\u5728\u982d\u90e8\u548c\u5c3e\u90e8\u57f7\u884c\u5143\u7d20\u7684\u65b0\u589e\u6216\u522a\u9664\u64cd\u4f5c\u3002

\u5716 5-7 \u00a0 \u96d9\u5411\u4f47\u5217\u7684\u64cd\u4f5c

"},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u96d9\u5411\u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u96d9\u5411\u4f47\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u7a31\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

\u8868 5-3 \u00a0 \u96d9\u5411\u4f47\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push_first() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u9996 \\(O(1)\\) push_last() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop_first() \u522a\u9664\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u522a\u9664\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\)

\u540c\u6a23\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u5df2\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
from collections import deque\n\n# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeque.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deque[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deque.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deque.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deque) == 0\n
deque.cpp
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint front = deque.front(); // \u4f47\u5217\u9996\u5143\u7d20\nint back = deque.back();   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.pop_front();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.pop_back();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = deque.empty();\n
deque.java
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.pollFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.pollLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c07\u93c8\u7d50\u4e32\u5217 LinkedList \u770b\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.AddLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.AddFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.RemoveFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.RemoveLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.PushBack(2)      // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.PushFront(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfront := deque.Front() // \u4f47\u5217\u9996\u5143\u7d20\nrear := deque.Back()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.Remove(front)    // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.Remove(rear)     // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := deque.Len() == 0\n
deque.swift
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.append(2) // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.insert(1, at: 0)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nlet peekFirst = deque.first! // \u4f47\u5217\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u4f7f\u7528 Array \u6a21\u64ec\u6642 popFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet popFirst = deque.removeFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nlet popLast = deque.removeLast() // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.js
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty = size === 0;\n
deque.ts
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u7fa9\u70ba\u96d9\u5411\u4f47\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.addLast(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.addFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.first; // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.removeFirst(); // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.removeLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u4f47\u5217\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop_front) = deque.pop_front() { // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
deque.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96d9\u5411\u4f47\u5217\n
deque.kt
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2)  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u4f47\u5217\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nval popFirst = deque.pollFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nval popLast = deque.pollLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = deque.isEmpty()\n
deque.rb
# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\n# Ruby \u6c92\u6709\u5167\u76f4\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u968a\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#unshift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8a2a\u554f\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u5217\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0c Array#shift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize = deque.length\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = size.zero?\n
deque.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u96d9\u5411\u4f47\u5217\u5be6\u73fe *","text":"

\u96d9\u5411\u4f47\u5217\u7684\u5be6\u73fe\u8207\u4f47\u5217\u985e\u4f3c\uff0c\u53ef\u4ee5\u9078\u64c7\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u4f5c\u70ba\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

"},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u56de\u9867\u4e0a\u4e00\u7bc0\u5167\u5bb9\uff0c\u6211\u5011\u4f7f\u7528\u666e\u901a\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u4f47\u5217\uff0c\u56e0\u70ba\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u522a\u9664\u982d\u7bc0\u9ede\uff08\u5c0d\u61c9\u51fa\u5217\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e\u65b0\u7bc0\u9ede\uff08\u5c0d\u61c9\u5165\u5217\u64cd\u4f5c\uff09\u3002

\u5c0d\u65bc\u96d9\u5411\u4f47\u5217\u800c\u8a00\uff0c\u982d\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u57f7\u884c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96d9\u5411\u4f47\u5217\u9700\u8981\u5be6\u73fe\u53e6\u4e00\u500b\u5c0d\u7a31\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u201c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u201d\u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

\u5982\u5716 5-8 \u6240\u793a\uff0c\u6211\u5011\u5c07\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u548c\u5c3e\u7bc0\u9ede\u8996\u70ba\u96d9\u5411\u4f47\u5217\u7684\u4f47\u5217\u9996\u548c\u4f47\u5217\u5c3e\uff0c\u540c\u6642\u5be6\u73fe\u5728\u5169\u7aef\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u7684\u529f\u80fd\u3002

LinkedListDequepush_last()push_first()pop_last()pop_first()

\u5716 5-8 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0  # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u5217\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        elif is_front:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size += 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u5217\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            # \u522a\u9664\u982d\u7bc0\u9ede\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            # \u522a\u9664\u5c3e\u7bc0\u9ede\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size -= 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nstruct DoublyListNode {\n    int val;              // \u7bc0\u9ede\u503c\n    DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize = 0;              // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    int val; // \u7bc0\u9ede\u503c\n    ListNode next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    ListNode prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(int val) {\n    public int val = val;       // \u7bc0\u9ede\u503c\n    public ListNode? next = null; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u982d\u7bc0\u9ede front, \u5c3e\u7bc0\u9ede rear\n    int queSize = 0;      // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede                           \n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u96d9\u7aef\u4f47\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217 */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede rear\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if isFront {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size += 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        let val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear!.val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size -= 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val; // \u7bc0\u9ede\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    #front; // \u982d\u7bc0\u9ede front\n    #rear; // \u5c3e\u7bc0\u9ede rear\n    #queSize; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next: ListNode; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val: number; // \u7bc0\u9ede\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u982d\u7bc0\u9ede front\n    private rear: ListNode; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  ListNode? prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u5c0d\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u982d\u7bc0\u9ede _front\n  late ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u9577\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u5217\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u5217\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n      val = _front!.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      // \u522a\u9664\u982d\u7bc0\u9ede\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n      val = _rear!.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      // \u522a\u9664\u5c3e\u7bc0\u9ede\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\npub struct ListNode<T> {\n    pub val: T,                                 // \u7bc0\u9ede\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u982d\u7bc0\u9ede\n                }\n            }\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u982d\u7bc0\u9ede\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct DoublyListNode {\n    int val;                     // \u7bc0\u9ede\u503c\n    struct DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n    struct DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\n} DoublyListNode;\n\n/* \u5efa\u69cb\u5b50 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;                  // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n} LinkedListDeque;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e deque \u7d50\u69cb\u9ad4\n    free(deque);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    deque->queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(var _val: Int) {\n    // \u7bc0\u9ede\u503c\n    var next: ListNode? = null // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? = null // \u5c3e\u7bc0\u9ede rear\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++ // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize-- // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return _val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :prev # \u524d\u8ec0\u7bc0\u9ede\u5f15\u7528\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass LinkedListDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0     # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c \u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    elsif is_front\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size += 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u5217\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      # \u522a\u9664\u982d\u7bc0\u9ede\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else\n      val = @rear.val # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      # \u522a\u9664\u5c3e\u7bc0\u9ede\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size -= 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    val\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u7bc0\u9ede\u503c\n        next: ?*Self = null,    // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n        prev: ?*Self = null,    // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u982d\u7bc0\u9ede front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                             // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u5217\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n            } else {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        } \n\n        // \u4f47\u5217\u9996\u5165\u5217\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u4f47\u5217\u5c3e\u5165\u5217\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u5217\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            var val: T = undefined;\n            // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n                // \u522a\u9664\u982d\u7bc0\u9ede\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n                // \u522a\u9664\u5c3e\u7bc0\u9ede\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n            return val;\n        } \n\n        // \u4f47\u5217\u9996\u51fa\u5217\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u4f47\u5217\u5c3e\u51fa\u5217\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u5982\u5716 5-9 \u6240\u793a\uff0c\u8207\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u985e\u4f3c\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u4f7f\u7528\u74b0\u5f62\u9663\u5217\u4f86\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u3002

ArrayDequepush_last()push_first()pop_last()pop_first()

\u5716 5-9 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u5728\u4f47\u5217\u7684\u5be6\u73fe\u57fa\u790e\u4e0a\uff0c\u50c5\u9700\u589e\u52a0\u201c\u4f47\u5217\u9996\u5165\u5217\u201d\u548c\u201c\u4f47\u5217\u5c3e\u51fa\u5217\u201d\u7684\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15\"\"\"\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        num = self.peek_first()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;      // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int Index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i: number): number {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n  int index(int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe _front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: usize,    // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: usize, // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u5efa\u69cb\u5b50 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u9663\u5217\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c07 num \u65b0\u589e\u5230\u4f47\u5217\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u5efa\u69cb\u5b50 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass ArrayDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    num = peek_first\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u4f47\u5217\u5c3e\u51fa\u5217 ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 ###\n  def index(i)\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u96d9\u5411\u4f47\u5217\u61c9\u7528","text":"

\u96d9\u5411\u4f47\u5217\u517c\u5177\u5806\u758a\u8207\u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5be6\u73fe\u9019\u5169\u8005\u7684\u6240\u6709\u61c9\u7528\u5834\u666f\uff0c\u540c\u6642\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

\u6211\u5011\u77e5\u9053\uff0c\u8edf\u9ad4\u7684\u201c\u64a4\u92b7\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u5806\u758a\u4f86\u5be6\u73fe\uff1a\u7cfb\u7d71\u5c07\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u5806\u758a\u4e2d\uff0c\u7136\u5f8c\u900f\u904e pop \u5be6\u73fe\u64a4\u92b7\u3002\u7136\u800c\uff0c\u8003\u616e\u5230\u7cfb\u7d71\u8cc7\u6e90\u7684\u9650\u5236\uff0c\u8edf\u9ad4\u901a\u5e38\u6703\u9650\u5236\u64a4\u92b7\u7684\u6b65\u6578\uff08\u4f8b\u5982\u50c5\u5141\u8a31\u5132\u5b58 \\(50\\) \u6b65\uff09\u3002\u7576\u5806\u758a\u7684\u9577\u5ea6\u8d85\u904e \\(50\\) \u6642\uff0c\u8edf\u9ad4\u9700\u8981\u5728\u5806\u758a\u5e95\uff08\u4f47\u5217\u9996\uff09\u57f7\u884c\u522a\u9664\u64cd\u4f5c\u3002\u4f46\u5806\u758a\u7121\u6cd5\u5be6\u73fe\u8a72\u529f\u80fd\uff0c\u6b64\u6642\u5c31\u9700\u8981\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f86\u66ff\u4ee3\u5806\u758a\u3002\u8acb\u6ce8\u610f\uff0c\u201c\u64a4\u92b7\u201d\u7684\u6838\u5fc3\u908f\u8f2f\u4ecd\u7136\u9075\u5faa\u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u539f\u5247\uff0c\u53ea\u662f\u96d9\u5411\u4f47\u5217\u80fd\u5920\u66f4\u52a0\u9748\u6d3b\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u908f\u8f2f\u3002

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u4f47\u5217","text":"

\u4f47\u5217\uff08queue\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u898f\u5247\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u9867\u540d\u601d\u7fa9\uff0c\u4f47\u5217\u6a21\u64ec\u4e86\u6392\u968a\u73fe\u8c61\uff0c\u5373\u65b0\u4f86\u7684\u4eba\u4e0d\u65b7\u52a0\u5165\u4f47\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u65bc\u4f47\u5217\u982d\u90e8\u7684\u4eba\u9010\u500b\u96e2\u958b\u3002

\u5982\u5716 5-4 \u6240\u793a\uff0c\u6211\u5011\u5c07\u4f47\u5217\u982d\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u9996\u201d\uff0c\u5c3e\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u5c07\u628a\u5143\u7d20\u52a0\u5165\u5217\u5c3e\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u5165\u5217\u201d\uff0c\u522a\u9664\u4f47\u5217\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u51fa\u5217\u201d\u3002

\u5716 5-4 \u00a0 \u4f47\u5217\u7684\u5148\u5165\u5148\u51fa\u898f\u5247

"},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u4f47\u5217\u7684\u5e38\u898b\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u65b9\u6cd5\u540d\u7a31\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002\u6211\u5011\u5728\u6b64\u63a1\u7528\u8207\u5806\u758a\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

\u8868 5-2 \u00a0 \u4f47\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5217\uff0c\u5373\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop() \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 \\(O(1)\\) peek() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\)

\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u73fe\u6210\u7684\u4f47\u5217\u985e\u5225\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
from collections import deque\n\n# \u521d\u59cb\u5316\u4f47\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u5011\u4e00\u822c\u5c07\u96d9\u5411\u4f47\u5217\u985e\u5225 deque \u7576\u4f5c\u4f47\u5217\u4f7f\u7528\n# \u96d6\u7136 queue.Queue() \u662f\u7d14\u6b63\u7684\u4f47\u5217\u985e\u5225\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u85a6\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u5217\npop: int = que.popleft()\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(que)\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(que) == 0\n
queue.cpp
/* \u521d\u59cb\u5316\u4f47\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u5217 */\nqueue.pop();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = queue.empty();\n
queue.java
/* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.poll();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.Dequeue();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u4f47\u5217\u4f86\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u5217 */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := queue.Len() == 0\n
queue.swift
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u7531\u65bc\u662f\u9663\u5217\uff0c\u56e0\u6b64 removeFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet pool = queue.removeFirst()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.js
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
queue.ts
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
queue.dart
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u4f47\u5217\u985e\u5225 Qeque \u662f\u96d9\u5411\u4f47\u5217\uff0c\u4e5f\u53ef\u4f5c\u70ba\u4f47\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.removeFirst();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f5c\u70ba\u666e\u901a\u4f47\u5217\u4f86\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
queue.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u4f47\u5217\n
queue.kt
/* \u521d\u59cb\u5316\u4f47\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u5217 */\nval pop = queue.poll()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = queue.isEmpty()\n
queue.rb
# \u521d\u59cb\u5316\u4f47\u5217\n# Ruby \u5167\u5efa\u7684\u4f47\u5217\uff08Thread::Queue) \u6c92\u6709 peek \u548c\u8d70\u8a2a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u5217\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8a2a\u554f\u4f47\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u5217\n# \u6e05\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#shift \u65b9\u6cd5\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop = queue.shift\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize = queue.length\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = queue.empty?\n
queue.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u4f47\u5217\u5be6\u73fe","text":"

\u70ba\u4e86\u5be6\u73fe\u4f47\u5217\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u65b0\u589e\u5143\u7d20\uff0c\u4e26\u5728\u53e6\u4e00\u7aef\u522a\u9664\u5143\u7d20\uff0c\u93c8\u7d50\u4e32\u5217\u548c\u9663\u5217\u90fd\u7b26\u5408\u8981\u6c42\u3002

"},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u5982\u5716 5-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u201c\u982d\u7bc0\u9ede\u201d\u548c\u201c\u5c3e\u7bc0\u9ede\u201d\u5206\u5225\u8996\u70ba\u201c\u4f47\u5217\u9996\u201d\u548c\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u898f\u5b9a\u4f47\u5217\u5c3e\u50c5\u53ef\u65b0\u589e\u7bc0\u9ede\uff0c\u4f47\u5217\u9996\u50c5\u53ef\u522a\u9664\u7bc0\u9ede\u3002

LinkedListQueuepush()pop()

\u5716 5-5 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        node = ListNode(num)\n        # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num = self.peek()\n        # \u522a\u9664\u982d\u7bc0\u9ede\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u4f47\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5217 */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5217 */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u982d\u7bc0\u9ede\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    #front; // \u982d\u7bc0\u9ede #front\n    #rear; // \u5c3e\u7bc0\u9ede #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u982d\u7bc0\u9ede front\n    private rear: ListNode | null; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u982d\u7bc0\u9ede _front\n  ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    final int _num = peek();\n    // \u522a\u9664\u982d\u7bc0\u9ede\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u4f47\u5217\u70ba\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u4f47\u5217\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e queue \u7d50\u69cb\u9ad4\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u7bc0\u9ede\u8655\u65b0\u589e node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue(\n    // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        val node = ListNode(num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u982d\u73fe\u7684\u4f47\u5217 ###\nclass LinkedListQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\uff0c\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u4ee4\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u522a\u9664\u982d\u7bc0\u9ede\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u70ba Array \u4e26\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u982d\u7bc0\u9ede front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                            // \u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u5728\u9663\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u9019\u6703\u5c0e\u81f4\u51fa\u5217\u64cd\u4f5c\u6548\u7387\u8f03\u4f4e\u3002\u7136\u800c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u4f86\u907f\u514d\u9019\u500b\u554f\u984c\u3002

\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 front \u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u4e26\u7dad\u8b77\u4e00\u500b\u8b8a\u6578 size \u7528\u65bc\u8a18\u9304\u4f47\u5217\u9577\u5ea6\u3002\u5b9a\u7fa9 rear = front + size \uff0c\u9019\u500b\u516c\u5f0f\u8a08\u7b97\u51fa\u7684 rear \u6307\u5411\u4f47\u5217\u5c3e\u5143\u7d20\u4e4b\u5f8c\u7684\u4e0b\u4e00\u500b\u4f4d\u7f6e\u3002

\u57fa\u65bc\u6b64\u8a2d\u8a08\uff0c\u9663\u5217\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u5340\u9593\u70ba [front, rear - 1]\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u6cd5\u5982\u5716 5-6 \u6240\u793a\u3002

  • \u5165\u5217\u64cd\u4f5c\uff1a\u5c07\u8f38\u5165\u5143\u7d20\u8ce6\u503c\u7d66 rear \u7d22\u5f15\u8655\uff0c\u4e26\u5c07 size \u589e\u52a0 1 \u3002
  • \u51fa\u5217\u64cd\u4f5c\uff1a\u53ea\u9700\u5c07 front \u589e\u52a0 1 \uff0c\u4e26\u5c07 size \u6e1b\u5c11 1 \u3002

\u53ef\u4ee5\u770b\u5230\uff0c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u90fd\u53ea\u9700\u9032\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002

ArrayQueuepush()pop()

\u5716 5-6 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u4e00\u500b\u554f\u984c\uff1a\u5728\u4e0d\u65b7\u9032\u884c\u5165\u5217\u548c\u51fa\u5217\u7684\u904e\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52d5\uff0c\u7576\u5b83\u5011\u5230\u9054\u9663\u5217\u5c3e\u90e8\u6642\u5c31\u7121\u6cd5\u7e7c\u7e8c\u79fb\u52d5\u4e86\u3002\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u8996\u70ba\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u74b0\u5f62\u9663\u5217\u201d\u3002

\u5c0d\u65bc\u74b0\u5f62\u9663\u5217\uff0c\u6211\u5011\u9700\u8981\u8b93 front \u6216 rear \u5728\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u76f4\u63a5\u56de\u5230\u9663\u5217\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002\u9019\u7a2e\u9031\u671f\u6027\u898f\u5f8b\u53ef\u4ee5\u900f\u904e\u201c\u53d6\u9918\u64cd\u4f5c\u201d\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n        self._front: int = 0  # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        self._size: int = 0  # \u4f47\u5217\u9577\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u4f47\u5217\u5df2\u6eff\")\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num: int = self.peek()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u4f47\u5217\u9577\u5ea6\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c07\u9663\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u5217 */\nfunc (q *arrayQueue) push(num int) {\n    // \u7576 rear == queCapacity \u8868\u793a\u4f47\u5217\u5df2\u6eff\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u5217 */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u4f47\u5217\u9577\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front = 0; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u4f47\u5217\u9577\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    int _num = peek();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: i32,        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: i32,     // \u4f47\u5217\u9577\u5ea6\n    que_capacity: i32, // \u4f47\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u5217 */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u5efa\u69cb\u5b50 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u9663\u5217\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u5217 */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u5217 */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 ###\nclass ArrayQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    @front = 0 # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    @size = 0 # \u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    raise IndexError, '\u4f47\u5217\u5df2\u6eff' if size == capacity\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear = (@front + size) % capacity\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217     \n        cap: usize = 0,                                 // \u4f47\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u9663\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u4f47\u5217\u5df2\u6eff\\n\", .{});\n                return;\n            }\n            // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n            // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u4ee5\u4e0a\u5be6\u73fe\u7684\u4f47\u5217\u4ecd\u7136\u5177\u6709\u4fb7\u9650\u6027\uff1a\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002\u7136\u800c\uff0c\u9019\u500b\u554f\u984c\u4e0d\u96e3\u89e3\u6c7a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u66ff\u63db\u70ba\u52d5\u614b\u9663\u5217\uff0c\u5f9e\u800c\u5f15\u5165\u64f4\u5bb9\u6a5f\u5236\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u5617\u8a66\u81ea\u884c\u5be6\u73fe\u3002

\u5169\u7a2e\u5be6\u73fe\u7684\u5c0d\u6bd4\u7d50\u8ad6\u8207\u5806\u758a\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

"},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u4f47\u5217\u5178\u578b\u61c9\u7528","text":"
  • \u6dd8\u5bf6\u8a02\u55ae\u3002\u8cfc\u7269\u8005\u4e0b\u55ae\u5f8c\uff0c\u8a02\u55ae\u5c07\u52a0\u5165\u5217\u5217\u4e2d\uff0c\u7cfb\u7d71\u96a8\u5f8c\u6703\u6839\u64da\u9806\u5e8f\u8655\u7406\u4f47\u5217\u4e2d\u7684\u8a02\u55ae\u3002\u5728\u96d9\u5341\u4e00\u671f\u9593\uff0c\u77ed\u6642\u9593\u5167\u6703\u7522\u751f\u6d77\u91cf\u8a02\u55ae\uff0c\u9ad8\u4f75\u767c\u6210\u70ba\u5de5\u7a0b\u5e2b\u5011\u9700\u8981\u91cd\u9ede\u653b\u514b\u7684\u554f\u984c\u3002
  • \u5404\u985e\u5f85\u8fa6\u4e8b\u9805\u3002\u4efb\u4f55\u9700\u8981\u5be6\u73fe\u201c\u5148\u4f86\u5f8c\u5230\u201d\u529f\u80fd\u7684\u5834\u666f\uff0c\u4f8b\u5982\u5370\u8868\u6a5f\u7684\u4efb\u52d9\u4f47\u5217\u3001\u9910\u5ef3\u7684\u51fa\u9910\u4f47\u5217\u7b49\uff0c\u4f47\u5217\u5728\u9019\u4e9b\u5834\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7dad\u8b77\u8655\u7406\u9806\u5e8f\u3002
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u5806\u758a","text":"

\u5806\u758a\uff08stack\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u908f\u8f2f\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002

\u6211\u5011\u53ef\u4ee5\u5c07\u5806\u758a\u985e\u6bd4\u70ba\u684c\u9762\u4e0a\u7684\u4e00\u758a\u76e4\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76e4\u5b50\uff0c\u5247\u9700\u8981\u5148\u5c07\u4e0a\u9762\u7684\u76e4\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u5011\u5c07\u76e4\u5b50\u66ff\u63db\u70ba\u5404\u7a2e\u578b\u5225\u7684\u5143\u7d20\uff08\u5982\u6574\u6578\u3001\u5b57\u5143\u3001\u7269\u4ef6\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u5806\u758a\u9019\u7a2e\u8cc7\u6599\u7d50\u69cb\u3002

\u5982\u5716 5-1 \u6240\u793a\uff0c\u6211\u5011\u628a\u5806\u7a4d\u758a\u5143\u7d20\u7684\u9802\u90e8\u7a31\u70ba\u201c\u5806\u758a\u9802\u201d\uff0c\u5e95\u90e8\u7a31\u70ba\u201c\u5806\u758a\u5e95\u201d\u3002\u5c07\u628a\u5143\u7d20\u65b0\u589e\u5230\u5806\u758a\u9802\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u5806\u758a\u201d\uff0c\u522a\u9664\u5806\u758a\u9802\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u5806\u758a\u201d\u3002

\u5716 5-1 \u00a0 \u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u898f\u5247

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u5011\u4ee5\u5e38\u898b\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u70ba\u4f8b\u3002

\u8868 5-1 \u00a0 \u5806\u758a\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5 \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u758a\uff08\u65b0\u589e\u81f3\u5806\u758a\u9802\uff09 \\(O(1)\\) pop() \u5806\u758a\u9802\u5143\u7d20\u51fa\u5806\u758a \\(O(1)\\) peek() \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 \\(O(1)\\)

\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8a9e\u8a00\u53ef\u80fd\u6c92\u6709\u5c08\u9580\u63d0\u4f9b\u5806\u758a\u985e\u5225\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u5c07\u8a72\u8a9e\u8a00\u7684\u201c\u9663\u5217\u201d\u6216\u201c\u93c8\u7d50\u4e32\u5217\u201d\u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\uff0c\u4e26\u5728\u7a0b\u5f0f\u908f\u8f2f\u4e0a\u5ffd\u7565\u8207\u5806\u758a\u7121\u95dc\u7684\u64cd\u4f5c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
# \u521d\u59cb\u5316\u5806\u758a\n# Python \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a list \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop: int = stack.pop()\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* \u521d\u59cb\u5316\u5806\u758a */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nstack.pop(); // \u7121\u8fd4\u56de\u503c\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool empty = stack.empty();\n
stack.java
/* \u521d\u59cb\u5316\u5806\u758a */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* \u521d\u59cb\u5316\u5806\u758a */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.Pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* \u521d\u59cb\u5316\u5806\u758a */\n// \u5728 Go \u4e2d\uff0c\u63a8\u85a6\u5c07 Slice \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nisEmpty := len(stack) == 0\n
stack.swift
/* \u521d\u59cb\u5316\u5806\u758a */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.removeLast()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.js
/* \u521d\u59cb\u5316\u5806\u758a */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.ts
/* \u521d\u59cb\u5316\u5806\u758a */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.dart
/* \u521d\u59cb\u5316\u5806\u758a */\n// Dart \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a List \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.removeLast();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* \u521d\u59cb\u5316\u5806\u758a */\n// \u628a Vec \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.pop().unwrap();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet is_empty = stack.is_empty();\n
stack.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u5806\u758a\n
stack.kt
/* \u521d\u59cb\u5316\u5806\u758a */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nval pop = stack.pop()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nval isEmpty = stack.isEmpty()\n
stack.rb
# \u521d\u59cb\u5316\u5806\u758a\n# Ruby \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop = stack.pop\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize = stack.length\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty = stack.empty?\n
stack.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u5806\u758a\u7684\u5be6\u73fe","text":"

\u70ba\u4e86\u6df1\u5165\u77ad\u89e3\u5806\u758a\u7684\u57f7\u884c\u6a5f\u5236\uff0c\u6211\u5011\u4f86\u5617\u8a66\u81ea\u5df1\u5be6\u73fe\u4e00\u500b\u5806\u758a\u985e\u5225\u3002

\u5806\u758a\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u7684\u539f\u5247\uff0c\u56e0\u6b64\u6211\u5011\u53ea\u80fd\u5728\u5806\u758a\u9802\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u65b0\u589e\u548c\u522a\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u5806\u758a\u53ef\u4ee5\u8996\u70ba\u4e00\u7a2e\u53d7\u9650\u5236\u7684\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u201c\u906e\u853d\u201d\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u90e8\u5206\u7121\u95dc\u64cd\u4f5c\uff0c\u4f7f\u5176\u5c0d\u5916\u8868\u73fe\u7684\u908f\u8f2f\u7b26\u5408\u5806\u758a\u7684\u7279\u6027\u3002

"},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u9802\uff0c\u5c3e\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u5e95\u3002

\u5982\u5716 5-2 \u6240\u793a\uff0c\u5c0d\u65bc\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u6211\u5011\u53ea\u9700\u5c07\u5143\u7d20\u63d2\u5165\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u9019\u7a2e\u7bc0\u9ede\u63d2\u5165\u65b9\u6cd5\u88ab\u7a31\u70ba\u201c\u982d\u63d2\u6cd5\u201d\u3002\u800c\u5c0d\u65bc\u51fa\u5806\u758a\u64cd\u4f5c\uff0c\u53ea\u9700\u5c07\u982d\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u5373\u53ef\u3002

LinkedListStackpush()pop()

\u5716 5-2 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize;        // \u5806\u758a\u7684\u9577\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private int stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize = 0;   // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u5806\u758a\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var _size: Int // \u5806\u758a\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    #stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    #stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private stkSize: number = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u985e\u5225\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n  int _stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba List \u4e26\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    stk_size: usize,                              // \u5806\u758a\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    ListNode *top; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int size;      // \u5806\u758a\u7684\u9577\u5ea6\n} LinkedListStack;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u6307\u6a19\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u8cc7\u6599\u57df\n    s->top = node;       // \u66f4\u65b0\u5806\u758a\u9802\n    s->size++;           // \u66f4\u65b0\u5806\u758a\u5927\u5c0f\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u5806\u758a */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var stkSize: Int = 0 // \u5806\u758a\u7684\u9577\u5ea6\n) {\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n        stk_size: usize = 0,                             // \u5806\u758a\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u5806\u758a\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u5806\u758a\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u7684\u5c3e\u90e8\u4f5c\u70ba\u5806\u758a\u9802\u3002\u5982\u5716 5-3 \u6240\u793a\uff0c\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u5206\u5225\u5c0d\u61c9\u5728\u9663\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u8207\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(1)\\) \u3002

ArrayStackpush()pop()

\u5716 5-3 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

\u7531\u65bc\u5165\u5806\u758a\u7684\u5143\u7d20\u53ef\u80fd\u6703\u6e90\u6e90\u4e0d\u65b7\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff0c\u9019\u6a23\u5c31\u7121\u9808\u81ea\u884c\u8655\u7406\u9663\u5217\u64f4\u5bb9\u554f\u984c\u3002\u4ee5\u4e0b\u70ba\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype arrayStack struct {\n    data []int // \u8cc7\u6599\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8a2d\u5b9a\u5806\u758a\u7684\u9577\u5ea6\u70ba 0\uff0c\u5bb9\u91cf\u70ba 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u6703\u81ea\u52d5\u64f4\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6\u5806\u758a\u9802\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = []\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c07\u5806\u758a\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u5806\u758a */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u5806\u758a\u70ba\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u5efa\u69cb\u5b50 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u500b\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u64f4\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u5806\u758a\u5df2\u6eff\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u5806\u758a */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass ArrayStack\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u69cb\u65b9\u6cd5\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u5806\u758a\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u5169\u7a2e\u5be6\u73fe\u5c0d\u6bd4","text":"

\u652f\u6301\u64cd\u4f5c

\u5169\u7a2e\u5be6\u73fe\u90fd\u652f\u6301\u5806\u758a\u5b9a\u7fa9\u4e2d\u7684\u5404\u9805\u64cd\u4f5c\u3002\u9663\u5217\u5be6\u73fe\u984d\u5916\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff0c\u4f46\u9019\u5df2\u8d85\u51fa\u4e86\u5806\u758a\u7684\u5b9a\u7fa9\u7bc4\u7587\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u6703\u7528\u5230\u3002

\u6642\u9593\u6548\u7387

\u5728\u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u5165\u5806\u758a\u548c\u51fa\u5806\u758a\u64cd\u4f5c\u90fd\u5728\u9810\u5148\u5206\u914d\u597d\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u4e2d\u9032\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u5feb\u53d6\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f03\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u5806\u758a\u6642\u8d85\u51fa\u9663\u5217\u5bb9\u91cf\uff0c\u6703\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\uff0c\u5c0e\u81f4\u8a72\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8b8a\u70ba \\(O(n)\\) \u3002

\u5728\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u64f4\u5bb9\u975e\u5e38\u9748\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u9663\u5217\u64f4\u5bb9\u6642\u6548\u7387\u964d\u4f4e\u7684\u554f\u984c\u3002\u4f46\u662f\uff0c\u5165\u5806\u758a\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u7bc0\u9ede\u7269\u4ef6\u4e26\u4fee\u6539\u6307\u6a19\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5c0d\u8f03\u4f4e\u3002\u4e0d\u904e\uff0c\u5982\u679c\u5165\u5806\u758a\u5143\u7d20\u672c\u8eab\u5c31\u662f\u7bc0\u9ede\u7269\u4ef6\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9a5f\uff0c\u5f9e\u800c\u63d0\u9ad8\u6548\u7387\u3002

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u7576\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u8cc7\u6599\u578b\u5225\u6642\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

  • \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u5728\u89f8\u767c\u64f4\u5bb9\u6642\u6548\u7387\u6703\u964d\u4f4e\uff0c\u4f46\u7531\u65bc\u64f4\u5bb9\u662f\u4f4e\u983b\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
  • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002

\u7a7a\u9593\u6548\u7387

\u5728\u521d\u59cb\u5316\u4e32\u5217\u6642\uff0c\u7cfb\u7d71\u6703\u70ba\u4e32\u5217\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8a72\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\uff1b\u4e26\u4e14\uff0c\u64f4\u5bb9\u6a5f\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u9032\u884c\u64f4\u5bb9\u7684\uff0c\u64f4\u5bb9\u5f8c\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002

\u7136\u800c\uff0c\u7531\u65bc\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9700\u8981\u984d\u5916\u5132\u5b58\u6307\u6a19\uff0c\u56e0\u6b64\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u4f54\u7528\u7684\u7a7a\u9593\u76f8\u5c0d\u8f03\u5927\u3002

\u7d9c\u4e0a\uff0c\u6211\u5011\u4e0d\u80fd\u7c21\u55ae\u5730\u78ba\u5b9a\u54ea\u7a2e\u5be6\u73fe\u66f4\u52a0\u7bc0\u7701\u8a18\u61b6\u9ad4\uff0c\u9700\u8981\u91dd\u5c0d\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

"},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u5806\u758a\u7684\u5178\u578b\u61c9\u7528","text":"
  • \u700f\u89bd\u5668\u4e2d\u7684\u5f8c\u9000\u8207\u524d\u9032\u3001\u8edf\u9ad4\u4e2d\u7684\u64a4\u92b7\u8207\u53cd\u64a4\u92b7\u3002\u6bcf\u7576\u6211\u5011\u958b\u555f\u65b0\u7684\u7db2\u9801\uff0c\u700f\u89bd\u5668\u5c31\u6703\u5c0d\u4e0a\u4e00\u500b\u7db2\u9801\u57f7\u884c\u5165\u5806\u758a\uff0c\u9019\u6a23\u6211\u5011\u5c31\u53ef\u4ee5\u901a\u904e\u5f8c\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u500b\u7db2\u9801\u3002\u5f8c\u9000\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u5728\u57f7\u884c\u51fa\u5806\u758a\u3002\u5982\u679c\u8981\u540c\u6642\u652f\u6301\u5f8c\u9000\u548c\u524d\u9032\uff0c\u90a3\u9ebc\u9700\u8981\u5169\u500b\u5806\u758a\u4f86\u914d\u5408\u5be6\u73fe\u3002
  • \u7a0b\u5f0f\u8a18\u61b6\u9ad4\u7ba1\u7406\u3002\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u5728\u5806\u758a\u9802\u65b0\u589e\u4e00\u500b\u5806\u758a\u5e40\uff0c\u7528\u65bc\u8a18\u9304\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u8a0a\u3002\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u5411\u4e0b\u905e\u63a8\u968e\u6bb5\u6703\u4e0d\u65b7\u57f7\u884c\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u968e\u6bb5\u5247\u6703\u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u758a\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5806\u758a\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
  • \u5728\u6642\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u5177\u6709\u8f03\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u64f4\u5bb9\u904e\u7a0b\u4e2d\uff0c\u55ae\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5806\u758a\u7684\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5177\u6709\u66f4\u70ba\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002
  • \u5728\u7a7a\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u53ef\u80fd\u5c0e\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6bd4\u9663\u5217\u5143\u7d20\u66f4\u5927\u3002
  • \u4f47\u5217\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u540c\u6a23\u53ef\u4ee5\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u7684\u5c0d\u6bd4\u4e0a\uff0c\u4f47\u5217\u7684\u7d50\u8ad6\u8207\u524d\u8ff0\u5806\u758a\u7684\u7d50\u8ad6\u76f8\u4f3c\u3002
  • \u96d9\u5411\u4f47\u5217\u662f\u4e00\u7a2e\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u4f47\u5217\uff0c\u5b83\u5141\u8a31\u5728\u5169\u7aef\u9032\u884c\u5143\u7d20\u7684\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u662f\u5426\u662f\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1f

\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u529f\u80fd\u672c\u8cea\u4e0a\u662f\u201c\u5806\u758a\u201d\u7684\u9ad4\u73fe\u3002\u7576\u7528\u6236\u8a2a\u554f\u4e00\u500b\u65b0\u9801\u9762\u6642\uff0c\u8a72\u9801\u9762\u6703\u88ab\u65b0\u589e\u5230\u5806\u758a\u9802\uff1b\u7576\u7528\u6236\u9ede\u9078\u5f8c\u9000\u6309\u9215\u6642\uff0c\u8a72\u9801\u9762\u6703\u5f9e\u5806\u758a\u9802\u5f48\u51fa\u3002\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u64cd\u4f5c\uff0c\u9019\u500b\u5728\u201c\u96d9\u5411\u4f47\u5217\u201d\u7ae0\u7bc0\u6709\u63d0\u5230\u3002

Q\uff1a\u5728\u51fa\u5806\u758a\u5f8c\uff0c\u662f\u5426\u9700\u8981\u91cb\u653e\u51fa\u5806\u758a\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\uff1f

\u5982\u679c\u5f8c\u7e8c\u4ecd\u9700\u8981\u4f7f\u7528\u5f48\u51fa\u7bc0\u9ede\uff0c\u5247\u4e0d\u9700\u8981\u91cb\u653e\u8a18\u61b6\u9ad4\u3002\u82e5\u4e4b\u5f8c\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8a9e\u8a00\u64c1\u6709\u81ea\u52d5\u5783\u573e\u56de\u6536\u6a5f\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\u3002

Q\uff1a\u96d9\u5411\u4f47\u5217\u50cf\u662f\u5169\u500b\u5806\u758a\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u9ebc\uff1f

\u96d9\u5411\u4f47\u5217\u5c31\u50cf\u662f\u5806\u758a\u548c\u4f47\u5217\u7684\u7d44\u5408\u6216\u5169\u500b\u5806\u758a\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73fe\u7684\u662f\u5806\u758a + \u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u53ef\u4ee5\u5be6\u73fe\u5806\u758a\u8207\u4f47\u5217\u7684\u6240\u6709\u61c9\u7528\uff0c\u4e26\u4e14\u66f4\u52a0\u9748\u6d3b\u3002

Q\uff1a\u64a4\u92b7\uff08undo\uff09\u548c\u53cd\u64a4\u92b7\uff08redo\uff09\u5177\u9ad4\u662f\u5982\u4f55\u5be6\u73fe\u7684\uff1f

\u4f7f\u7528\u5169\u500b\u5806\u758a\uff0c\u5806\u758a A \u7528\u65bc\u64a4\u92b7\uff0c\u5806\u758a B \u7528\u65bc\u53cd\u64a4\u92b7\u3002

  1. \u6bcf\u7576\u4f7f\u7528\u8005\u57f7\u884c\u4e00\u500b\u64cd\u4f5c\uff0c\u5c07\u9019\u500b\u64cd\u4f5c\u58d3\u5165\u5806\u758a A \uff0c\u4e26\u6e05\u7a7a\u5806\u758a B \u3002
  2. \u7576\u7528\u6236\u57f7\u884c\u201c\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a A \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a B \u3002
  3. \u7576\u7528\u6236\u57f7\u884c\u201c\u53cd\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a B \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a A \u3002
"},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6a39","text":"

Abstract

\u53c3\u5929\u5927\u6a39\u5145\u6eff\u751f\u547d\u529b\uff0c\u6839\u6df1\u8449\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

\u5b83\u70ba\u6211\u5011\u5c55\u73fe\u4e86\u8cc7\u6599\u5206\u6cbb\u7684\u751f\u52d5\u5f62\u614b\u3002

"},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 7.1 \u00a0 \u4e8c\u5143\u6a39
  • 7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a
  • 7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a
  • 7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39
  • 7.5 \u00a0 AVL *
  • 7.6 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u5132\u5b58\u55ae\u5143\u70ba\u7bc0\u9ede TreeNode \uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u6307\u6a19\u76f8\u9023\u7dda\u3002\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7684\u5404\u9805\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u9ebc\uff0c\u6211\u5011\u80fd\u5426\u7528\u9663\u5217\u4f86\u8868\u793a\u4e8c\u5143\u6a39\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

\u5148\u5206\u6790\u4e00\u500b\u7c21\u55ae\u6848\u4f8b\u3002\u7d66\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u6211\u5011\u5c07\u6240\u6709\u7bc0\u9ede\u6309\u7167\u5c64\u5e8f\u8d70\u8a2a\u7684\u9806\u5e8f\u5132\u5b58\u5728\u4e00\u500b\u9663\u5217\u4e2d\uff0c\u5247\u6bcf\u500b\u7bc0\u9ede\u90fd\u5c0d\u61c9\u552f\u4e00\u7684\u9663\u5217\u7d22\u5f15\u3002

\u6839\u64da\u5c64\u5e8f\u8d70\u8a2a\u7684\u7279\u6027\uff0c\u6211\u5011\u53ef\u4ee5\u63a8\u5c0e\u51fa\u7236\u7bc0\u9ede\u7d22\u5f15\u8207\u5b50\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u201c\u5c0d\u6620\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(i\\) \uff0c\u5247\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 2\\) \u3002\u5716 7-12 \u5c55\u793a\u4e86\u5404\u500b\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u5c0d\u6620\u95dc\u4fc2\u3002

\u5716 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u5c0d\u6620\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u7576\u65bc\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u7d66\u5b9a\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u7bc0\u9ede\uff0c\u6211\u5011\u90fd\u53ef\u4ee5\u900f\u904e\u5c0d\u6620\u516c\u5f0f\u4f86\u8a2a\u554f\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u5143\u6a39","text":"

\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u4e00\u500b\u7279\u4f8b\uff0c\u5728\u4e8c\u5143\u6a39\u7684\u4e2d\u9593\u5c64\u901a\u5e38\u5b58\u5728\u8a31\u591a None \u3002\u7531\u65bc\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e26\u4e0d\u5305\u542b\u9019\u4e9b None \uff0c\u56e0\u6b64\u6211\u5011\u7121\u6cd5\u50c5\u6191\u8a72\u5e8f\u5217\u4f86\u63a8\u6e2c None \u7684\u6578\u91cf\u548c\u5206\u4f48\u4f4d\u7f6e\u3002\u9019\u610f\u5473\u8457\u5b58\u5728\u591a\u7a2e\u4e8c\u5143\u6a39\u7d50\u69cb\u90fd\u7b26\u5408\u8a72\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002

\u5982\u5716 7-13 \u6240\u793a\uff0c\u7d66\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u4e0a\u8ff0\u9663\u5217\u8868\u793a\u65b9\u6cd5\u5df2\u7d93\u5931\u6548\u3002

\u5716 7-13 \u00a0 \u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c0d\u61c9\u591a\u7a2e\u4e8c\u5143\u6a39\u53ef\u80fd\u6027

\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e2d\u986f\u5f0f\u5730\u5beb\u51fa\u6240\u6709 None \u3002\u5982\u5716 7-14 \u6240\u793a\uff0c\u9019\u6a23\u8655\u7406\u5f8c\uff0c\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u5143\u6a39\u4e86\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\n# \u4f7f\u7528 None \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6a19\u8a18\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88dd\u985e\u5225 Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 any \u578b\u5225\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 None \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6a19\u8a18\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u7bc0\u9ede\u503c\u4e0d\u80fd\u70ba INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
### \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a ###\n# \u4f7f\u7528 nil \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
\n

\u5716 7-14 \u00a0 \u4efb\u610f\u578b\u5225\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u4f7f\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u56de\u9867\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u5b9a\u7fa9\uff0cNone \u53ea\u51fa\u73fe\u5728\u6700\u5e95\u5c64\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73fe\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u672b\u5c3e\u3002

\u9019\u610f\u5473\u8457\u4f7f\u7528\u9663\u5217\u8868\u793a\u5b8c\u5168\u4e8c\u5143\u6a39\u6642\uff0c\u53ef\u4ee5\u7701\u7565\u5132\u5b58\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u5716 7-15 \u7d66\u51fa\u4e86\u4e00\u500b\u4f8b\u5b50\u3002

\u5716 7-15 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u68f5\u57fa\u65bc\u9663\u5217\u8868\u793a\u7684\u4e8c\u5143\u6a39\uff0c\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u64cd\u4f5c\u3002

  • \u7d66\u5b9a\u67d0\u7bc0\u9ede\uff0c\u7372\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3001\u7236\u7bc0\u9ede\u3002
  • \u7372\u53d6\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u3001\u5f8c\u5e8f\u8d70\u8a2a\u3001\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u5efa\u69cb\u5b50 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    #dfs(i, order, res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u4e32\u5217\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c64\u5e8f\u8d70\u8a2a */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u8d70\u8a2a */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u8d70\u8a2a */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u5f8c\u5e8f\u8d70\u8a2a */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u5efa\u69cb\u5b50 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 ###\nclass ArrayBinaryTree\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u4e32\u5217\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c64\u5e8f\u8d70\u8a2a ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u5f8c\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u8d70\u8a2a ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u8d70\u8a2a ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u5f8c\u5e8f\u8d70\u8a2a ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

  • \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u5c0d\u5feb\u53d6\u53cb\u597d\uff0c\u8a2a\u554f\u8207\u8d70\u8a2a\u901f\u5ea6\u8f03\u5feb\u3002
  • \u4e0d\u9700\u8981\u5132\u5b58\u6307\u6a19\uff0c\u6bd4\u8f03\u7bc0\u7701\u7a7a\u9593\u3002
  • \u5141\u8a31\u96a8\u6a5f\u8a2a\u554f\u7bc0\u9ede\u3002

\u7136\u800c\uff0c\u9663\u5217\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002

  • \u9663\u5217\u5132\u5b58\u9700\u8981\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u5132\u5b58\u8cc7\u6599\u91cf\u904e\u5927\u7684\u6a39\u3002
  • \u589e\u522a\u7bc0\u9ede\u9700\u8981\u900f\u904e\u9663\u5217\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u5be6\u73fe\uff0c\u6548\u7387\u8f03\u4f4e\u3002
  • \u7576\u4e8c\u5143\u6a39\u4e2d\u5b58\u5728\u5927\u91cf None \u6642\uff0c\u9663\u5217\u4e2d\u5305\u542b\u7684\u7bc0\u9ede\u8cc7\u6599\u6bd4\u91cd\u8f03\u4f4e\uff0c\u7a7a\u9593\u5229\u7528\u7387\u8f03\u4f4e\u3002
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6a39 *","text":"

\u5728\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7ae0\u7bc0\u4e2d\u6211\u5011\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5c07\u5f9e \\(O(\\log n)\\) \u52a3\u5316\u70ba \\(O(n)\\) \u3002

\u5982\u5716 7-24 \u6240\u793a\uff0c\u7d93\u904e\u5169\u6b21\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\uff0c\u9019\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\u4fbf\u6703\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002

\u5716 7-24 \u00a0 AVL \u6a39\u5728\u522a\u9664\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u5716 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u5169\u500b\u7bc0\u9ede\u5f8c\uff0c\u6a39\u5c07\u56b4\u91cd\u5411\u5de6\u50be\u659c\uff0c\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u96a8\u4e4b\u52a3\u5316\u3002

\u5716 7-25 \u00a0 AVL \u6a39\u5728\u63d2\u5165\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8ad6\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6a39\u3002\u8ad6\u6587\u4e2d\u8a73\u7d30\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u78ba\u4fdd\u5728\u6301\u7e8c\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u4e0d\u6703\u9000\u5316\uff0c\u5f9e\u800c\u4f7f\u5f97\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7d1a\u5225\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u5728\u9700\u8981\u983b\u7e41\u9032\u884c\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u5834\u666f\u4e2d\uff0cAVL \u6a39\u80fd\u59cb\u7d42\u4fdd\u6301\u9ad8\u6548\u7684\u8cc7\u6599\u64cd\u4f5c\u6548\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u61c9\u7528\u50f9\u503c\u3002

"},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6a39\u5e38\u898b\u8853\u8a9e","text":"

AVL \u6a39\u65e2\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u5143\u6a39\uff0c\u540c\u6642\u6eff\u8db3\u9019\u5169\u985e\u4e8c\u5143\u6a39\u7684\u6240\u6709\u6027\u8cea\uff0c\u56e0\u6b64\u662f\u4e00\u7a2e\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff08balanced binary search tree\uff09\u3002

"},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u7bc0\u9ede\u9ad8\u5ea6","text":"

\u7531\u65bc AVL \u6a39\u7684\u76f8\u95dc\u64cd\u4f5c\u9700\u8981\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u70ba\u7bc0\u9ede\u985e\u5225\u65b0\u589e height \u8b8a\u6578\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL \u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u7bc0\u9ede\u503c\n        self.height: int = 0                # \u7bc0\u9ede\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nstruct TreeNode {\n    int val{};          // \u7bc0\u9ede\u503c\n    int height = 0;     // \u7bc0\u9ede\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u7bc0\u9ede\n    TreeNode *right{};  // \u53f3\u5b50\u7bc0\u9ede\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    public int val;        // \u7bc0\u9ede\u503c\n    public int height;     // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u7bc0\u9ede\n    public TreeNode right; // \u53f3\u5b50\u7bc0\u9ede\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val    int       // \u7bc0\u9ede\u503c\n    Height int       // \u7bc0\u9ede\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var height: Int // \u7bc0\u9ede\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    height; //\u7bc0\u9ede\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;            // \u7bc0\u9ede\u503c\n    height: number;         // \u7bc0\u9ede\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right: TreeNode | null; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    height: i32,                            // \u7bc0\u9ede\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val height: Int = 0          // \u7bc0\u9ede\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\n}\n
### AVL \u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :height # \u7bc0\u9ede\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
\n

\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u662f\u6307\u5f9e\u8a72\u7bc0\u9ede\u5230\u5b83\u7684\u6700\u9060\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u5373\u6240\u7d93\u904e\u7684\u201c\u908a\u201d\u7684\u6578\u91cf\u3002\u9700\u8981\u7279\u5225\u6ce8\u610f\u7684\u662f\uff0c\u8449\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(0\\) \uff0c\u800c\u7a7a\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(-1\\) \u3002\u6211\u5011\u5c07\u5efa\u7acb\u5169\u500b\u5de5\u5177\u51fd\u5f0f\uff0c\u5206\u5225\u7528\u65bc\u7372\u53d6\u548c\u66f4\u65b0\u7bc0\u9ede\u7684\u9ad8\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50","text":"

\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u7fa9\u70ba\u7bc0\u9ede\u5de6\u5b50\u6a39\u7684\u9ad8\u5ea6\u6e1b\u53bb\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\uff0c\u540c\u6642\u898f\u5b9a\u7a7a\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u70ba \\(0\\) \u3002\u6211\u5011\u540c\u6a23\u5c07\u7372\u53d6\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node is None:\n        return 0\n    # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == nullptr)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node == nil {\n        return 0\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    guard let node = node else { return 0 }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  if (node == null) return 0;\n  // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n        None => 0,\n        // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u7372\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  return 0 if node.nil?\n\n  # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u7372\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

\u8a2d\u5e73\u8861\u56e0\u5b50\u70ba \\(f\\) \uff0c\u5247\u4e00\u68f5 AVL \u6a39\u7684\u4efb\u610f\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6eff\u8db3 \\(-1 \\le f \\le 1\\) \u3002

"},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6a39\u65cb\u8f49","text":"

AVL \u6a39\u7684\u7279\u9ede\u5728\u65bc\u201c\u65cb\u8f49\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u5920\u5728\u4e0d\u5f71\u97ff\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u65cb\u8f49\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7684\u6027\u8cea\uff0c\u4e5f\u80fd\u4f7f\u6a39\u91cd\u65b0\u8b8a\u70ba\u201c\u5e73\u8861\u4e8c\u5143\u6a39\u201d\u3002

\u6211\u5011\u5c07\u5e73\u8861\u56e0\u5b50\u7d55\u5c0d\u503c \\(> 1\\) \u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5931\u8861\u7bc0\u9ede\u201d\u3002\u6839\u64da\u7bc0\u9ede\u5931\u8861\u60c5\u6cc1\u7684\u4e0d\u540c\uff0c\u65cb\u8f49\u64cd\u4f5c\u5206\u70ba\u56db\u7a2e\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3002\u4e0b\u9762\u8a73\u7d30\u4ecb\u7d39\u9019\u4e9b\u65cb\u8f49\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

\u5982\u5716 7-26 \u6240\u793a\uff0c\u7bc0\u9ede\u4e0b\u65b9\u70ba\u5e73\u8861\u56e0\u5b50\u3002\u5f9e\u5e95\u81f3\u9802\u770b\uff0c\u4e8c\u5143\u6a39\u4e2d\u9996\u500b\u5931\u8861\u7bc0\u9ede\u662f\u201c\u7bc0\u9ede 3\u201d\u3002\u6211\u5011\u95dc\u6ce8\u4ee5\u8a72\u5931\u8861\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\uff0c\u5c07\u8a72\u7bc0\u9ede\u8a18\u70ba node \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u8a18\u70ba child \uff0c\u57f7\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u5f8c\uff0c\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\uff0c\u4e26\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u3002

<1><2><3><4>

\u5716 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9a5f

\u5982\u5716 7-27 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u53f3\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u5de6\u5b50\u7bc0\u9ede\u3002

\u5716 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

\u201c\u5411\u53f3\u65cb\u8f49\u201d\u662f\u4e00\u7a2e\u5f62\u8c61\u5316\u7684\u8aaa\u6cd5\uff0c\u5be6\u969b\u4e0a\u9700\u8981\u900f\u904e\u4fee\u6539\u7bc0\u9ede\u6307\u6a19\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

\u76f8\u61c9\u5730\uff0c\u5982\u679c\u8003\u616e\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u201c\u6620\u8c61\u201d\uff0c\u5247\u9700\u8981\u57f7\u884c\u5716 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

\u5716 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u5982\u5716 7-29 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u5de6\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u53f3\u5b50\u7bc0\u9ede\u3002

\u5716 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

\u53ef\u4ee5\u89c0\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u908f\u8f2f\u4e0a\u662f\u6620\u8c61\u5c0d\u7a31\u7684\uff0c\u5b83\u5011\u5206\u5225\u89e3\u6c7a\u7684\u5169\u7a2e\u5931\u8861\u60c5\u6cc1\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u57fa\u65bc\u5c0d\u7a31\u6027\uff0c\u6211\u5011\u53ea\u9700\u5c07\u53f3\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u63db\u70ba right \uff0c\u5c07\u6240\u6709\u7684 right \u66ff\u63db\u70ba left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb","text":"

\u5c0d\u65bc\u5716 7-30 \u4e2d\u7684\u5931\u8861\u7bc0\u9ede 3 \uff0c\u50c5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u7121\u6cd5\u4f7f\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\u3002\u6b64\u6642\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u53f3\u65cb\u201d\u3002

\u5716 7-30 \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb","text":"

\u5982\u5716 7-31 \u6240\u793a\uff0c\u5c0d\u65bc\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u6620\u8c61\u60c5\u6cc1\uff0c\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u5de6\u65cb\u201d\u3002

\u5716 7-31 \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f49\u7684\u9078\u64c7","text":"

\u5716 7-32 \u5c55\u793a\u7684\u56db\u7a2e\u5931\u8861\u60c5\u6cc1\u8207\u4e0a\u8ff0\u6848\u4f8b\u9010\u500b\u5c0d\u61c9\uff0c\u5206\u5225\u9700\u8981\u63a1\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

\u5716 7-32 \u00a0 AVL \u6a39\u7684\u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u5011\u900f\u904e\u5224\u65b7\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f03\u9ad8\u4e00\u5074\u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8ca0\u865f\uff0c\u4f86\u78ba\u5b9a\u5931\u8861\u7bc0\u9ede\u5c6c\u65bc\u5716 7-32 \u4e2d\u7684\u54ea\u7a2e\u60c5\u6cc1\u3002

\u8868 7-3 \u00a0 \u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1\u7684\u9078\u64c7\u689d\u4ef6

\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u61c9\u63a1\u7528\u7684\u65cb\u8f49\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(<0\\) \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(>0\\) \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

\u70ba\u4e86\u4fbf\u65bc\u4f7f\u7528\uff0c\u6211\u5011\u5c07\u65cb\u8f49\u64cd\u4f5c\u5c01\u88dd\u6210\u4e00\u500b\u51fd\u5f0f\u3002\u6709\u4e86\u9019\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u5c31\u80fd\u5c0d\u5404\u7a2e\u5931\u8861\u60c5\u6cc1\u9032\u884c\u65cb\u8f49\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\"\"\"\n    # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6a39\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6a39\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u85a6\u77ed\u8b8a\u6578\uff0c\u9019\u88e1 bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6a39\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n#rotate(node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6a39\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6a39\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6a39\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6a39\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 ###\ndef rotate(node)\n  # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6a39\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6a39\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6a39\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

AVL \u6a39\u7684\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u5728\u4e3b\u9ad4\u4e0a\u985e\u4f3c\u3002\u552f\u4e00\u7684\u5340\u5225\u5728\u65bc\uff0c\u5728 AVL \u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede\u5f8c\uff0c\u5f9e\u8a72\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u53ef\u80fd\u6703\u51fa\u73fe\u4e00\u7cfb\u5217\u5931\u8861\u7bc0\u9ede\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u5f9e\u9019\u500b\u7bc0\u9ede\u958b\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u7bc0\u9ede */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u7bc0\u9ede */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u7bc0\u9ede */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u985e\u4f3c\u5730\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u522a\u9664\u7bc0\u9ede\u65b9\u6cd5\u7684\u57fa\u790e\u4e0a\uff0c\u9700\u8981\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.java
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.cs
/* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.go
/* \u522a\u9664\u7bc0\u9ede */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.swift
/* \u522a\u9664\u7bc0\u9ede */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.js
/* \u522a\u9664\u7bc0\u9ede */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.ts
/* \u522a\u9664\u7bc0\u9ede */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.dart
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
avl_tree.rs
/* \u522a\u9664\u7bc0\u9ede */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.kt
/* \u522a\u9664\u7bc0\u9ede */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.rb
### \u522a\u9664\u7bc0\u9ede ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      node = child\n    else\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

AVL \u6a39\u7684\u7bc0\u9ede\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

"},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6a39\u5178\u578b\u61c9\u7528","text":"
  • \u7d44\u7e54\u548c\u5132\u5b58\u5927\u578b\u8cc7\u6599\uff0c\u9069\u7528\u65bc\u9ad8\u983b\u67e5\u8a62\u3001\u4f4e\u983b\u589e\u522a\u7684\u5834\u666f\u3002
  • \u7528\u65bc\u69cb\u5efa\u8cc7\u6599\u5eab\u4e2d\u7684\u7d22\u5f15\u7cfb\u7d71\u3002
  • \u7d05\u9ed1\u6a39\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\u3002\u76f8\u8f03\u65bc AVL \u6a39\uff0c\u7d05\u9ed1\u6a39\u7684\u5e73\u8861\u689d\u4ef6\u66f4\u5bec\u9b06\uff0c\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u6240\u9700\u7684\u65cb\u8f49\u64cd\u4f5c\u66f4\u5c11\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39","text":"

\u5982\u5716 7-16 \u6240\u793a\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\uff08binary search tree\uff09\u6eff\u8db3\u4ee5\u4e0b\u689d\u4ef6\u3002

  1. \u5c0d\u65bc\u6839\u7bc0\u9ede\uff0c\u5de6\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c \\(<\\) \u6839\u7bc0\u9ede\u7684\u503c \\(<\\) \u53f3\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c\u3002
  2. \u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u3001\u53f3\u5b50\u6a39\u4e5f\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5373\u540c\u6a23\u6eff\u8db3\u689d\u4ef6 1. \u3002

\u5716 7-16 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39

"},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u64cd\u4f5c","text":"

\u6211\u5011\u5c07\u4e8c\u5143\u641c\u5c0b\u6a39\u5c01\u88dd\u70ba\u4e00\u500b\u985e\u5225 BinarySearchTree \uff0c\u4e26\u5ba3\u544a\u4e00\u500b\u6210\u54e1\u8b8a\u6578 root \uff0c\u6307\u5411\u6a39\u7684\u6839\u7bc0\u9ede\u3002

"},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

\u7d66\u5b9a\u76ee\u6a19\u7bc0\u9ede\u503c num \uff0c\u53ef\u4ee5\u6839\u64da\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u4f86\u67e5\u8a62\u3002\u5982\u5716 7-17 \u6240\u793a\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u7bc0\u9ede cur \uff0c\u5f9e\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede root \u51fa\u767c\uff0c\u8ff4\u5708\u6bd4\u8f03\u7bc0\u9ede\u503c cur.val \u548c num \u4e4b\u9593\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

  • \u82e5 cur.val < num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.right \u3002
  • \u82e5 cur.val > num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.left \u3002
  • \u82e5 cur.val = num \uff0c\u8aaa\u660e\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\u4e26\u8fd4\u56de\u8a72\u7bc0\u9ede\u3002
<1><2><3><4>

\u5716 7-17 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7bc0\u9ede\u793a\u4f8b

\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f2a\u6392\u9664\u4e00\u534a\u60c5\u6cc1\u3002\u8ff4\u5708\u6b21\u6578\u6700\u591a\u70ba\u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff0c\u7576\u4e8c\u5143\u6a39\u5e73\u8861\u6642\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u8a62\u7bc0\u9ede\"\"\"\n    cur = self._root\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u8a62\u7bc0\u9ede */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u8a62\u7bc0\u9ede */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num) {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u8a62\u7bc0\u9ede */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u8a62\u7bc0\u9ede */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u8a62\u7bc0\u9ede ###\ndef search(num)\n  cur = @root\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u8a62\u7bc0\u9ede\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

\u7d66\u5b9a\u4e00\u500b\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u70ba\u4e86\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-18 \u6240\u793a\u3002

  1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\uff1a\u8207\u67e5\u8a62\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5f9e\u6839\u7bc0\u9ede\u51fa\u767c\uff0c\u6839\u64da\u7576\u524d\u7bc0\u9ede\u503c\u548c num \u7684\u5927\u5c0f\u95dc\u4fc2\u8ff4\u5708\u5411\u4e0b\u641c\u5c0b\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\uff08\u8d70\u8a2a\u81f3 None \uff09\u6642\u8df3\u51fa\u8ff4\u5708\u3002
  2. \u5728\u8a72\u4f4d\u7f6e\u63d2\u5165\u7bc0\u9ede\uff1a\u521d\u59cb\u5316\u7bc0\u9ede num \uff0c\u5c07\u8a72\u7bc0\u9ede\u7f6e\u65bc None \u7684\u4f4d\u7f6e\u3002

\u5716 7-18 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

  • \u4e8c\u5143\u641c\u5c0b\u6a39\u4e0d\u5141\u8a31\u5b58\u5728\u91cd\u8907\u7bc0\u9ede\uff0c\u5426\u5247\u5c07\u9055\u53cd\u5176\u5b9a\u7fa9\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u7bc0\u9ede\u5728\u6a39\u4e2d\u5df2\u5b58\u5728\uff0c\u5247\u4e0d\u57f7\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
  • \u70ba\u4e86\u5be6\u73fe\u63d2\u5165\u7bc0\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u7bc0\u9ede pre \u5132\u5b58\u4e0a\u4e00\u8f2a\u8ff4\u5708\u7684\u7bc0\u9ede\u3002\u9019\u6a23\u5728\u8d70\u8a2a\u81f3 None \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u7372\u53d6\u5230\u5176\u7236\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b8c\u6210\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u7bc0\u9ede\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u7bc0\u9ede */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u7bc0\u9ede\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u7bc0\u9ede */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u7bc0\u9ede */\nfun insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u7bc0\u9ede\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8207\u67e5\u8a62\u7bc0\u9ede\u76f8\u540c\uff0c\u63d2\u5165\u7bc0\u9ede\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002

"},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u5148\u5728\u4e8c\u5143\u6a39\u4e2d\u67e5\u8a62\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u518d\u5c07\u5176\u522a\u9664\u3002\u8207\u63d2\u5165\u7bc0\u9ede\u985e\u4f3c\uff0c\u6211\u5011\u9700\u8981\u4fdd\u8b49\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\u4ecd\u7136\u6eff\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6839\u64da\u76ee\u6a19\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u6578\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u7a2e\u60c5\u6cc1\uff0c\u57f7\u884c\u5c0d\u61c9\u7684\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u3002

\u5982\u5716 7-19 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \u6642\uff0c\u8868\u793a\u8a72\u7bc0\u9ede\u662f\u8449\u7bc0\u9ede\uff0c\u53ef\u4ee5\u76f4\u63a5\u522a\u9664\u3002

\u5716 7-19 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 0 \uff09

\u5982\u5716 7-20 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(1\\) \u6642\uff0c\u5c07\u5f85\u522a\u9664\u7bc0\u9ede\u66ff\u63db\u70ba\u5176\u5b50\u7bc0\u9ede\u5373\u53ef\u3002

\u5716 7-20 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 1 \uff09

\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(2\\) \u6642\uff0c\u6211\u5011\u7121\u6cd5\u76f4\u63a5\u522a\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u500b\u7bc0\u9ede\u66ff\u63db\u8a72\u7bc0\u9ede\u3002\u7531\u65bc\u8981\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u56e0\u6b64\u9019\u500b\u7bc0\u9ede\u53ef\u4ee5\u662f\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\u6216\u5de6\u5b50\u6a39\u7684\u6700\u5927\u7bc0\u9ede\u3002

\u5047\u8a2d\u6211\u5011\u9078\u64c7\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\uff08\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\uff0c\u5247\u522a\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-21 \u6240\u793a\u3002

  1. \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\u5728\u201c\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff0c\u8a18\u70ba tmp \u3002
  2. \u7528 tmp \u7684\u503c\u8986\u84cb\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u503c\uff0c\u4e26\u5728\u6a39\u4e2d\u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp \u3002
<1><2><3><4>

\u5716 7-21 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 2 \uff09

\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u540c\u6a23\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\uff0c\u5176\u4e2d\u67e5\u8a62\u5f85\u522a\u9664\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\uff0c\u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u5f8c\u7e7c\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        child = cur.left or cur.right\n        # \u522a\u9664\u7bc0\u9ede cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            self._root = child\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else:\n        # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete cur;\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode? child = cur.left ?? cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u522a\u9664\u7bc0\u9ede */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u53f3\u5b50\u6a39\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u5de6\u5b50\u6a39\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u70ba 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u522a\u9664\u7bc0\u9ede cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            bst.root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u70ba 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5f85\u522a\u9664\u7bc0\u9ede cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u84cb cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u522a\u9664\u7bc0\u9ede */\nfunc remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        let child = cur?.left ?? cur?.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u522a\u9664\u7bc0\u9ede */\nremove(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u522a\u9664\u7bc0\u9ede */\nremove(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    TreeNode? child = cur.left ?? cur.right;\n    // \u522a\u9664\u7bc0\u9ede cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      _root = child;\n    }\n  } else {\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u522a\u9664\u7bc0\u9ede */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u522a\u9664\u7bc0\u9ede cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n                self.root = child;\n            }\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65b7\u5f85\u522a\u9664\u7bc0\u9ede\u662f\u5426\u5b58\u5728\u5b50\u7bc0\u9ede\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1 */\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(cur);\n    } else {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 2 */\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u522a\u9664\u7bc0\u9ede */\nfun remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u522a\u9664\u7bc0\u9ede ###\ndef remove(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    child = cur.left || cur.right\n    # \u522a\u9664\u7bc0\u9ede cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      @root = child\n    end\n  # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n  else\n    # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.?.val = tmp_val;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u8d70\u8a2a\u6709\u5e8f","text":"

\u5982\u5716 7-22 \u6240\u793a\uff0c\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u8d70\u8a2a\u9806\u5e8f\uff0c\u800c\u4e8c\u5143\u641c\u5c0b\u6a39\u6eff\u8db3\u201c\u5de6\u5b50\u7bc0\u9ede \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u7bc0\u9ede\u201d\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

\u9019\u610f\u5473\u8457\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u9032\u884c\u4e2d\u5e8f\u8d70\u8a2a\u6642\uff0c\u7e3d\u662f\u6703\u512a\u5148\u8d70\u8a2a\u4e0b\u4e00\u500b\u6700\u5c0f\u7bc0\u9ede\uff0c\u5f9e\u800c\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u6027\u8cea\uff1a\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

\u5229\u7528\u4e2d\u5e8f\u8d70\u8a2a\u5347\u5e8f\u7684\u6027\u8cea\uff0c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u7372\u53d6\u6709\u5e8f\u8cc7\u6599\u50c5\u9700 \\(O(n)\\) \u6642\u9593\uff0c\u7121\u9808\u9032\u884c\u984d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

\u5716 7-22 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387","text":"

\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528\u9663\u5217\u6216\u4e8c\u5143\u641c\u5c0b\u6a39\u5132\u5b58\u3002\u89c0\u5bdf\u8868 7-2 \uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u5404\u9805\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f\u5c0d\u6578\u968e\uff0c\u5177\u6709\u7a69\u5b9a\u4e14\u9ad8\u6548\u7684\u6548\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u983b\u65b0\u589e\u3001\u4f4e\u983b\u67e5\u8a62\u522a\u9664\u8cc7\u6599\u7684\u5834\u666f\u4e0b\uff0c\u9663\u5217\u6bd4\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387\u66f4\u9ad8\u3002

\u8868 7-2 \u00a0 \u9663\u5217\u8207\u641c\u5c0b\u6a39\u7684\u6548\u7387\u5c0d\u6bd4

\u7121\u5e8f\u9663\u5217 \u4e8c\u5143\u641c\u5c0b\u6a39 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

\u5728\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f2a\u8ff4\u5708\u5167\u67e5\u8a62\u4efb\u610f\u7bc0\u9ede\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u4e0d\u65b7\u5730\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\uff0c\u53ef\u80fd\u5c0e\u81f4\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u5716 7-23 \u6240\u793a\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u9019\u6642\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u6703\u9000\u5316\u70ba \\(O(n)\\) \u3002

\u5716 7-23 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u5e38\u898b\u61c9\u7528","text":"
  • \u7528\u4f5c\u7cfb\u7d71\u4e2d\u7684\u591a\u7d1a\u7d22\u5f15\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u67e5\u8a62\u3001\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u3002
  • \u4f5c\u70ba\u67d0\u4e9b\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002
  • \u7528\u65bc\u5132\u5b58\u8cc7\u6599\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72c0\u614b\u3002
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u5143\u6a39","text":"

\u4e8c\u5143\u6a39\uff08binary tree\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u4e8c\u5143\u6a39\u7684\u57fa\u672c\u55ae\u5143\u662f\u7bc0\u9ede\uff0c\u6bcf\u500b\u7bc0\u9ede\u5305\u542b\u503c\u3001\u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\u548c\u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"\u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    int val;          // \u7bc0\u9ede\u503c\n    TreeNode *left;   // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode *right;  // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    int val;         // \u7bc0\u9ede\u503c\n    TreeNode left;   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u5efa\u69cb\u5b50 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n        Right: nil, // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n        Val:   v,   // \u7bc0\u9ede\u503c\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct TreeNode {\n    int val;                // \u7bc0\u9ede\u503c\n    int height;             // \u7bc0\u9ede\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    struct TreeNode *right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
### \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
\n

\u6bcf\u500b\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u5206\u5225\u6307\u5411\u5de6\u5b50\u7bc0\u9ede\uff08left-child node\uff09\u548c\u53f3\u5b50\u7bc0\u9ede\uff08right-child node\uff09\uff0c\u8a72\u7bc0\u9ede\u88ab\u7a31\u70ba\u9019\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff08parent node\uff09\u3002\u7576\u7d66\u5b9a\u4e00\u500b\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6642\uff0c\u6211\u5011\u5c07\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6a39\uff08right subtree\uff09\u3002

\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u9664\u8449\u7bc0\u9ede\u5916\uff0c\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\u90fd\u5305\u542b\u5b50\u7bc0\u9ede\u548c\u975e\u7a7a\u5b50\u6a39\u3002\u5982\u5716 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c07\u201c\u7bc0\u9ede 2\u201d\u8996\u70ba\u7236\u7bc0\u9ede\uff0c\u5247\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u5206\u5225\u662f\u201c\u7bc0\u9ede 4\u201d\u548c\u201c\u7bc0\u9ede 5\u201d\uff0c\u5de6\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 4 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\uff0c\u53f3\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 5 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\u3002

\u5716 7-1 \u00a0 \u7236\u7bc0\u9ede\u3001\u5b50\u7bc0\u9ede\u3001\u5b50\u6a39

"},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u5143\u6a39\u5e38\u898b\u8853\u8a9e","text":"

\u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e\u5982\u5716 7-2 \u6240\u793a\u3002

  • \u6839\u7bc0\u9ede\uff08root node\uff09\uff1a\u4f4d\u65bc\u4e8c\u5143\u6a39\u9802\u5c64\u7684\u7bc0\u9ede\uff0c\u6c92\u6709\u7236\u7bc0\u9ede\u3002
  • \u8449\u7bc0\u9ede\uff08leaf node\uff09\uff1a\u6c92\u6709\u5b50\u7bc0\u9ede\u7684\u7bc0\u9ede\uff0c\u5176\u5169\u500b\u6307\u6a19\u5747\u6307\u5411 None \u3002
  • \u908a\uff08edge\uff09\uff1a\u9023\u7dda\u5169\u500b\u7bc0\u9ede\u7684\u7dda\u6bb5\uff0c\u5373\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002
  • \u7bc0\u9ede\u6240\u5728\u7684\u5c64\uff08level\uff09\uff1a\u5f9e\u9802\u81f3\u5e95\u905e\u589e\uff0c\u6839\u7bc0\u9ede\u6240\u5728\u5c64\u70ba 1 \u3002
  • \u7bc0\u9ede\u7684\u5ea6\uff08degree\uff09\uff1a\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u7684\u6578\u91cf\u3002\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u7bc4\u570d\u662f 0\u30011\u30012 \u3002
  • \u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u6700\u9060\u8449\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
  • \u7bc0\u9ede\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
  • \u7bc0\u9ede\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u8ddd\u96e2\u8a72\u7bc0\u9ede\u6700\u9060\u7684\u8449\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002

\u5716 7-2 \u00a0 \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e

Tip

\u8acb\u6ce8\u610f\uff0c\u6211\u5011\u901a\u5e38\u5c07\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u984c\u76ee\u6216\u6559\u6750\u53ef\u80fd\u6703\u5c07\u5176\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u7bc0\u9ede\u7684\u6578\u91cf\u201d\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

"},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u5143\u6a39\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u5143\u6a39","text":"

\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u7bc0\u9ede\uff0c\u7136\u5f8c\u69cb\u5efa\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// \u521d\u59cb\u5316\u7bc0\u9ede\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
# \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede","text":"

\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u53ef\u4ee5\u900f\u904e\u4fee\u6539\u6307\u6a19\u4f86\u5be6\u73fe\u3002\u5716 7-3 \u7d66\u51fa\u4e86\u4e00\u500b\u793a\u4f8b\u3002

\u5716 7-3 \u00a0 \u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = p\np.left = n2\n# \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.cpp
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.cs
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.go
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.js
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.ts
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.dart
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u522a\u9664\u7bc0\u9ede p\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.rb
# \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede _p\nn1.left = _p\n_p.left = n2\n# \u522a\u9664\u7bc0\u9ede\nn1.left = n2\n
binary_tree.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u7bc0\u9ede\u53ef\u80fd\u6703\u6539\u8b8a\u4e8c\u5143\u6a39\u7684\u539f\u6709\u908f\u8f2f\u7d50\u69cb\uff0c\u800c\u522a\u9664\u7bc0\u9ede\u901a\u5e38\u610f\u5473\u8457\u522a\u9664\u8a72\u7bc0\u9ede\u53ca\u5176\u6240\u6709\u5b50\u6a39\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u63d2\u5165\u8207\u522a\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5be6\u73fe\u6709\u5be6\u969b\u610f\u7fa9\u7684\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u898b\u4e8c\u5143\u6a39\u578b\u5225","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff08perfect binary tree\uff09\u6240\u6709\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u5b8c\u5168\u586b\u6eff\u3002\u5728\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\uff0c\u8449\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u7684\u5ea6\u90fd\u70ba \\(2\\) \uff1b\u82e5\u6a39\u7684\u9ad8\u5ea6\u70ba \\(h\\) \uff0c\u5247\u7bc0\u9ede\u7e3d\u6578\u70ba \\(2^{h+1} - 1\\) \uff0c\u5448\u73fe\u6a19\u6e96\u7684\u6307\u6578\u7d1a\u95dc\u4fc2\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u898b\u7684\u7d30\u80de\u5206\u88c2\u73fe\u8c61\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u7fa4\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u5e38\u88ab\u7a31\u70ba\u6eff\u4e8c\u5143\u6a39\u3002

\u5716 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c64\u7684\u7bc0\u9ede\u672a\u88ab\u586b\u6eff\uff0c\u4e14\u6700\u5e95\u5c64\u7bc0\u9ede\u5118\u91cf\u9760\u5de6\u586b\u5145\u3002

\u5716 7-5 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-6 \u6240\u793a\uff0c\u5b8c\u6eff\u4e8c\u5143\u6a39\uff08full binary tree\uff09\u9664\u4e86\u8449\u7bc0\u9ede\u4e4b\u5916\uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5b50\u7bc0\u9ede\u3002

\u5716 7-6 \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u5143\u6a39\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7d55\u5c0d\u503c\u4e0d\u8d85\u904e 1 \u3002

\u5716 7-7 \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u5143\u6a39\u7684\u9000\u5316","text":"

\u5716 7-8 \u5c55\u793a\u4e86\u4e8c\u5143\u6a39\u7684\u7406\u60f3\u7d50\u69cb\u8207\u9000\u5316\u7d50\u69cb\u3002\u7576\u4e8c\u5143\u6a39\u7684\u6bcf\u5c64\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u6642\uff0c\u9054\u5230\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff1b\u800c\u7576\u6240\u6709\u7bc0\u9ede\u90fd\u504f\u5411\u4e00\u5074\u6642\uff0c\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u201c\u93c8\u7d50\u4e32\u5217\u201d\u3002

  • \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u7406\u60f3\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5145\u5206\u767c\u63ee\u4e8c\u5143\u6a39\u201c\u5206\u6cbb\u201d\u7684\u512a\u52e2\u3002
  • \u93c8\u7d50\u4e32\u5217\u5247\u662f\u53e6\u4e00\u500b\u6975\u7aef\uff0c\u5404\u9805\u64cd\u4f5c\u90fd\u8b8a\u70ba\u7dda\u6027\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u5716 7-8 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

\u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7d50\u69cb\u548c\u6700\u5dee\u7d50\u69cb\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf\u3001\u7bc0\u9ede\u7e3d\u6578\u3001\u9ad8\u5ea6\u7b49\u9054\u5230\u6975\u5927\u503c\u6216\u6975\u5c0f\u503c\u3002

\u8868 7-1 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

\u5b8c\u7f8e\u4e8c\u5143\u6a39 \u93c8\u7d50\u4e32\u5217 \u7b2c \\(i\\) \u5c64\u7684\u7bc0\u9ede\u6578\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u7bc0\u9ede\u7e3d\u6578 \\(2^{h+1} - 1\\) \\(h + 1\\) \u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \u7684\u6a39\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a","text":"

\u5f9e\u7269\u7406\u7d50\u69cb\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u6a39\u662f\u4e00\u7a2e\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u56e0\u6b64\u5176\u8d70\u8a2a\u65b9\u5f0f\u662f\u900f\u904e\u6307\u6a19\u9010\u500b\u8a2a\u554f\u7bc0\u9ede\u3002\u7136\u800c\uff0c\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9019\u4f7f\u5f97\u8d70\u8a2a\u6a39\u6bd4\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u66f4\u52a0\u8907\u96dc\uff0c\u9700\u8981\u85c9\u52a9\u641c\u5c0b\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u3002

\u4e8c\u5143\u6a39\u5e38\u898b\u7684\u8d70\u8a2a\u65b9\u5f0f\u5305\u62ec\u5c64\u5e8f\u8d70\u8a2a\u3001\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u7b49\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c64\u5e8f\u8d70\u8a2a","text":"

\u5982\u5716 7-9 \u6240\u793a\uff0c\u5c64\u5e8f\u8d70\u8a2a\uff08level-order traversal\uff09\u5f9e\u9802\u90e8\u5230\u5e95\u90e8\u9010\u5c64\u8d70\u8a2a\u4e8c\u5143\u6a39\uff0c\u4e26\u5728\u6bcf\u4e00\u5c64\u6309\u7167\u5f9e\u5de6\u5230\u53f3\u7684\u9806\u5e8f\u8a2a\u554f\u7bc0\u9ede\u3002

\u5c64\u5e8f\u8d70\u8a2a\u672c\u8cea\u4e0a\u5c6c\u65bc\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\uff08breadth-first traversal\uff09\uff0c\u4e5f\u7a31\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\u3002

\u5716 7-9 \u00a0 \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a

"},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u901a\u5e38\u85c9\u52a9\u201c\u4f47\u5217\u201d\u4f86\u5be6\u73fe\u3002\u4f47\u5217\u9075\u5faa\u201c\u5148\u9032\u5148\u51fa\u201d\u7684\u898f\u5247\uff0c\u800c\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5247\u9075\u5faa\u201c\u9010\u5c64\u63a8\u9032\u201d\u7684\u898f\u5247\uff0c\u5169\u8005\u80cc\u5f8c\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n    # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u968a\u5217\u51fa\u968a\n        res.append(node.val)  # \u5132\u5b58\u7bc0\u9ede\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    return res\n
binary_tree_bfs.cpp
/* \u5c64\u5e8f\u8d70\u8a2a */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u968a\u5217\u51fa\u968a\n        vec.push_back(node->val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u968a\u5217\u51fa\u968a\n        list.add(node.val);           // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u968a\u5217\u51fa\u968a\n        list.Add(node.val!.Value);       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u5207\u7247\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u968a\u5217\u51fa\u968a\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u968a\u5217\u51fa\u968a\n        list.append(node.val) // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u968a\u5217\u51fa\u968a\n    res.add(node!.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c64\u5e8f\u8d70\u8a2a */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u968a\u5217\u51fa\u968a\n        vec.push(node.borrow().val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f14\u52a9\u4f47\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f14\u52a9\u4f47\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u4f47\u5217\u6307\u6a19\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u7bc0\u9ede\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    /* \u8f14\u52a9\u9663\u5217 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u9663\u5217\u6307\u6a19\n    index = 0;\n    while (front < rear) {\n        // \u968a\u5217\u51fa\u968a\n        node = queue[front++];\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u9663\u5217\u9577\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91cb\u653e\u8f14\u52a9\u9663\u5217\u7a7a\u9593\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c64\u5e8f\u8d70\u8a2a */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u968a\u5217\u51fa\u968a\n        list.add(node?._val!!)       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c64\u5e8f\u8d70\u8a2a ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u968a\u5217\u51fa\u968a\n    res << node.val # \u5132\u5b58\u7bc0\u9ede\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c64\u5e8f\u8d70\u8a2a\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u968a\u5217\u51fa\u968a\n        var node = queue_node.data;\n        try list.append(node.val);              // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }        \n    }\n    return list;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff0c\u5176\u4e2d \\(n\\) \u70ba\u7bc0\u9ede\u6578\u91cf\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6eff\u4e8c\u5143\u6a39\u6642\uff0c\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u6700\u591a\u540c\u6642\u5b58\u5728 \\((n + 1) / 2\\) \u500b\u7bc0\u9ede\uff0c\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\u3002
"},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a","text":"

\u76f8\u61c9\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\uff08depth-first traversal\uff09\uff0c\u4e5f\u7a31\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff08depth-first search, DFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002

\u5716 7-10 \u5c55\u793a\u4e86\u5c0d\u4e8c\u5143\u6a39\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5c31\u50cf\u662f\u7e5e\u8457\u6574\u68f5\u4e8c\u5143\u6a39\u7684\u5916\u570d\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u500b\u7bc0\u9ede\u90fd\u6703\u9047\u5230\u4e09\u500b\u4f4d\u7f6e\uff0c\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u3002

\u5716 7-10 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a

"},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u8d70\u8a2a */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u8d70\u8a2a */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u8d70\u8a2a ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u8d70\u8a2a ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u5f8c\u5e8f\u8d70\u8a2a ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u8d70\u8a2a\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u8d70\u8a2a\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u5f8c\u5e8f\u8d70\u8a2a\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4e5f\u53ef\u4ee5\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

\u5716 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u8d70\u8a2a\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5176\u53ef\u5206\u70ba\u201c\u905e\u201d\u548c\u201c\u8ff4\u201d\u5169\u500b\u9006\u5411\u7684\u90e8\u5206\u3002

  1. \u201c\u905e\u201d\u8868\u793a\u958b\u555f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5f0f\u5728\u6b64\u904e\u7a0b\u4e2d\u8a2a\u554f\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002
  2. \u201c\u8ff4\u201d\u8868\u793a\u51fd\u5f0f\u8fd4\u56de\uff0c\u4ee3\u8868\u7576\u524d\u7bc0\u9ede\u5df2\u7d93\u8a2a\u554f\u5b8c\u7562\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u5716 7-11 \u00a0 \u524d\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u904e\u7a0b

"},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u7cfb\u7d71\u4f54\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u4e8c\u5143\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9ad4\u73fe\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u6bcf\u500b\u4e8c\u5143\u6a39\u7bc0\u9ede\u5305\u542b\u4e00\u500b\u503c\u4ee5\u53ca\u5169\u500b\u6307\u6a19\uff0c\u5206\u5225\u6307\u5411\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u3002
  • \u5c0d\u65bc\u4e8c\u5143\u6a39\u4e2d\u7684\u67d0\u500b\u7bc0\u9ede\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6a39\u88ab\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6a39\u3002
  • \u4e8c\u5143\u6a39\u7684\u76f8\u95dc\u8853\u8a9e\u5305\u62ec\u6839\u7bc0\u9ede\u3001\u8449\u7bc0\u9ede\u3001\u5c64\u3001\u5ea6\u3001\u908a\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
  • \u4e8c\u5143\u6a39\u7684\u521d\u59cb\u5316\u3001\u7bc0\u9ede\u63d2\u5165\u548c\u7bc0\u9ede\u522a\u9664\u64cd\u4f5c\u8207\u93c8\u7d50\u4e32\u5217\u64cd\u4f5c\u65b9\u6cd5\u985e\u4f3c\u3002
  • \u5e38\u898b\u7684\u4e8c\u5143\u6a39\u578b\u5225\u6709\u5b8c\u7f8e\u4e8c\u5143\u6a39\u3001\u5b8c\u5168\u4e8c\u5143\u6a39\u3001\u5b8c\u6eff\u4e8c\u5143\u6a39\u548c\u5e73\u8861\u4e8c\u5143\u6a39\u3002\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u6700\u7406\u60f3\u7684\u72c0\u614b\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u9000\u5316\u5f8c\u7684\u6700\u5dee\u72c0\u614b\u3002
  • \u4e8c\u5143\u6a39\u53ef\u4ee5\u7528\u9663\u5217\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c07\u7bc0\u9ede\u503c\u548c\u7a7a\u4f4d\u6309\u5c64\u5e8f\u8d70\u8a2a\u9806\u5e8f\u6392\u5217\uff0c\u4e26\u6839\u64da\u7236\u7bc0\u9ede\u8207\u5b50\u7bc0\u9ede\u4e4b\u9593\u7684\u7d22\u5f15\u5c0d\u6620\u95dc\u4fc2\u4f86\u5be6\u73fe\u6307\u6a19\u3002
  • \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a\u662f\u4e00\u7a2e\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u65b9\u6cd5\uff0c\u5b83\u9ad4\u73fe\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u900f\u904e\u4f47\u5217\u4f86\u5be6\u73fe\u3002
  • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u7686\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u5b83\u5011\u9ad4\u73fe\u4e86\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
  • \u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u4e00\u7a2e\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \u3002\u7576\u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u5404\u9805\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • AVL \u6a39\uff0c\u4e5f\u7a31\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5b83\u900f\u904e\u65cb\u8f49\u64cd\u4f5c\u78ba\u4fdd\u5728\u4e0d\u65b7\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\u6a39\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
  • AVL \u6a39\u7684\u65cb\u8f49\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u6703\u5f9e\u5e95\u5411\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c0d\u65bc\u53ea\u6709\u4e00\u500b\u7bc0\u9ede\u7684\u4e8c\u5143\u6a39\uff0c\u6a39\u7684\u9ad8\u5ea6\u548c\u6839\u7bc0\u9ede\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u55ce\uff1f

\u662f\u7684\uff0c\u56e0\u70ba\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\u3002

Q\uff1a\u4e8c\u5143\u6a39\u4e2d\u7684\u63d2\u5165\u8207\u522a\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u9019\u88e1\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u9ebc\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u70ba\u8cc7\u6e90\u7684\u5b50\u7bc0\u9ede\u7684\u8cc7\u6e90\u91cb\u653e\u55ce\uff1f

\u62ff\u4e8c\u5143\u641c\u5c0b\u6a39\u4f86\u8209\u4f8b\uff0c\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u8981\u5206\u4e09\u7a2e\u60c5\u6cc1\u8655\u7406\uff0c\u5176\u4e2d\u6bcf\u7a2e\u60c5\u6cc1\u90fd\u9700\u8981\u9032\u884c\u591a\u500b\u6b65\u9a5f\u7684\u7bc0\u9ede\u64cd\u4f5c\u3002

Q\uff1a\u70ba\u4ec0\u9ebc DFS \u8d70\u8a2a\u4e8c\u5143\u6a39\u6709\u524d\u3001\u4e2d\u3001\u5f8c\u4e09\u7a2e\u9806\u5e8f\uff0c\u5206\u5225\u6709\u4ec0\u9ebc\u7528\u5462\uff1f

\u8207\u9806\u5e8f\u548c\u9006\u5e8f\u8d70\u8a2a\u9663\u5217\u985e\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u662f\u4e09\u7a2e\u4e8c\u5143\u6a39\u8d70\u8a2a\u65b9\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5b83\u5011\u5f97\u5230\u4e00\u500b\u7279\u5b9a\u9806\u5e8f\u7684\u8d70\u8a2a\u7d50\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\uff0c\u7531\u65bc\u7bc0\u9ede\u5927\u5c0f\u6eff\u8db3 \u5de6\u5b50\u7bc0\u9ede\u503c < \u6839\u7bc0\u9ede\u503c < \u53f3\u5b50\u7bc0\u9ede\u503c \uff0c\u56e0\u6b64\u6211\u5011\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u512a\u5148\u9806\u5e8f\u8d70\u8a2a\u6a39\uff0c\u5c31\u53ef\u4ee5\u7372\u5f97\u6709\u5e8f\u7684\u7bc0\u9ede\u5e8f\u5217\u3002

Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u8655\u7406\u5931\u8861\u7bc0\u9ede node\u3001child\u3001grand_child \u4e4b\u9593\u7684\u95dc\u4fc2\uff0c\u90a3 node \u7684\u7236\u7bc0\u9ede\u548c node \u539f\u4f86\u7684\u9023\u7dda\u4e0d\u9700\u8981\u7dad\u8b77\u55ce\uff1f\u53f3\u65cb\u64cd\u4f5c\u5f8c\u8c48\u4e0d\u662f\u65b7\u6389\u4e86\uff1f

\u6211\u5011\u9700\u8981\u5f9e\u905e\u8ff4\u7684\u8996\u89d2\u4f86\u770b\u9019\u500b\u554f\u984c\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u50b3\u5165\u7684\u662f\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u6700\u7d42 return child \u8fd4\u56de\u65cb\u8f49\u4e4b\u5f8c\u7684\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u548c\u5176\u7236\u7bc0\u9ede\u7684\u9023\u7dda\u662f\u5728\u8a72\u51fd\u5f0f\u8fd4\u56de\u5f8c\u5b8c\u6210\u7684\uff0c\u4e0d\u5c6c\u65bc\u53f3\u65cb\u64cd\u4f5c\u7684\u7dad\u8b77\u7bc4\u570d\u3002

Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u5f0f\u88ab\u5283\u5206\u5230 private \u548c public \u4e2d\uff0c\u9019\u65b9\u9762\u6709\u4ec0\u9ebc\u8003\u91cf\u55ce\uff1f\u70ba\u4ec0\u9ebc\u8981\u5c07 height() \u51fd\u5f0f\u548c updateHeight() \u51fd\u5f0f\u5206\u5225\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

\u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u7bc4\u570d\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u985e\u5225\u5167\u90e8\u4f7f\u7528\uff0c\u90a3\u9ebc\u5c31\u8a2d\u8a08\u70ba private \u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u8005\u55ae\u7368\u547c\u53eb updateHeight() \u662f\u6c92\u6709\u610f\u7fa9\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8a2a\u554f\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u985e\u4f3c\u65bc vector.size() \uff0c\u56e0\u6b64\u8a2d\u5b9a\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

Q\uff1a\u5982\u4f55\u5f9e\u4e00\u7d44\u8f38\u5165\u8cc7\u6599\u69cb\u5efa\u4e00\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\uff1f\u6839\u7bc0\u9ede\u7684\u9078\u64c7\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

\u662f\u7684\uff0c\u69cb\u5efa\u6a39\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7a0b\u5f0f\u78bc\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7d66\u51fa\u3002\u81f3\u65bc\u6839\u7bc0\u9ede\u7684\u9078\u64c7\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u8f38\u5165\u8cc7\u6599\u6392\u5e8f\uff0c\u7136\u5f8c\u5c07\u4e2d\u9ede\u5143\u7d20\u4f5c\u70ba\u6839\u7bc0\u9ede\uff0c\u518d\u905e\u8ff4\u5730\u69cb\u5efa\u5de6\u53f3\u5b50\u6a39\u3002\u9019\u6a23\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8b49\u6a39\u7684\u5e73\u8861\u6027\u3002

Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u4e32\u5c0d\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

\u5728 Java \u4e2d\uff0c\u5c0d\u65bc\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c== \u7528\u65bc\u5c0d\u6bd4\u5169\u500b\u8b8a\u6578\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5c0d\u65bc\u5f15\u7528\u578b\u5225\uff0c\u5169\u7a2e\u7b26\u865f\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

  • == \uff1a\u7528\u4f86\u6bd4\u8f03\u5169\u500b\u8b8a\u6578\u662f\u5426\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u5373\u5b83\u5011\u5728\u8a18\u61b6\u9ad4\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
  • equals()\uff1a\u7528\u4f86\u5c0d\u6bd4\u5169\u500b\u7269\u4ef6\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5c0d\u6bd4\u503c\uff0c\u6211\u5011\u61c9\u8a72\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u900f\u904e String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u4e32\u90fd\u5132\u5b58\u5728\u5b57\u4e32\u5e38\u6578\u6c60\u4e2d\uff0c\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u4f86\u6bd4\u8f03\u5169\u500b\u5b57\u4e32\u7684\u5167\u5bb9\u3002

Q\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u7684\u7bc0\u9ede\u6578\u91cf\u662f \\(2^h\\) \u55ce\uff1f

\u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6eff\u4e8c\u5143\u6a39\uff0c\u5176\u7bc0\u9ede\u7e3d\u6578 \\(n = 7\\) \uff0c\u5247\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"chapter_appendix/","title":"\u7b2c 16 \u7ae0 \u00a0 \u9644\u9304","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd
  • 16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c
  • 16.3 \u00a0 \u8853\u8a9e\u8868
"},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c","text":"

\u7531\u65bc\u7b46\u8005\u80fd\u529b\u6709\u9650\uff0c\u66f8\u4e2d\u96e3\u514d\u5b58\u5728\u4e00\u4e9b\u907a\u6f0f\u548c\u932f\u8aa4\uff0c\u8acb\u60a8\u8ad2\u89e3\u3002\u5982\u679c\u60a8\u767c\u73fe\u4e86\u7b46\u8aa4\u3001\u9023\u7d50\u5931\u6548\u3001\u5167\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u7fa9\u3001\u89e3\u91cb\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7d50\u69cb\u4e0d\u5408\u7406\u7b49\u554f\u984c\uff0c\u8acb\u5354\u52a9\u6211\u5011\u9032\u884c\u4fee\u6b63\uff0c\u4ee5\u7d66\u8b80\u8005\u63d0\u4f9b\u66f4\u512a\u8cea\u7684\u5b78\u7fd2\u8cc7\u6e90\u3002

\u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c07\u5728\u672c\u66f8\u5009\u5eab\u3001\u7db2\u9801\u7248\u548c PDF \u7248\u7684\u4e3b\u9801\u4e0a\u9032\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8b1d\u4ed6\u5011\u5c0d\u958b\u6e90\u793e\u7fa4\u7684\u7121\u79c1\u5949\u737b\u3002

\u958b\u6e90\u7684\u9b45\u529b

\u7d19\u8cea\u5716\u66f8\u7684\u5169\u6b21\u5370\u5237\u7684\u9593\u9694\u6642\u9593\u5f80\u5f80\u8f03\u4e45\uff0c\u5167\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

\u800c\u5728\u672c\u958b\u6e90\u66f8\u4e2d\uff0c\u5167\u5bb9\u66f4\u8fed\u7684\u6642\u9593\u88ab\u7e2e\u77ed\u81f3\u6578\u65e5\u751a\u81f3\u5e7e\u500b\u5c0f\u6642\u3002

"},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5167\u5bb9\u5fae\u8abf","text":"

\u5982\u5716 16-3 \u6240\u793a\uff0c\u6bcf\u500b\u9801\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7de8\u8f2f\u5716\u793a\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9a5f\u4fee\u6539\u6587\u5b57\u6216\u7a0b\u5f0f\u78bc\u3002

  1. \u9ede\u9078\u201c\u7de8\u8f2f\u5716\u793a\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u5009\u5eab\u201d\u7684\u63d0\u793a\uff0c\u8acb\u540c\u610f\u8a72\u64cd\u4f5c\u3002
  2. \u4fee\u6539 Markdown \u6e90\u6a94\u6848\u5167\u5bb9\uff0c\u6aa2\u67e5\u5167\u5bb9\u7684\u6b63\u78ba\u6027\uff0c\u4e26\u5118\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7d71\u4e00\u3002
  3. \u5728\u9801\u9762\u5e95\u90e8\u586b\u5beb\u4fee\u6539\u8aaa\u660e\uff0c\u7136\u5f8c\u9ede\u9078\u201cPropose file change\u201d\u6309\u9215\u3002\u9801\u9762\u8df3\u8f49\u5f8c\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002

\u5716 16-3 \u00a0 \u9801\u9762\u7de8\u8f2f\u6309\u9375

\u5716\u7247\u7121\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u900f\u904e\u65b0\u5efa Issue \u6216\u8a55\u8ad6\u7559\u8a00\u4f86\u63cf\u8ff0\u554f\u984c\uff0c\u6211\u5011\u6703\u76e1\u5feb\u91cd\u65b0\u7e6a\u88fd\u4e26\u66ff\u63db\u5716\u7247\u3002

"},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5167\u5bb9\u5275\u4f5c","text":"

\u5982\u679c\u60a8\u6709\u8208\u8da3\u53c3\u8207\u6b64\u958b\u6e90\u5c08\u6848\uff0c\u5305\u62ec\u5c07\u7a0b\u5f0f\u78bc\u7ffb\u8b6f\u6210\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u3001\u64f4\u5c55\u6587\u7ae0\u5167\u5bb9\u7b49\uff0c\u90a3\u9ebc\u9700\u8981\u5be6\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

  1. \u767b\u5165 GitHub \uff0c\u5c07\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5009\u5eab Fork \u5230\u500b\u4eba\u5e33\u865f\u4e0b\u3002
  2. \u9032\u5165\u60a8\u7684 Fork \u5009\u5eab\u7db2\u9801\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c07\u5009\u5eab\u514b\u9686\u81f3\u672c\u5730\u3002
  3. \u5728\u672c\u5730\u9032\u884c\u5167\u5bb9\u5275\u4f5c\uff0c\u4e26\u9032\u884c\u5b8c\u6574\u6e2c\u8a66\uff0c\u9a57\u8b49\u7a0b\u5f0f\u78bc\u7684\u6b63\u78ba\u6027\u3002
  4. \u5c07\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u5f8c Push \u81f3\u9060\u7aef\u5009\u5eab\u3002
  5. \u91cd\u65b0\u6574\u7406\u5009\u5eab\u7db2\u9801\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002
"},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

\u5728 hello-algo \u6839\u76ee\u9304\u4e0b\uff0c\u57f7\u884c\u4ee5\u4e0b Docker \u6307\u4ee4\u78bc\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8a2a\u554f\u672c\u5c08\u6848\uff1a

docker-compose up -d\n

\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u522a\u9664\u90e8\u7f72\uff1a

docker-compose down\n
"},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88dd IDE","text":"

\u63a8\u85a6\u4f7f\u7528\u958b\u6e90\u3001\u8f15\u91cf\u7684 VS Code \u4f5c\u70ba\u672c\u5730\u6574\u5408\u958b\u767c\u74b0\u5883\uff08IDE\uff09\u3002\u8a2a\u554f VS Code \u5b98\u7db2\uff0c\u6839\u64da\u4f5c\u696d\u7cfb\u7d71\u9078\u64c7\u76f8\u61c9\u7248\u672c\u7684 VS Code \u9032\u884c\u4e0b\u8f09\u548c\u5b89\u88dd\u3002

\u5716 16-1 \u00a0 \u5f9e\u5b98\u7db2\u4e0b\u8f09 VS Code

VS Code \u64c1\u6709\u5f37\u5927\u7684\u64f4\u5c55\u5305\u751f\u614b\u7cfb\u7d71\uff0c\u652f\u6301\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u7684\u57f7\u884c\u548c\u9664\u932f\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5b89\u88dd\u201cPython Extension Pack\u201d\u64f4\u5c55\u5305\u4e4b\u5f8c\uff0c\u5373\u53ef\u9032\u884c Python \u7a0b\u5f0f\u78bc\u9664\u932f\u3002\u5b89\u88dd\u6b65\u9a5f\u5982\u5716 16-2 \u6240\u793a\u3002

\u5716 16-2 \u00a0 \u5b89\u88dd VS Code \u64f4\u5c55\u5305

"},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88dd\u8a9e\u8a00\u74b0\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88dd Python Extension Pack \u3002
  3. \uff08\u53ef\u9078\uff09\u5728\u547d\u4ee4\u5217\u8f38\u5165 pip install black \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u74b0\u5883","text":"
  1. Windows \u7cfb\u7d71\u9700\u8981\u5b89\u88dd MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e36 Clang \uff0c\u7121\u9808\u5b89\u88dd\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88dd C/C++ Extension Pack \u3002
  3. \uff08\u53ef\u9078\uff09\u958b\u555f Settings \u9801\u9762\uff0c\u641c\u5c0b Clang_format_fallback Style \u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u9078\u9805\uff0c\u8a2d\u5b9a\u70ba { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
"},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd OpenJDK\uff08\u7248\u672c\u9700\u6eff\u8db3 > JDK 9\uff09\u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88dd Extension Pack for Java \u3002
"},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd .Net 8.0 \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88dd C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
  3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88dd\u6559\u7a0b\uff09\u3002
"},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd go \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88dd Go \u3002
  3. \u6309\u5feb\u6377\u9375 Ctrl + Shift + P \u64a5\u51fa\u547d\u4ee4\u6b04\uff0c\u8f38\u5165 go \uff0c\u9078\u64c7 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9078\u4e26\u5b89\u88dd\u5373\u53ef\u3002
"},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Swift \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88dd Swift for Visual Studio Code \u3002
"},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Node.js \u3002
  2. \uff08\u53ef\u9078\uff09\u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
"},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u74b0\u5883","text":"
  1. \u540c JavaScript \u74b0\u5883\u5b89\u88dd\u6b65\u9a5f\u3002
  2. \u5b89\u88dd TypeScript Execute (tsx) \u3002
  3. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88dd Pretty TypeScript Errors \u3002
"},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Dart \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88dd Dart \u3002
"},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u74b0\u5883","text":"
  1. \u4e0b\u8f09\u4e26\u5b89\u88dd Rust \u3002
  2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88dd rust-analyzer \u3002
"},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u8853\u8a9e\u8868","text":"

\u8868 16-1 \u5217\u51fa\u4e86\u66f8\u4e2d\u51fa\u73fe\u7684\u91cd\u8981\u8853\u8a9e\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u5e7e\u9ede\u3002

  • \u5efa\u8b70\u8a18\u4f4f\u540d\u8a5e\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u95b1\u8b80\u82f1\u6587\u6587\u737b\u3002
  • \u90e8\u5206\u540d\u8a5e\u5728\u7c21\u9ad4\u4e2d\u6587\u548c\u7e41\u9ad4\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

\u8868 16-1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8a5e

English \u7c21\u9ad4\u4e2d\u6587 \u7e41\u9ad4\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217","text":"

Abstract

\u8cc7\u6599\u7d50\u69cb\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5be6\u7684\u78da\u7246\u3002

\u9663\u5217\u7684\u78da\u584a\u6574\u9f4a\u6392\u5217\uff0c\u9010\u500b\u7dca\u8cbc\u3002\u93c8\u7d50\u4e32\u5217\u7684\u78da\u584a\u5206\u6563\u5404\u8655\uff0c\u9023\u7dda\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u65bc\u78da\u7e2b\u4e4b\u9593\u3002

"},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 4.1 \u00a0 \u9663\u5217
  • 4.2 \u00a0 \u93c8\u7d50\u4e32\u5217
  • 4.3 \u00a0 \u4e32\u5217
  • 4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *
  • 4.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u9663\u5217","text":"

\u9663\u5217\uff08array\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5c07\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\u3002\u6211\u5011\u5c07\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u4f4d\u7f6e\u7a31\u70ba\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u5716 4-1 \u5c55\u793a\u4e86\u9663\u5217\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5132\u5b58\u65b9\u5f0f\u3002

\u5716 4-1 \u00a0 \u9663\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

"},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u9663\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u9663\u5217","text":"

\u6211\u5011\u53ef\u4ee5\u6839\u64da\u9700\u6c42\u9078\u7528\u9663\u5217\u7684\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u7121\u521d\u59cb\u503c\u3001\u7d66\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u6cc1\u4e0b\uff0c\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u6703\u5c07\u9663\u5217\u5143\u7d20\u521d\u59cb\u5316\u70ba \\(0\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
# \u521d\u59cb\u5316\u9663\u5217\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
array.cpp
/* \u521d\u59cb\u5316\u9663\u5217 */\n// \u5132\u5b58\u5728\u5806\u758a\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff08\u9700\u8981\u624b\u52d5\u91cb\u653e\u7a7a\u9593\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
array.java
/* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
array.cs
/* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
array.go
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[5]int\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08[]int\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Go \u7684\u9663\u5217\u88ab\u8a2d\u8a08\u70ba\u5728\u7de8\u8b6f\u671f\u78ba\u5b9a\u9577\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u6578\u4f86\u6307\u5b9a\u9577\u5ea6\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u9663\u5217\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
array.swift
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
array.js
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
array.ts
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
array.dart
/* \u521d\u59cb\u5316\u9663\u5217 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
array.rs
/* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
array.c
/* \u521d\u59cb\u5316\u9663\u5217 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
array.kt
/* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
array.rb
# \u521d\u59cb\u5316\u9663\u5217\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
array.zig
// \u521d\u59cb\u5316\u9663\u5217\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8a2a\u554f\u5143\u7d20","text":"

\u9663\u5217\u5143\u7d20\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u9019\u610f\u5473\u8457\u8a08\u7b97\u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7d66\u5b9a\u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09\u548c\u67d0\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5716 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8a08\u7b97\u5f97\u5230\u8a72\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u76f4\u63a5\u8a2a\u554f\u8a72\u5143\u7d20\u3002

\u5716 4-2 \u00a0 \u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a08\u7b97

\u89c0\u5bdf\u5716 4-2 \uff0c\u6211\u5011\u767c\u73fe\u9663\u5217\u9996\u500b\u5143\u7d20\u7684\u7d22\u5f15\u70ba \\(0\\) \uff0c\u9019\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\u6703\u66f4\u81ea\u7136\u3002\u4f46\u5f9e\u4f4d\u5740\u8a08\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8cea\u4e0a\u662f\u8a18\u61b6\u9ad4\u4f4d\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u500b\u5143\u7d20\u7684\u4f4d\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u70ba \\(0\\) \u662f\u5408\u7406\u7684\u3002

\u5728\u9663\u5217\u4e2d\u8a2a\u554f\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u96a8\u6a5f\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def random_access(nums: list[int]) -> int:\n    \"\"\"\u96a8\u6a5f\u8a2a\u554f\u5143\u7d20\"\"\"\n    # \u5728\u5340\u9593 [0, len(nums)-1] \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
array.cpp
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u5340\u9593 [0, size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = rand() % size;\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.java
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.cs
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u5340\u9593 [0, nums.Length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.go
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
array.swift
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u5340\u9593 [0, nums.count) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.js
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.ts
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
array.dart
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
array.rs
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u5340\u9593 [0, nums.len()) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
array.c
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u5340\u9593 [0, size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    int randomIndex = rand() % size;\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
array.kt
/* \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u5340\u9593 [0, nums.size) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
array.rb
### \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u5340\u9593 [0, nums.length) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6578\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n  nums[random_index]\nend\n
array.zig
// \u96a8\u6a5f\u8a2a\u554f\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u5340\u9593 [0, nums.len) \u4e2d\u96a8\u6a5f\u62bd\u53d6\u4e00\u500b\u6574\u6578\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u7372\u53d6\u4e26\u8fd4\u56de\u96a8\u6a5f\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

\u9663\u5217\u5143\u7d20\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u201c\u7dca\u6328\u8457\u7684\u201d\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u7a7a\u9593\u518d\u5b58\u653e\u4efb\u4f55\u8cc7\u6599\u3002\u5982\u5716 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u9663\u5217\u4e2d\u9593\u63d2\u5165\u4e00\u500b\u5143\u7d20\uff0c\u5247\u9700\u8981\u5c07\u8a72\u5143\u7d20\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u4e4b\u5f8c\u518d\u628a\u5143\u7d20\u8ce6\u503c\u7d66\u8a72\u7d22\u5f15\u3002

\u5716 4-3 \u00a0 \u9663\u5217\u63d2\u5165\u5143\u7d20\u793a\u4f8b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u6703\u5c0e\u81f4\u9663\u5217\u5c3e\u90e8\u5143\u7d20\u201c\u4e1f\u5931\u201d\u3002\u6211\u5011\u5c07\u9019\u500b\u554f\u984c\u7684\u89e3\u6c7a\u65b9\u6848\u7559\u5728\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u4e2d\u8a0e\u8ad6\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n
array.cpp
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.java
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.cs
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.go
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.swift
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.js
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.ts
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.dart
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c07 _num \u8ce6\u7d66 index \u8655\u5143\u7d20\n  nums[index] = _num;\n}\n
array.rs
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut Vec<i32>, num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.c
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
array.kt
/* \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num\n}\n
array.rb
### \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n  nums[index] = num\nend\n
array.zig
// \u5728\u9663\u5217\u7684\u7d22\u5f15 index \u8655\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c07 num \u8ce6\u7d66 index \u8655\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u522a\u9664\u5143\u7d20","text":"

\u540c\u7406\uff0c\u5982\u5716 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u522a\u9664\u7d22\u5f15 \\(i\\) \u8655\u7684\u5143\u7d20\uff0c\u5247\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\u3002

\u5716 4-4 \u00a0 \u9663\u5217\u522a\u9664\u5143\u7d20\u793a\u4f8b

\u8acb\u6ce8\u610f\uff0c\u522a\u9664\u5143\u7d20\u5b8c\u6210\u5f8c\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u8b8a\u5f97\u201c\u7121\u610f\u7fa9\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u5011\u7121\u9808\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def remove(nums: list[int], index: int):\n    \"\"\"\u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
array.cpp
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.java
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.cs
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.go
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
array.swift
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.js
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.ts
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.dart
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
array.rs
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfn remove(nums: &mut Vec<i32>, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.c
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
array.kt
/* \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
array.rb
### \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
array.zig
// \u522a\u9664\u7d22\u5f15 index \u8655\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u7684\u4f86\u770b\uff0c\u9663\u5217\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u9ede\u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u9ad8\uff1a\u9663\u5217\u7684\u63d2\u5165\u548c\u522a\u9664\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u9577\u5ea6\u3002
  • \u4e1f\u5931\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u5f8c\uff0c\u8d85\u51fa\u9663\u5217\u9577\u5ea6\u7bc4\u570d\u7684\u5143\u7d20\u6703\u4e1f\u5931\u3002
  • \u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff1a\u6211\u5011\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u500b\u6bd4\u8f03\u9577\u7684\u9663\u5217\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u9019\u6a23\u5728\u63d2\u5165\u8cc7\u6599\u6642\uff0c\u4e1f\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u7121\u610f\u7fa9\u201d\u7684\uff0c\u4f46\u9019\u6a23\u505a\u6703\u9020\u6210\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
"},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u8d70\u8a2a\u9663\u5217","text":"

\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u65e2\u53ef\u4ee5\u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u7372\u53d6\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def traverse(nums: list[int]):\n    \"\"\"\u8d70\u8a2a\u9663\u5217\"\"\"\n    count = 0\n    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
array.cpp
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.java
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
array.cs
/* \u8d70\u8a2a\u9663\u5217 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
array.go
/* \u8d70\u8a2a\u9663\u5217 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
array.swift
/* \u8d70\u8a2a\u9663\u5217 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u6642\u8d70\u8a2a\u8cc7\u6599\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
array.js
/* \u8d70\u8a2a\u9663\u5217 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.ts
/* \u8d70\u8a2a\u9663\u5217 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
array.dart
/* \u8d70\u8a2a\u9663\u5217\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u900f\u904e forEach \u65b9\u6cd5\u8d70\u8a2a\u9663\u5217\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
array.rs
/* \u8d70\u8a2a\u9663\u5217 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
array.c
/* \u8d70\u8a2a\u9663\u5217 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
array.kt
/* \u8d70\u8a2a\u9663\u5217 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
array.rb
### \u8d70\u8a2a\u9663\u5217 ###\ndef traverse(nums)\n  count = 0\n\n  # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
array.zig
// \u8d70\u8a2a\u9663\u5217\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u8a62\u5143\u7d20","text":"

\u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\u9700\u8981\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u5224\u65b7\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5247\u8f38\u51fa\u5c0d\u61c9\u7d22\u5f15\u3002

\u56e0\u70ba\u9663\u5217\u662f\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u8a62\u64cd\u4f5c\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u67e5\u8a62\u201d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
array.cpp
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.java
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.cs
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.go
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
array.swift
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
array.js
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
array.ts
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
array.dart
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
array.rs
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
array.c
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
array.kt
/* \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
array.rb
### \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
array.zig
// \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u64f4\u5bb9\u9663\u5217","text":"

\u5728\u8907\u96dc\u7684\u7cfb\u7d71\u74b0\u5883\u4e2d\uff0c\u7a0b\u5f0f\u96e3\u4ee5\u4fdd\u8b49\u9663\u5217\u4e4b\u5f8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u53ef\u7528\u7684\uff0c\u5f9e\u800c\u7121\u6cd5\u5b89\u5168\u5730\u64f4\u5c55\u9663\u5217\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u9663\u5217\u7684\u9577\u5ea6\u662f\u4e0d\u53ef\u8b8a\u7684\u3002

\u5982\u679c\u6211\u5011\u5e0c\u671b\u64f4\u5bb9\u9663\u5217\uff0c\u5247\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u7136\u5f8c\u628a\u539f\u9663\u5217\u5143\u7d20\u4f9d\u6b21\u8907\u88fd\u5230\u65b0\u9663\u5217\u3002\u9019\u662f\u4e00\u500b \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u9663\u5217\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\u975e\u5e38\u8017\u6642\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u64f4\u5c55\u9663\u5217\u9577\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res = [0] * (len(nums) + enlarge)\n    # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n
array.cpp
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = new int[size + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete[] nums;\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.java
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.cs
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.go
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res := make([]int, len(nums)+enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.swift
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.js
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.ts
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.dart
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  return res;\n}\n
array.rs
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    res\n}\n
array.c
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u64f4\u5c55\u5f8c\u7684\u7a7a\u9593\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
array.kt
/* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    val res = IntArray(nums.size + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
array.rb
### \u64f4\u5c55\u9663\u5217\u9577\u5ea6 ###\n# \u8acb\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n# \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  res\nend\n
array.zig
// \u64f4\u5c55\u9663\u5217\u9577\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u9663\u5217\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u4e14\u5143\u7d20\u578b\u5225\u76f8\u540c\u3002\u9019\u7a2e\u505a\u6cd5\u5305\u542b\u8c50\u5bcc\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u7cfb\u7d71\u53ef\u4ee5\u5229\u7528\u9019\u4e9b\u8cc7\u8a0a\u4f86\u6700\u4f73\u5316\u8cc7\u6599\u7d50\u69cb\u7684\u64cd\u4f5c\u6548\u7387\u3002

  • \u7a7a\u9593\u6548\u7387\u9ad8\uff1a\u9663\u5217\u70ba\u8cc7\u6599\u5206\u914d\u4e86\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u584a\uff0c\u7121\u9808\u984d\u5916\u7684\u7d50\u69cb\u958b\u92b7\u3002
  • \u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff1a\u9663\u5217\u5141\u8a31\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u4efb\u4f55\u5143\u7d20\u3002
  • \u5feb\u53d6\u5340\u57df\u6027\uff1a\u7576\u8a2a\u554f\u9663\u5217\u5143\u7d20\u6642\uff0c\u8a08\u7b97\u6a5f\u4e0d\u50c5\u6703\u8f09\u5165\u5b83\uff0c\u9084\u6703\u5feb\u53d6\u5176\u5468\u570d\u7684\u5176\u4ed6\u8cc7\u6599\uff0c\u5f9e\u800c\u85c9\u52a9\u9ad8\u901f\u5feb\u53d6\u4f86\u63d0\u5347\u5f8c\u7e8c\u64cd\u4f5c\u7684\u57f7\u884c\u901f\u5ea6\u3002

\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u662f\u4e00\u628a\u96d9\u5203\u528d\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

  • \u63d2\u5165\u8207\u522a\u9664\u6548\u7387\u4f4e\uff1a\u7576\u9663\u5217\u4e2d\u5143\u7d20\u8f03\u591a\u6642\uff0c\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52d5\u5927\u91cf\u7684\u5143\u7d20\u3002
  • \u9577\u5ea6\u4e0d\u53ef\u8b8a\uff1a\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u64f4\u5bb9\u9663\u5217\u9700\u8981\u5c07\u6240\u6709\u8cc7\u6599\u8907\u88fd\u5230\u65b0\u9663\u5217\uff0c\u958b\u92b7\u5f88\u5927\u3002
  • \u7a7a\u9593\u6d6a\u8cbb\uff1a\u5982\u679c\u9663\u5217\u5206\u914d\u7684\u5927\u5c0f\u8d85\u904e\u5be6\u969b\u6240\u9700\uff0c\u90a3\u9ebc\u591a\u9918\u7684\u7a7a\u9593\u5c31\u88ab\u6d6a\u8cbb\u4e86\u3002
"},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u9663\u5217\u5178\u578b\u61c9\u7528","text":"

\u9663\u5217\u662f\u4e00\u7a2e\u57fa\u790e\u4e14\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u65e2\u983b\u7e41\u61c9\u7528\u5728\u5404\u985e\u6f14\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u65bc\u5be6\u73fe\u5404\u7a2e\u8907\u96dc\u8cc7\u6599\u7d50\u69cb\u3002

  • \u96a8\u6a5f\u8a2a\u554f\uff1a\u5982\u679c\u6211\u5011\u60f3\u96a8\u6a5f\u62bd\u53d6\u4e00\u4e9b\u6a23\u672c\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7528\u9663\u5217\u5132\u5b58\uff0c\u4e26\u751f\u6210\u4e00\u500b\u96a8\u6a5f\u5e8f\u5217\uff0c\u6839\u64da\u7d22\u5f15\u5be6\u73fe\u96a8\u6a5f\u62bd\u6a23\u3002
  • \u6392\u5e8f\u548c\u641c\u5c0b\uff1a\u9663\u5217\u662f\u6392\u5e8f\u548c\u641c\u5c0b\u6f14\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u4e8c\u5206\u641c\u5c0b\u7b49\u90fd\u4e3b\u8981\u5728\u9663\u5217\u4e0a\u9032\u884c\u3002
  • \u67e5\u8a62\u8868\uff1a\u7576\u9700\u8981\u5feb\u901f\u67e5\u8a62\u4e00\u500b\u5143\u7d20\u6216\u5176\u5c0d\u61c9\u95dc\u4fc2\u6642\uff0c\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u4f5c\u70ba\u67e5\u8a62\u8868\u3002\u5047\u5982\u6211\u5011\u60f3\u5be6\u73fe\u5b57\u5143\u5230 ASCII \u78bc\u7684\u5c0d\u6620\uff0c\u5247\u53ef\u4ee5\u5c07\u5b57\u5143\u7684 ASCII \u78bc\u503c\u4f5c\u70ba\u7d22\u5f15\uff0c\u5c0d\u61c9\u7684\u5143\u7d20\u5b58\u653e\u5728\u9663\u5217\u4e2d\u7684\u5c0d\u61c9\u4f4d\u7f6e\u3002
  • \u6a5f\u5668\u5b78\u7fd2\uff1a\u795e\u7d93\u7db2\u8def\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9663\u3001\u5f35\u91cf\u4e4b\u9593\u7684\u7dda\u6027\u4ee3\u6578\u904b\u7b97\uff0c\u9019\u4e9b\u8cc7\u6599\u90fd\u662f\u4ee5\u9663\u5217\u7684\u5f62\u5f0f\u69cb\u5efa\u7684\u3002\u9663\u5217\u662f\u795e\u7d93\u7db2\u8def\u7a0b\u5f0f\u8a2d\u8a08\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff1a\u9663\u5217\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002\u4f8b\u5982\uff0c\u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a\u5be6\u969b\u4e0a\u662f\u4e00\u500b\u4e8c\u7dad\u9663\u5217\u3002
"},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u93c8\u7d50\u4e32\u5217","text":"

\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u516c\u5171\u8cc7\u6e90\uff0c\u5728\u4e00\u500b\u8907\u96dc\u7684\u7cfb\u7d71\u57f7\u884c\u74b0\u5883\u4e0b\uff0c\u7a7a\u9592\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u80fd\u6563\u843d\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u6211\u5011\u77e5\u9053\uff0c\u5132\u5b58\u9663\u5217\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5fc5\u9808\u662f\u9023\u7e8c\u7684\uff0c\u800c\u7576\u9663\u5217\u975e\u5e38\u5927\u6642\uff0c\u8a18\u61b6\u9ad4\u53ef\u80fd\u7121\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u9023\u7e8c\u7a7a\u9593\u3002\u6b64\u6642\u93c8\u7d50\u4e32\u5217\u7684\u9748\u6d3b\u6027\u512a\u52e2\u5c31\u9ad4\u73fe\u51fa\u4f86\u4e86\u3002

\u93c8\u7d50\u4e32\u5217\uff08linked list\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u662f\u4e00\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u5404\u500b\u7bc0\u9ede\u900f\u904e\u201c\u5f15\u7528\u201d\u76f8\u9023\u7dda\u3002\u5f15\u7528\u8a18\u9304\u4e86\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u900f\u904e\u5b83\u53ef\u4ee5\u5f9e\u7576\u524d\u7bc0\u9ede\u8a2a\u554f\u5230\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002

\u93c8\u7d50\u4e32\u5217\u7684\u8a2d\u8a08\u4f7f\u5f97\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u5b83\u5011\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

\u5716 4-5 \u00a0 \u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

\u89c0\u5bdf\u5716 4-5 \uff0c\u93c8\u7d50\u4e32\u5217\u7684\u7d44\u6210\u55ae\u4f4d\u662f\u7bc0\u9ede\uff08node\uff09\u7269\u4ef6\u3002\u6bcf\u500b\u7bc0\u9ede\u90fd\u5305\u542b\u5169\u9805\u8cc7\u6599\uff1a\u7bc0\u9ede\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u201c\u5f15\u7528\u201d\u3002

  • \u93c8\u7d50\u4e32\u5217\u7684\u9996\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u982d\u7bc0\u9ede\u201d\uff0c\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u5c3e\u7bc0\u9ede\u201d\u3002
  • \u5c3e\u7bc0\u9ede\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u5225\u88ab\u8a18\u70ba null\u3001nullptr \u548c None \u3002
  • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u6a19\u7684\u8a9e\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u61c9\u88ab\u66ff\u63db\u70ba\u201c\u6307\u6a19\u201d\u3002

\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u9084\u9700\u984d\u5916\u5132\u5b58\u4e00\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u8cc7\u6599\u91cf\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u6bd4\u9663\u5217\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  //\u5efa\u69cb\u5b50\n    int val = x;         // \u7bc0\u9ede\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype ListNode struct {\n    Val  int       // \u7bc0\u9ede\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewListNode \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u93c8\u7d50\u4e32\u5217\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u7bc0\u9ede\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u5efa\u69cb\u5b50\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u7bc0\u9ede\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
# \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val  # \u7bc0\u9ede\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
// \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
"},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u93c8\u7d50\u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217","text":"

\u5efa\u7acb\u93c8\u7d50\u4e32\u5217\u5206\u70ba\u5169\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u7b2c\u4e8c\u6b65\u662f\u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\u95dc\u4fc2\u3002\u521d\u59cb\u5316\u5b8c\u6210\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f9e\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u900f\u904e\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8a2a\u554f\u6240\u6709\u7bc0\u9ede\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
# \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.cpp
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.java
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.cs
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.go
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
linked_list.swift
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.js
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.ts
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.dart
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rs
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
linked_list.c
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
linked_list.kt
/* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
linked_list.rb
# \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
linked_list.zig
// \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9663\u5217\u6574\u9ad4\u662f\u4e00\u500b\u8b8a\u6578\uff0c\u6bd4\u5982\u9663\u5217 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u7531\u591a\u500b\u7368\u7acb\u7684\u7bc0\u9ede\u7269\u4ef6\u7d44\u6210\u7684\u3002\u6211\u5011\u901a\u5e38\u5c07\u982d\u7bc0\u9ede\u7576\u4f5c\u93c8\u7d50\u4e32\u5217\u7684\u4ee3\u7a31\uff0c\u6bd4\u5982\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u53ef\u8a18\u4f5c\u93c8\u7d50\u4e32\u5217 n0 \u3002

"},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u7bc0\u9ede\u975e\u5e38\u5bb9\u6613\u3002\u5982\u5716 4-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u60f3\u5728\u76f8\u9130\u7684\u5169\u500b\u7bc0\u9ede n0 \u548c n1 \u4e4b\u9593\u63d2\u5165\u4e00\u500b\u65b0\u7bc0\u9ede P \uff0c\u5247\u53ea\u9700\u6539\u8b8a\u5169\u500b\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u9663\u5217\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6548\u7387\u8f03\u4f4e\u3002

\u5716 4-6 \u00a0 \u93c8\u7d50\u4e32\u5217\u63d2\u5165\u7bc0\u9ede\u793a\u4f8b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
linked_list.cpp
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.java
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.cs
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.go
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
linked_list.swift
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
linked_list.js
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.ts
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
linked_list.dart
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
linked_list.rs
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
linked_list.c
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
linked_list.kt
/* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
linked_list.rb
### \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u500b\u5167\u5efa\u51fd\u5f0f\uff0c `P` \u662f\u4e00\u500b\u5e38\u6578\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
linked_list.zig
// \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u5982\u5716 4-7 \u6240\u793a\uff0c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u7bc0\u9ede\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u8b8a\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u3002

\u8acb\u6ce8\u610f\uff0c\u5118\u7ba1\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\u7bc0\u9ede P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5be6\u969b\u4e0a\u8d70\u8a2a\u6b64\u93c8\u7d50\u4e32\u5217\u5df2\u7d93\u7121\u6cd5\u8a2a\u554f\u5230 P \uff0c\u9019\u610f\u5473\u8457 P \u5df2\u7d93\u4e0d\u518d\u5c6c\u65bc\u8a72\u93c8\u7d50\u4e32\u5217\u4e86\u3002

\u5716 4-7 \u00a0 \u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def remove(n0: ListNode):\n    \"\"\"\u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
linked_list.cpp
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete P;\n}\n
linked_list.java
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.cs
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.go
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
linked_list.swift
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
linked_list.js
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.ts
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
linked_list.dart
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
linked_list.rs
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
linked_list.c
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(P);\n}\n
linked_list.kt
/* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
linked_list.rb
### \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
linked_list.zig
// \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8a2a\u554f\u7bc0\u9ede","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u8a2a\u554f\u7bc0\u9ede\u7684\u6548\u7387\u8f03\u4f4e\u3002\u5982\u4e0a\u4e00\u7bc0\u6240\u8ff0\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u4e0b\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u93c8\u7d50\u4e32\u5217\u5247\u4e0d\u7136\uff0c\u7a0b\u5f0f\u9700\u8981\u5f9e\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u9010\u500b\u5411\u5f8c\u8d70\u8a2a\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u7684\u7b2c \\(i\\) \u500b\u7bc0\u9ede\u9700\u8981\u8ff4\u5708 \\(i - 1\\) \u8f2a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
linked_list.cpp
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.java
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.cs
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.go
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
linked_list.swift
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
linked_list.js
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.ts
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
linked_list.dart
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
linked_list.rs
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
linked_list.c
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
linked_list.kt
/* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
linked_list.rb
### \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
linked_list.zig
// \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u67e5\u8a62\u5176\u4e2d\u503c\u70ba target \u7684\u7bc0\u9ede\uff0c\u8f38\u51fa\u8a72\u7bc0\u9ede\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u904e\u7a0b\u4e5f\u5c6c\u65bc\u7dda\u6027\u67e5\u8a62\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
linked_list.cpp
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.java
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.cs
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.go
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
linked_list.swift
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
linked_list.js
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.ts
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
linked_list.dart
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
linked_list.rs
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
linked_list.c
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
linked_list.kt
/* \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
linked_list.rb
### \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
linked_list.zig
// \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u9663\u5217 vs. \u93c8\u7d50\u4e32\u5217","text":"

\u8868 4-1 \u7e3d\u7d50\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7684\u5404\u9805\u7279\u9ede\u4e26\u5c0d\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u65bc\u5b83\u5011\u63a1\u7528\u5169\u7a2e\u76f8\u53cd\u7684\u5132\u5b58\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u7a2e\u6027\u8cea\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73fe\u5c0d\u7acb\u7684\u7279\u9ede\u3002

\u8868 4-1 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217\u7684\u6548\u7387\u5c0d\u6bd4

\u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u5132\u5b58\u65b9\u5f0f \u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5206\u6563\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5bb9\u91cf\u64f4\u5c55 \u9577\u5ea6\u4e0d\u53ef\u8b8a \u53ef\u9748\u6d3b\u64f4\u5c55 \u8a18\u61b6\u9ad4\u6548\u7387 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8cbb\u7a7a\u9593 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u591a \u8a2a\u554f\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u65b0\u589e\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u578b\u5225","text":"

\u5982\u5716 4-8 \u6240\u793a\uff0c\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u4e09\u7a2e\u3002

  • \u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u5373\u524d\u9762\u4ecb\u7d39\u7684\u666e\u901a\u93c8\u7d50\u4e32\u5217\u3002\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\u5169\u9805\u8cc7\u6599\u3002\u6211\u5011\u5c07\u9996\u500b\u7bc0\u9ede\u7a31\u70ba\u982d\u7bc0\u9ede\uff0c\u5c07\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7a31\u70ba\u5c3e\u7bc0\u9ede\uff0c\u5c3e\u7bc0\u9ede\u6307\u5411\u7a7a None \u3002
  • \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff1a\u5982\u679c\u6211\u5011\u4ee4\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5c3e\u7bc0\u9ede\u6307\u5411\u982d\u7bc0\u9ede\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5247\u5f97\u5230\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u5728\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u4efb\u610f\u7bc0\u9ede\u90fd\u53ef\u4ee5\u8996\u4f5c\u982d\u7bc0\u9ede\u3002
  • \u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u8207\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u76f8\u6bd4\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u8a18\u9304\u4e86\u5169\u500b\u65b9\u5411\u7684\u5f15\u7528\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5b9a\u7fa9\u540c\u6642\u5305\u542b\u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\uff08\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\u548c\u524d\u9a45\u7bc0\u9ede\uff08\u4e0a\u4e00\u500b\u7bc0\u9ede\uff09\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u76f8\u8f03\u65bc\u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u66f4\u5177\u9748\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u5169\u500b\u65b9\u5411\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u76f8\u61c9\u5730\u4e5f\u9700\u8981\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode *prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  // \u5efa\u69cb\u5b50\n    int val = x;    // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype DoublyListNode struct {\n    Val  int             // \u7bc0\u9ede\u503c\n    Next *DoublyListNode // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u5efa\u69cb\u5b50\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u578b\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n/* \u5efa\u69cb\u5b50 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u7bc0\u9ede\u503c\n    val next: ListNode? = null  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
# \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :next   # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
// \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

\u5716 4-8 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u7a2e\u985e

"},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u93c8\u7d50\u4e32\u5217\u5178\u578b\u61c9\u7528","text":"

\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u548c\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002

  • \u5806\u758a\u8207\u4f47\u5217\uff1a\u7576\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u90fd\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\u6642\uff0c\u5b83\u8868\u73fe\u7684\u7279\u6027\u70ba\u5148\u9032\u5f8c\u51fa\uff0c\u5c0d\u61c9\u5806\u758a\uff1b\u7576\u63d2\u5165\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\uff0c\u522a\u9664\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u53e6\u4e00\u7aef\u9032\u884c\uff0c\u5b83\u8868\u73fe\u7684\u7279\u6027\u70ba\u5148\u9032\u5148\u51fa\uff0c\u5c0d\u61c9\u4f47\u5217\u3002
  • \u96dc\u6e4a\u8868\uff1a\u93c8\u5f0f\u4f4d\u5740\u662f\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8a72\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u885d\u7a81\u7684\u5143\u7d20\u90fd\u6703\u88ab\u653e\u5230\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
  • \u5716\uff1a\u9130\u63a5\u8868\u662f\u8868\u793a\u5716\u7684\u4e00\u7a2e\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u5716\u7684\u6bcf\u500b\u9802\u9ede\u90fd\u8207\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u76f8\u95dc\u806f\uff0c\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u4ee3\u8868\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u5176\u4ed6\u9802\u9ede\u3002

\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u5feb\u901f\u67e5\u8a62\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u5143\u7d20\u7684\u5834\u666f\u3002

  • \u9ad8\u968e\u8cc7\u6599\u7d50\u69cb\uff1a\u6bd4\u5982\u5728\u7d05\u9ed1\u6a39\u3001B \u6a39\u4e2d\uff0c\u6211\u5011\u9700\u8981\u8a2a\u554f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5728\u7bc0\u9ede\u4e2d\u5132\u5b58\u4e00\u500b\u6307\u5411\u7236\u7bc0\u9ede\u7684\u5f15\u7528\u4f86\u5be6\u73fe\uff0c\u985e\u4f3c\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
  • \u700f\u89bd\u5668\u6b77\u53f2\uff1a\u5728\u7db2\u9801\u700f\u89bd\u5668\u4e2d\uff0c\u7576\u7528\u6236\u9ede\u9078\u524d\u9032\u6216\u5f8c\u9000\u6309\u9215\u6642\uff0c\u700f\u89bd\u5668\u9700\u8981\u77e5\u9053\u4f7f\u7528\u8005\u8a2a\u554f\u904e\u7684\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u7db2\u9801\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7279\u6027\u4f7f\u5f97\u9019\u7a2e\u64cd\u4f5c\u8b8a\u5f97\u7c21\u55ae\u3002
  • LRU \u6f14\u7b97\u6cd5\uff1a\u5728\u5feb\u53d6\u6dd8\u6c70\uff08LRU\uff09\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u3002\u9019\u6642\u5019\u4f7f\u7528\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5c31\u975e\u5e38\u5408\u9069\u3002

\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u9031\u671f\u6027\u64cd\u4f5c\u7684\u5834\u666f\uff0c\u6bd4\u5982\u4f5c\u696d\u7cfb\u7d71\u7684\u8cc7\u6e90\u6392\u7a0b\u3002

  • \u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\uff1a\u5728\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\u662f\u4e00\u7a2e\u5e38\u898b\u7684 CPU \u6392\u7a0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5c0d\u4e00\u7d44\u7a0b\u5e8f\u9032\u884c\u8ff4\u5708\u3002\u6bcf\u500b\u7a0b\u5e8f\u88ab\u8ce6\u4e88\u4e00\u500b\u6642\u9593\u7247\uff0c\u7576\u6642\u9593\u7247\u7528\u5b8c\u6642\uff0cCPU \u5c07\u5207\u63db\u5230\u4e0b\u4e00\u500b\u7a0b\u5e8f\u3002\u9019\u7a2e\u8ff4\u5708\u64cd\u4f5c\u53ef\u4ee5\u900f\u904e\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
  • \u8cc7\u6599\u7de9\u885d\u5340\uff1a\u5728\u67d0\u4e9b\u8cc7\u6599\u7de9\u885d\u5340\u7684\u5be6\u73fe\u4e2d\uff0c\u4e5f\u53ef\u80fd\u6703\u4f7f\u7528\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u6bd4\u5982\u5728\u97f3\u8a0a\u3001\u5f71\u7247\u64ad\u653e\u5668\u4e2d\uff0c\u8cc7\u6599\u6d41\u53ef\u80fd\u6703\u88ab\u5206\u6210\u591a\u500b\u7de9\u885d\u584a\u4e26\u653e\u5165\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff0c\u4ee5\u4fbf\u5be6\u73fe\u7121\u7e2b\u64ad\u653e\u3002
"},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u4e32\u5217","text":"

\u4e32\u5217\uff08list\uff09\u662f\u4e00\u500b\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8a2a\u554f\u3001\u4fee\u6539\u3001\u65b0\u589e\u3001\u522a\u9664\u548c\u8d70\u8a2a\u7b49\u64cd\u4f5c\uff0c\u7121\u9808\u4f7f\u7528\u8005\u8003\u616e\u5bb9\u91cf\u9650\u5236\u7684\u554f\u984c\u3002\u4e32\u5217\u53ef\u4ee5\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u5be6\u73fe\u3002

  • \u93c8\u7d50\u4e32\u5217\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u4e32\u5217\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\u64cd\u4f5c\uff0c\u4e26\u4e14\u53ef\u4ee5\u9748\u6d3b\u52d5\u614b\u64f4\u5bb9\u3002
  • \u9663\u5217\u4e5f\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\uff0c\u4f46\u7531\u65bc\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u500b\u5177\u6709\u9577\u5ea6\u9650\u5236\u7684\u4e32\u5217\u3002

\u7576\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u4e32\u5217\u6642\uff0c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u6027\u8cea\u6703\u5c0e\u81f4\u4e32\u5217\u7684\u5be6\u7528\u6027\u964d\u4f4e\u3002\u9019\u662f\u56e0\u70ba\u6211\u5011\u901a\u5e38\u7121\u6cd5\u4e8b\u5148\u78ba\u5b9a\u9700\u8981\u5132\u5b58\u591a\u5c11\u8cc7\u6599\uff0c\u5f9e\u800c\u96e3\u4ee5\u9078\u64c7\u5408\u9069\u7684\u4e32\u5217\u9577\u5ea6\u3002\u82e5\u9577\u5ea6\u904e\u5c0f\uff0c\u5247\u5f88\u53ef\u80fd\u7121\u6cd5\u6eff\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u9577\u5ea6\u904e\u5927\uff0c\u5247\u6703\u9020\u6210\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002

\u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff08dynamic array\uff09\u4f86\u5be6\u73fe\u4e32\u5217\u3002\u5b83\u7e7c\u627f\u4e86\u9663\u5217\u7684\u5404\u9805\u512a\u9ede\uff0c\u4e26\u4e14\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u9032\u884c\u52d5\u614b\u64f4\u5bb9\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u6a19\u6e96\u5eab\u63d0\u4f9b\u7684\u4e32\u5217\u662f\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u4f86\u7684\u8a0e\u8ad6\u4e2d\uff0c\u6211\u5011\u5c07\u628a\u201c\u4e32\u5217\u201d\u548c\u201c\u52d5\u614b\u9663\u5217\u201d\u8996\u70ba\u7b49\u540c\u7684\u6982\u5ff5\u3002

"},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e32\u5217","text":"

\u6211\u5011\u901a\u5e38\u4f7f\u7528\u201c\u7121\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u9019\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
list.cpp
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u7121\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
list.java
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u9663\u5217\u7684\u5143\u7d20\u578b\u5225\u9700\u70ba int[] \u7684\u5305\u88dd\u985e\u5225 Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
list.cs
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
list_test.go
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
list.swift
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
list.js
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
list.ts
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
list.dart
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
list.rs
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
list.rb
# \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
list.zig
// \u521d\u59cb\u5316\u4e32\u5217\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8a2a\u554f\u5143\u7d20","text":"

\u4e32\u5217\u672c\u8cea\u4e0a\u662f\u9663\u5217\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u8a2a\u554f\u5143\u7d20\nnum: int = nums[1]  # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.cpp
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.java
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums.get(1);  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.cs
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list_test.go
/* \u8a2a\u554f\u5143\u7d20 */\nnum := nums[1]  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.swift
/* \u8a2a\u554f\u5143\u7d20 */\nlet num = nums[1] // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.js
/* \u8a2a\u554f\u5143\u7d20 */\nconst num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.ts
/* \u8a2a\u554f\u5143\u7d20 */\nconst num: number = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.dart
/* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.rs
/* \u8a2a\u554f\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u8a2a\u554f\u5143\u7d20 */\nval num = nums[1]       // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.rb
# \u8a2a\u554f\u5143\u7d20\nnum = nums[1] # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
list.zig
// \u8a2a\u554f\u5143\u7d20\nvar num = nums.items[1]; // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u5143\u7d20","text":"

\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5730\u65b0\u589e\u8207\u522a\u9664\u5143\u7d20\u3002\u5728\u4e32\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u8207\u9663\u5217\u76f8\u540c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6e05\u7a7a\u4e32\u5217\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.pop(3)        # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.cpp
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.java
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.cs
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list_test.go
/* \u6e05\u7a7a\u4e32\u5217 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.swift
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.js
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.ts
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.dart
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.rs
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);    // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.rb
# \u6e05\u7a7a\u4e32\u5217\nnums.clear\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.delete_at(3) # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
list.zig
// \u6e05\u7a7a\u4e32\u5217\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n// \u522a\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u8d70\u8a2a\u4e32\u5217","text":"

\u8207\u9663\u5217\u4e00\u6a23\uff0c\u4e32\u5217\u53ef\u4ee5\u6839\u64da\u7d22\u5f15\u8d70\u8a2a\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u5404\u5143\u7d20\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\nfor num in nums:\n    count += num\n
list.cpp
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
list.java
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
list.cs
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
list_test.go
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
list.swift
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
list.js
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.ts
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
list.dart
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
list.rs
// \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
list.rb
# \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
list.zig
// \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u4e32\u5217","text":"

\u7d66\u5b9a\u4e00\u500b\u65b0\u4e32\u5217 nums1 \uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u62fc\u63a5\u5230\u539f\u4e32\u5217\u7684\u5c3e\u90e8\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.cpp
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
list.java
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.cs
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list_test.go
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.swift
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.js
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.ts
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.dart
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.rs
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
list.rb
# \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
list.zig
// \u62fc\u63a5\u5169\u500b\u4e32\u5217\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u4e32\u5217","text":"

\u5b8c\u6210\u4e32\u5217\u6392\u5e8f\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u9663\u5217\u985e\u5225\u6f14\u7b97\u6cd5\u984c\u4e2d\u7d93\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u548c\u201c\u96d9\u6307\u6a19\u201d\u6f14\u7b97\u6cd5\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
# \u6392\u5e8f\u4e32\u5217\nnums.sort()  # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.cpp
/* \u6392\u5e8f\u4e32\u5217 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.java
/* \u6392\u5e8f\u4e32\u5217 */\nCollections.sort(nums);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.cs
/* \u6392\u5e8f\u4e32\u5217 */\nnums.Sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list_test.go
/* \u6392\u5e8f\u4e32\u5217 */\nsort.Ints(nums)  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.swift
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.js
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.ts
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.dart
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.rs
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
list.kt
/* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.rb
# \u6392\u5e8f\u4e32\u5217\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
list.zig
// \u6392\u5e8f\u4e32\u5217\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u4e32\u5217\u5be6\u73fe","text":"

\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u4e86\u4e32\u5217\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u5011\u7684\u5be6\u73fe\u6bd4\u8f03\u8907\u96dc\uff0c\u5404\u500b\u53c3\u6578\u7684\u8a2d\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u64f4\u5bb9\u500d\u6578\u7b49\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u539f\u59cb\u78bc\u9032\u884c\u5b78\u7fd2\u3002

\u70ba\u4e86\u52a0\u6df1\u5c0d\u4e32\u5217\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u5011\u5617\u8a66\u5be6\u73fe\u4e00\u500b\u7c21\u6613\u7248\u4e32\u5217\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u500b\u91cd\u9ede\u8a2d\u8a08\u3002

  • \u521d\u59cb\u5bb9\u91cf\uff1a\u9078\u53d6\u4e00\u500b\u5408\u7406\u7684\u9663\u5217\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u9078\u64c7 10 \u4f5c\u70ba\u521d\u59cb\u5bb9\u91cf\u3002
  • \u6578\u91cf\u8a18\u9304\uff1a\u5ba3\u544a\u4e00\u500b\u8b8a\u6578 size \uff0c\u7528\u65bc\u8a18\u9304\u4e32\u5217\u7576\u524d\u5143\u7d20\u6578\u91cf\uff0c\u4e26\u96a8\u8457\u5143\u7d20\u63d2\u5165\u548c\u522a\u9664\u5be6\u6642\u66f4\u65b0\u3002\u6839\u64da\u6b64\u8b8a\u6578\uff0c\u6211\u5011\u53ef\u4ee5\u5b9a\u4f4d\u4e32\u5217\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65b7\u662f\u5426\u9700\u8981\u64f4\u5bb9\u3002
  • \u64f4\u5bb9\u6a5f\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u6642\u4e32\u5217\u5bb9\u91cf\u5df2\u6eff\uff0c\u5247\u9700\u8981\u9032\u884c\u64f4\u5bb9\u3002\u5148\u6839\u64da\u64f4\u5bb9\u500d\u6578\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u518d\u5c07\u7576\u524d\u9663\u5217\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52d5\u81f3\u65b0\u9663\u5217\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u898f\u5b9a\u6bcf\u6b21\u5c07\u9663\u5217\u64f4\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
class MyList:\n    \"\"\"\u4e32\u5217\u985e\u5225\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._capacity: int = 10  # \u4e32\u5217\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        self._size: int = 0  # \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8a2a\u554f\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u522a\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u4e32\u5217\u64f4\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217\"\"\"\n        return self._arr[: self._size]\n
my_list.cpp
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  private:\n    int *arr;             // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    int arrSize = 0;      // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Vector \u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
my_list.java
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    private int size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] toArray() {\n        int size = size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
my_list.cs
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr;           // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u4e32\u5217\u5bb9\u91cf\n    private int arrSize = 0;         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba arrCapacity * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
my_list.go
/* \u4e32\u5217\u985e\u5225 */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u4e32\u5217\u5bb9\u91cf\n        arr:         make([]int, 10), // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrSize:     0,               // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n    }\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u522a\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217 */\nfunc (l *myList) toArray() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
my_list.swift
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: [Int] // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var _capacity: Int // \u4e32\u5217\u5bb9\u91cf\n    private var _size: Int // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5247\u4e1f\u64f2\u932f\u8aa4\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
my_list.js
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    #arr = new Array(); // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    #capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    #size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    toArray() {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.ts
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private arr: Array<number>; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u4e32\u5217\u5bb9\u91cf\n    private _size: number = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
my_list.dart
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  late List<int> _arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n  int _capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n  int _size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  /* \u5efa\u69cb\u5b50 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8a2a\u554f\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u522a\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u4e32\u5217\u64f4\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extendRatio \u500d\u7684\u65b0\u9663\u5217\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
my_list.rs
/* \u4e32\u5217\u985e\u5225 */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    capacity: usize,     // \u4e32\u5217\u5bb9\u91cf\n    size: usize,         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
my_list.c
/* \u4e32\u5217\u985e\u5225 */\ntypedef struct {\n    int *arr;        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int capacity;    // \u4e32\u5217\u5bb9\u91cf\n    int size;        // \u4e32\u5217\u5927\u5c0f\n    int extendRatio; // \u4e32\u5217\u6bcf\u6b21\u64f4\u5bb9\u7684\u500d\u6578\n} MyList;\n\n/* \u5efa\u69cb\u5b50 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u522a\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u9593\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u8907\u88fd\u820a\u8cc7\u6599\u5230\u65b0\u8cc7\u6599\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91cb\u653e\u820a\u8cc7\u6599\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u8cc7\u6599\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Array \u7528\u65bc\u5217\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
my_list.kt
/* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u4e32\u5217\u5bb9\u91cf\n    private var size: Int = 0 // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u522a\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
my_list.rb
### \u4e32\u5217\u985e\u5225 ###\nclass MyList\n  attr_reader :size       # \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  attr_reader :capacity   # \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n\n    # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u522a\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u4e32\u5217\u64f4\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 ###\n  def to_array\n    sz = size\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
my_list.zig
// \u4e32\u5217\u985e\u5225\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u4e32\u5217\u5bb9\u91cf\n        numSize: usize = 0,                           // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4e32\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8a2a\u554f\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }\n\n        // \u522a\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u4e32\u5217\u64f4\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *","text":"

\u5728\u672c\u7ae0\u7684\u524d\u5169\u7bc0\u4e2d\uff0c\u6211\u5011\u63a2\u8a0e\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u9019\u5169\u7a2e\u57fa\u790e\u4e14\u91cd\u8981\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b83\u5011\u5206\u5225\u4ee3\u8868\u4e86\u201c\u9023\u7e8c\u5132\u5b58\u201d\u548c\u201c\u5206\u6563\u5132\u5b58\u201d\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u3002

\u5be6\u969b\u4e0a\uff0c\u7269\u7406\u7d50\u69cb\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u6c7a\u5b9a\u4e86\u7a0b\u5f0f\u5c0d\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u7684\u4f7f\u7528\u6548\u7387\uff0c\u9032\u800c\u5f71\u97ff\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u7684\u6574\u9ad4\u6548\u80fd\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u88dd\u7f6e","text":"

\u8a08\u7b97\u6a5f\u4e2d\u5305\u62ec\u4e09\u7a2e\u985e\u578b\u7684\u5132\u5b58\u88dd\u7f6e\uff1a\u786c\u789f\uff08hard disk\uff09\u3001\u8a18\u61b6\u9ad4\uff08random-access memory, RAM\uff09\u3001\u5feb\u53d6\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u5011\u5728\u8a08\u7b97\u6a5f\u7cfb\u7d71\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6548\u80fd\u7279\u9ede\u3002

\u8868 4-2 \u00a0 \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u88dd\u7f6e

\u786c\u789f \u8a18\u61b6\u9ad4 \u5feb\u53d6 \u7528\u9014 \u9577\u671f\u5132\u5b58\u8cc7\u6599\uff0c\u5305\u62ec\u4f5c\u696d\u7cfb\u7d71\u3001\u7a0b\u5f0f\u3001\u6a94\u6848\u7b49 \u81e8\u6642\u5132\u5b58\u7576\u524d\u57f7\u884c\u7684\u7a0b\u5f0f\u548c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599 \u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u6e1b\u5c11 CPU \u8a2a\u554f\u8a18\u61b6\u9ad4\u7684\u6b21\u6578 \u6613\u5931\u6027 \u65b7\u96fb\u5f8c\u8cc7\u6599\u4e0d\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u5bb9\u91cf \u8f03\u5927\uff0cTB \u7d1a\u5225 \u8f03\u5c0f\uff0cGB \u7d1a\u5225 \u975e\u5e38\u5c0f\uff0cMB \u7d1a\u5225 \u901f\u5ea6 \u8f03\u6162\uff0c\u5e7e\u767e\u5230\u5e7e\u5343 MB/s \u8f03\u5feb\uff0c\u5e7e\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u5e7e\u5341\u5230\u5e7e\u767e GB/s \u50f9\u683c \u8f03\u4fbf\u5b9c\uff0c\u5e7e\u6bdb\u5230\u5e7e\u5143 / GB \u8f03\u8cb4\uff0c\u5e7e\u5341\u5230\u5e7e\u767e\u5143 / GB \u975e\u5e38\u8cb4\uff0c\u96a8 CPU \u6253\u5305\u8a08\u50f9

\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71\u60f3\u8c61\u70ba\u5716 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7d50\u69cb\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9802\u7aef\u7684\u5132\u5b58\u88dd\u7f6e\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u9019\u7a2e\u591a\u5c64\u7d1a\u7684\u8a2d\u8a08\u4e26\u975e\u5076\u7136\uff0c\u800c\u662f\u8a08\u7b97\u6a5f\u79d1\u5b78\u5bb6\u548c\u5de5\u7a0b\u5e2b\u5011\u7d93\u904e\u6df1\u601d\u719f\u616e\u7684\u7d50\u679c\u3002

  • \u786c\u789f\u96e3\u4ee5\u88ab\u8a18\u61b6\u9ad4\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u5728\u65b7\u96fb\u5f8c\u6703\u4e1f\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9069\u5408\u9577\u671f\u5132\u5b58\u8cc7\u6599\uff1b\u5176\u6b21\uff0c\u8a18\u61b6\u9ad4\u7684\u6210\u672c\u662f\u786c\u789f\u7684\u5e7e\u5341\u500d\uff0c\u9019\u4f7f\u5f97\u5b83\u96e3\u4ee5\u5728\u6d88\u8cbb\u8005\u5e02\u5834\u666e\u53ca\u3002
  • \u5feb\u53d6\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96e3\u4ee5\u517c\u5f97\u3002\u96a8\u8457 L1\u3001L2\u3001L3 \u5feb\u53d6\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u6703\u8b8a\u5927\uff0c\u8207 CPU \u6838\u5fc3\u4e4b\u9593\u7684\u7269\u7406\u8ddd\u96e2\u6703\u8b8a\u9060\uff0c\u5f9e\u800c\u5c0e\u81f4\u8cc7\u6599\u50b3\u8f38\u6642\u9593\u589e\u52a0\uff0c\u5143\u7d20\u8a2a\u554f\u5ef6\u9072\u8b8a\u9ad8\u3002\u5728\u7576\u524d\u6280\u8853\u4e0b\uff0c\u591a\u5c64\u7d1a\u7684\u5feb\u53d6\u7d50\u69cb\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u9593\u7684\u6700\u4f73\u5e73\u8861\u9ede\u3002

\u5716 4-9 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71

Tip

\u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u5c64\u6b21\u7d50\u69cb\u9ad4\u73fe\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u9593\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5be6\u969b\u4e0a\uff0c\u9019\u7a2e\u6b0a\u8861\u666e\u904d\u5b58\u5728\u65bc\u6240\u6709\u5de5\u696d\u9818\u57df\uff0c\u5b83\u8981\u6c42\u6211\u5011\u5728\u4e0d\u540c\u7684\u512a\u52e2\u548c\u9650\u5236\u4e4b\u9593\u627e\u5230\u6700\u4f73\u5e73\u8861\u9ede\u3002

\u7e3d\u7684\u4f86\u8aaa\uff0c\u786c\u789f\u7528\u65bc\u9577\u671f\u5132\u5b58\u5927\u91cf\u8cc7\u6599\uff0c\u8a18\u61b6\u9ad4\u7528\u65bc\u81e8\u6642\u5132\u5b58\u7a0b\u5f0f\u57f7\u884c\u4e2d\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\uff0c\u800c\u5feb\u53d6\u5247\u7528\u65bc\u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5f0f\u57f7\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u5354\u4f5c\uff0c\u78ba\u4fdd\u8a08\u7b97\u6a5f\u7cfb\u7d71\u9ad8\u6548\u57f7\u884c\u3002

\u5982\u5716 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u6703\u5f9e\u786c\u789f\u4e2d\u88ab\u8b80\u53d6\u5230\u8a18\u61b6\u9ad4\u4e2d\uff0c\u4f9b CPU \u8a08\u7b97\u4f7f\u7528\u3002\u5feb\u53d6\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u900f\u904e\u667a\u6167\u5730\u5f9e\u8a18\u61b6\u9ad4\u8f09\u5165\u8cc7\u6599\uff0c\u7d66 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u8cc7\u6599\u8b80\u53d6\uff0c\u5f9e\u800c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\uff0c\u6e1b\u5c11\u5c0d\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u7684\u4f9d\u8cf4\u3002

\u5716 4-10 \u00a0 \u786c\u789f\u3001\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u4e4b\u9593\u7684\u8cc7\u6599\u6d41\u901a

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u8a18\u61b6\u9ad4\u6548\u7387","text":"

\u5728\u8a18\u61b6\u9ad4\u7a7a\u9593\u5229\u7528\u65b9\u9762\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5404\u81ea\u5177\u6709\u512a\u52e2\u548c\u4fb7\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u8a18\u61b6\u9ad4\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u584a\u8a18\u61b6\u9ad4\u4e0d\u80fd\u88ab\u591a\u500b\u7a0b\u5f0f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u5011\u5e0c\u671b\u8cc7\u6599\u7d50\u69cb\u80fd\u5920\u5118\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u9593\u3002\u9663\u5217\u7684\u5143\u7d20\u7dca\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u984d\u5916\u7684\u7a7a\u9593\u4f86\u5132\u5b58\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u56e0\u6b64\u7a7a\u9593\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u9663\u5217\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u5920\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u9019\u53ef\u80fd\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff0c\u9663\u5217\u64f4\u5bb9\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u4ee5\u201c\u7bc0\u9ede\u201d\u70ba\u55ae\u4f4d\u9032\u884c\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u96a8\u8457\u53cd\u8986\u7533\u8acb\u8207\u91cb\u653e\u8a18\u61b6\u9ad4\uff0c\u7a7a\u9592\u8a18\u61b6\u9ad4\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u6703\u8d8a\u4f86\u8d8a\u9ad8\uff0c\u5f9e\u800c\u5c0e\u81f4\u8a18\u61b6\u9ad4\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u9663\u5217\u7531\u65bc\u5176\u9023\u7e8c\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u76f8\u5c0d\u4e0d\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u5143\u7d20\u662f\u5206\u6563\u5132\u5b58\u7684\uff0c\u5728\u983b\u7e41\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002

"},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u5feb\u53d6\u6548\u7387","text":"

\u5feb\u53d6\u96d6\u7136\u5728\u7a7a\u9593\u5bb9\u91cf\u4e0a\u9060\u5c0f\u65bc\u8a18\u61b6\u9ad4\uff0c\u4f46\u5b83\u6bd4\u8a18\u61b6\u9ad4\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u901f\u5ea6\u4e0a\u8d77\u8457\u81f3\u95dc\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u65bc\u5feb\u53d6\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5132\u5b58\u4e00\u5c0f\u90e8\u5206\u983b\u7e41\u8a2a\u554f\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u7576 CPU \u5617\u8a66\u8a2a\u554f\u7684\u8cc7\u6599\u4e0d\u5728\u5feb\u53d6\u4e2d\u6642\uff0c\u5c31\u6703\u767c\u751f\u5feb\u53d6\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u6642 CPU \u4e0d\u5f97\u4e0d\u5f9e\u901f\u5ea6\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u4e2d\u8f09\u5165\u6240\u9700\u8cc7\u6599\u3002

\u986f\u7136\uff0c\u201c\u5feb\u53d6\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8b80\u5beb\u8cc7\u6599\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5f0f\u6548\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u5011\u5c07 CPU \u5f9e\u5feb\u53d6\u4e2d\u6210\u529f\u7372\u53d6\u8cc7\u6599\u7684\u6bd4\u4f8b\u7a31\u70ba\u5feb\u53d6\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u9019\u500b\u6307\u6a19\u901a\u5e38\u7528\u4f86\u8861\u91cf\u5feb\u53d6\u6548\u7387\u3002

\u70ba\u4e86\u5118\u53ef\u80fd\u9054\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u5feb\u53d6\u6703\u63a1\u53d6\u4ee5\u4e0b\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\u3002

  • \u5feb\u53d6\u884c\uff1a\u5feb\u53d6\u4e0d\u662f\u55ae\u500b\u4f4d\u5143\u7d44\u5730\u5132\u5b58\u8207\u8f09\u5165\u8cc7\u6599\uff0c\u800c\u662f\u4ee5\u5feb\u53d6\u884c\u70ba\u55ae\u4f4d\u3002\u76f8\u6bd4\u65bc\u55ae\u500b\u4f4d\u5143\u7d44\u7684\u50b3\u8f38\uff0c\u5feb\u53d6\u884c\u7684\u50b3\u8f38\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
  • \u9810\u53d6\u6a5f\u5236\uff1a\u8655\u7406\u5668\u6703\u5617\u8a66\u9810\u6e2c\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\uff08\u4f8b\u5982\u9806\u5e8f\u8a2a\u554f\u3001\u56fa\u5b9a\u6b65\u9577\u8df3\u8e8d\u8a2a\u554f\u7b49\uff09\uff0c\u4e26\u6839\u64da\u7279\u5b9a\u6a21\u5f0f\u5c07\u8cc7\u6599\u8f09\u5165\u81f3\u5feb\u53d6\u4e4b\u4e2d\uff0c\u5f9e\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
  • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u9644\u8fd1\u7684\u8cc7\u6599\u53ef\u80fd\u8fd1\u671f\u4e5f\u6703\u88ab\u8a2a\u554f\u3002\u56e0\u6b64\uff0c\u5feb\u53d6\u5728\u8f09\u5165\u67d0\u4e00\u8cc7\u6599\u6642\uff0c\u4e5f\u6703\u8f09\u5165\u5176\u9644\u8fd1\u7684\u8cc7\u6599\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
  • \u6642\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u5728\u4e0d\u4e45\u7684\u5c07\u4f86\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8a2a\u554f\u3002\u5feb\u53d6\u5229\u7528\u9019\u4e00\u539f\u7406\uff0c\u900f\u904e\u4fdd\u7559\u6700\u8fd1\u8a2a\u554f\u904e\u7684\u8cc7\u6599\u4f86\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

\u5be6\u969b\u4e0a\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5c0d\u5feb\u53d6\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5e7e\u500b\u65b9\u9762\u3002

  • \u4f54\u7528\u7a7a\u9593\uff1a\u93c8\u7d50\u4e32\u5217\u5143\u7d20\u6bd4\u9663\u5217\u5143\u7d20\u4f54\u7528\u7a7a\u9593\u66f4\u591a\uff0c\u5c0e\u81f4\u5feb\u53d6\u4e2d\u5bb9\u7d0d\u7684\u6709\u6548\u8cc7\u6599\u91cf\u66f4\u5c11\u3002
  • \u5feb\u53d6\u884c\uff1a\u93c8\u7d50\u4e32\u5217\u8cc7\u6599\u5206\u6563\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u800c\u5feb\u53d6\u662f\u201c\u6309\u884c\u8f09\u5165\u201d\u7684\uff0c\u56e0\u6b64\u8f09\u5165\u5230\u7121\u6548\u8cc7\u6599\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
  • \u9810\u53d6\u6a5f\u5236\uff1a\u9663\u5217\u6bd4\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9810\u6e2c\u6027\u201d\uff0c\u5373\u7cfb\u7d71\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c07\u88ab\u8f09\u5165\u7684\u8cc7\u6599\u3002
  • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u9663\u5217\u88ab\u5132\u5b58\u5728\u96c6\u4e2d\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u56e0\u6b64\u88ab\u8f09\u5165\u8cc7\u6599\u9644\u8fd1\u7684\u8cc7\u6599\u66f4\u6709\u53ef\u80fd\u5373\u5c07\u88ab\u8a2a\u554f\u3002

\u7e3d\u9ad4\u800c\u8a00\uff0c\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u9019\u4f7f\u5f97\u5728\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u5f80\u5f80\u66f4\u53d7\u6b61\u8fce\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u5feb\u53d6\u6548\u7387\u4e26\u4e0d\u610f\u5473\u8457\u9663\u5217\u5728\u6240\u6709\u60c5\u6cc1\u4e0b\u90fd\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u5be6\u969b\u61c9\u7528\u4e2d\u9078\u64c7\u54ea\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5be6\u73fe\u201c\u5806\u758a\u201d\u8cc7\u6599\u7d50\u69cb\uff08\u4e0b\u4e00\u7ae0\u6703\u8a73\u7d30\u4ecb\u7d39\uff09\uff0c\u4f46\u5b83\u5011\u9069\u7528\u65bc\u4e0d\u540c\u5834\u666f\u3002

  • \u5728\u505a\u6f14\u7b97\u6cd5\u984c\u6642\uff0c\u6211\u5011\u6703\u50be\u5411\u65bc\u9078\u64c7\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\uff0c\u56e0\u70ba\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u96a8\u6a5f\u8a2a\u554f\u7684\u80fd\u529b\uff0c\u4ee3\u50f9\u50c5\u662f\u9700\u8981\u9810\u5148\u70ba\u9663\u5217\u5206\u914d\u4e00\u5b9a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u5982\u679c\u8cc7\u6599\u91cf\u975e\u5e38\u5927\u3001\u52d5\u614b\u6027\u5f88\u9ad8\u3001\u5806\u758a\u7684\u9810\u671f\u5927\u5c0f\u96e3\u4ee5\u4f30\u8a08\uff0c\u90a3\u9ebc\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u66f4\u52a0\u5408\u9069\u3002\u93c8\u7d50\u4e32\u5217\u80fd\u5920\u5c07\u5927\u91cf\u8cc7\u6599\u5206\u6563\u5132\u5b58\u65bc\u8a18\u61b6\u9ad4\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u4e26\u4e14\u907f\u514d\u4e86\u9663\u5217\u64f4\u5bb9\u7522\u751f\u7684\u984d\u5916\u958b\u92b7\u3002
"},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u662f\u5169\u7a2e\u57fa\u672c\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5206\u5225\u4ee3\u8868\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5169\u7a2e\u5132\u5b58\u65b9\u5f0f\uff1a\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\u3002\u5169\u8005\u7684\u7279\u9ede\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u6027\u3002
  • \u9663\u5217\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002
  • \u93c8\u7d50\u4e32\u5217\u900f\u904e\u66f4\u6539\u5f15\u7528\uff08\u6307\u6a19\uff09\u5be6\u73fe\u9ad8\u6548\u7684\u7bc0\u9ede\u63d2\u5165\u8207\u522a\u9664\uff0c\u4e14\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\uff1b\u4f46\u7bc0\u9ede\u8a2a\u554f\u6548\u7387\u4f4e\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u591a\u3002\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u3001\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3001\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
  • \u4e32\u5217\u662f\u4e00\u7a2e\u652f\u6301\u589e\u522a\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u3002\u5b83\u4fdd\u7559\u4e86\u9663\u5217\u7684\u512a\u52e2\uff0c\u540c\u6642\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\u3002
  • \u4e32\u5217\u7684\u51fa\u73fe\u5927\u5e45\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
  • \u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u9663\u5217\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6548\u7387\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u5247\u5728\u8a18\u61b6\u9ad4\u4f7f\u7528\u4e0a\u66f4\u52a0\u9748\u6d3b\u3002
  • \u5feb\u53d6\u900f\u904e\u5feb\u53d6\u884c\u3001\u9810\u53d6\u6a5f\u5236\u4ee5\u53ca\u7a7a\u9593\u5340\u57df\u6027\u548c\u6642\u9593\u5340\u57df\u6027\u7b49\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\uff0c\u70ba CPU \u63d0\u4f9b\u5feb\u901f\u8cc7\u6599\u8a2a\u554f\uff0c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\u3002
  • \u7531\u65bc\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u93c8\u7d50\u4e32\u5217\u66f4\u9ad8\u6548\u3002\u5728\u9078\u64c7\u8cc7\u6599\u7d50\u69cb\u6642\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u548c\u5834\u666f\u505a\u51fa\u6070\u7576\u9078\u64c7\u3002
"},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u9663\u5217\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff0c\u5c0d\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u5426\u6709\u5f71\u97ff\uff1f

\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u90fd\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u8cc7\u6599\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u5806\u758a\u548c\u5806\u7a4d\u5177\u6709\u5404\u81ea\u7684\u7279\u9ede\uff0c\u5f9e\u800c\u5c0e\u81f4\u4ee5\u4e0b\u4e0d\u540c\u9ede\u3002

  1. \u5206\u914d\u548c\u91cb\u653e\u6548\u7387\uff1a\u5806\u758a\u662f\u4e00\u584a\u8f03\u5c0f\u7684\u8a18\u61b6\u9ad4\uff0c\u5206\u914d\u7531\u7de8\u8b6f\u5668\u81ea\u52d5\u5b8c\u6210\uff1b\u800c\u5806\u7a4d\u8a18\u61b6\u9ad4\u76f8\u5c0d\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u7a0b\u5f0f\u78bc\u4e2d\u52d5\u614b\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u7a4d\u4e0a\u7684\u5206\u914d\u548c\u91cb\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u5806\u758a\u4e0a\u7684\u6162\u3002
  2. \u5927\u5c0f\u9650\u5236\uff1a\u5806\u758a\u8a18\u61b6\u9ad4\u76f8\u5c0d\u8f03\u5c0f\uff0c\u5806\u7a4d\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\u3002\u56e0\u6b64\u5806\u7a4d\u66f4\u52a0\u9069\u5408\u5132\u5b58\u5927\u578b\u9663\u5217\u3002
  3. \u9748\u6d3b\u6027\uff1a\u5806\u758a\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u9700\u8981\u5728\u7de8\u8b6f\u6642\u78ba\u5b9a\uff0c\u800c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u57f7\u884c\u6642\u52d5\u614b\u78ba\u5b9a\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u9663\u5217\u8981\u6c42\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u537b\u6c92\u6709\u5f37\u8abf\u76f8\u540c\u578b\u5225\u5462\uff1f

\u93c8\u7d50\u4e32\u5217\u7531\u7bc0\u9ede\u7d44\u6210\uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u5f15\u7528\uff08\u6307\u6a19\uff09\u9023\u7dda\uff0c\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5132\u5b58\u4e0d\u540c\u578b\u5225\u7684\u8cc7\u6599\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

\u76f8\u5c0d\u5730\uff0c\u9663\u5217\u5143\u7d20\u5247\u5fc5\u9808\u662f\u76f8\u540c\u578b\u5225\u7684\uff0c\u9019\u6a23\u624d\u80fd\u900f\u904e\u8a08\u7b97\u504f\u79fb\u91cf\u4f86\u7372\u53d6\u5c0d\u61c9\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u9663\u5217\u540c\u6642\u5305\u542b int \u548c long \u5169\u7a2e\u578b\u5225\uff0c\u55ae\u500b\u5143\u7d20\u5206\u5225\u4f54\u7528 4 \u4f4d\u5143\u7d44 \u548c 8 \u4f4d\u5143\u7d44 \uff0c\u6b64\u6642\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8a08\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u70ba\u9663\u5217\u4e2d\u5305\u542b\u4e86\u5169\u7a2e\u201c\u5143\u7d20\u9577\u5ea6\u201d\u3002

# \u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740 = \u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09 + \u5143\u7d20\u9577\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

Q\uff1a\u522a\u9664\u7bc0\u9ede P \u5f8c\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8a2d\u70ba None \u5462\uff1f

\u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u5f9e\u8a72\u93c8\u7d50\u4e32\u5217\u7684\u89d2\u5ea6\u770b\uff0c\u5f9e\u982d\u7bc0\u9ede\u8d70\u8a2a\u5230\u5c3e\u7bc0\u9ede\u5df2\u7d93\u4e0d\u6703\u9047\u5230 P \u4e86\u3002\u9019\u610f\u5473\u8457\u7bc0\u9ede P \u5df2\u7d93\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u4e86\uff0c\u6b64\u6642\u7bc0\u9ede P \u6307\u5411\u54ea\u88e1\u90fd\u4e0d\u6703\u5c0d\u8a72\u93c8\u7d50\u4e32\u5217\u7522\u751f\u5f71\u97ff\u3002

\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff08\u505a\u984c\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65b7\u958b\u6c92\u6709\u95dc\u4fc2\uff0c\u53ea\u8981\u4fdd\u8b49\u7a0b\u5f0f\u7684\u908f\u8f2f\u662f\u6b63\u78ba\u7684\u5c31\u884c\u3002\u5f9e\u6a19\u6e96\u5eab\u7684\u89d2\u5ea6\u770b\uff0c\u65b7\u958b\u66f4\u52a0\u5b89\u5168\u3001\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65b7\u958b\uff0c\u5047\u8a2d\u88ab\u522a\u9664\u7bc0\u9ede\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u9ebc\u5b83\u6703\u5f71\u97ff\u5f8c\u7e7c\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u56de\u6536\u3002

Q\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u522a\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u67e5\u8a62\u5143\u7d20\uff0c\u90a3\u70ba\u4ec0\u9ebc\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

\u5982\u679c\u662f\u5148\u67e5\u8a62\u5143\u7d20\u3001\u518d\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u78ba\u5be6\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u7684 \\(O(1)\\) \u589e\u522a\u7684\u512a\u52e2\u53ef\u4ee5\u5728\u5176\u4ed6\u61c9\u7528\u4e0a\u5f97\u5230\u9ad4\u73fe\u3002\u4f8b\u5982\uff0c\u96d9\u5411\u4f47\u5217\u9069\u5408\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u6211\u5011\u7dad\u8b77\u4e00\u500b\u6307\u6a19\u8b8a\u6578\u59cb\u7d42\u6307\u5411\u982d\u7bc0\u9ede\u3001\u5c3e\u7bc0\u9ede\uff0c\u6bcf\u6b21\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

Q\uff1a\u5716\u201c\u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f\u201d\u4e2d\uff0c\u6dfa\u85cd\u8272\u7684\u5132\u5b58\u7bc0\u9ede\u6307\u6a19\u662f\u4f54\u7528\u4e00\u584a\u8a18\u61b6\u9ad4\u4f4d\u5740\u55ce\uff1f\u9084\u662f\u548c\u7bc0\u9ede\u503c\u5404\u4f54\u4e00\u534a\u5462\uff1f

\u8a72\u793a\u610f\u5716\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

  • \u4e0d\u540c\u578b\u5225\u7684\u7bc0\u9ede\u503c\u4f54\u7528\u7684\u7a7a\u9593\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u4f8b\u9805\u7269\u4ef6\u7b49\u3002
  • \u6307\u6a19\u8b8a\u6578\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5927\u5c0f\u6839\u64da\u6240\u4f7f\u7528\u7684\u4f5c\u696d\u7cfb\u7d71\u53ca\u7de8\u8b6f\u74b0\u5883\u800c\u5b9a\uff0c\u5927\u591a\u70ba 8 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\u3002

Q\uff1a\u5728\u4e32\u5217\u672b\u5c3e\u65b0\u589e\u5143\u7d20\u662f\u5426\u6642\u6642\u523b\u523b\u90fd\u70ba \\(O(1)\\) \uff1f

\u5982\u679c\u65b0\u589e\u5143\u7d20\u6642\u8d85\u51fa\u4e32\u5217\u9577\u5ea6\uff0c\u5247\u9700\u8981\u5148\u64f4\u5bb9\u4e32\u5217\u518d\u65b0\u589e\u3002\u7cfb\u7d71\u6703\u7533\u8acb\u4e00\u584a\u65b0\u7684\u8a18\u61b6\u9ad4\uff0c\u4e26\u5c07\u539f\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u642c\u904b\u904e\u53bb\uff0c\u9019\u6642\u5019\u6642\u9593\u8907\u96dc\u5ea6\u5c31\u6703\u662f \\(O(n)\\) \u3002

Q\uff1a\u201c\u4e32\u5217\u7684\u51fa\u73fe\u6975\u5927\u5730\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u201d\uff0c\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u662f\u6307\u984d\u5916\u589e\u52a0\u7684\u8b8a\u6578\u5982\u5bb9\u91cf\u3001\u9577\u5ea6\u3001\u64f4\u5bb9\u500d\u6578\u6240\u4f54\u7684\u8a18\u61b6\u9ad4\u55ce\uff1f

\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u4e3b\u8981\u6709\u5169\u65b9\u9762\u542b\u7fa9\uff1a\u4e00\u65b9\u9762\uff0c\u4e32\u5217\u90fd\u6703\u8a2d\u5b9a\u4e00\u500b\u521d\u59cb\u9577\u5ea6\uff0c\u6211\u5011\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u9019\u9ebc\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u70ba\u4e86\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\uff0c\u64f4\u5bb9\u4e00\u822c\u6703\u4e58\u4ee5\u4e00\u500b\u4fc2\u6578\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u9019\u6a23\u4e00\u4f86\uff0c\u4e5f\u6703\u51fa\u73fe\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u5011\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6eff\u5b83\u5011\u3002

Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u5f8c\uff0c\u9019 3 \u500b\u5143\u7d20\u7684\u4f4d\u5740\u662f\u76f8\u9023\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u6703\u767c\u73fe\u5b83\u5011\u6bcf\u500b\u5143\u7d20\u7684 id \u4e26\u4e0d\u662f\u9023\u7e8c\u7684\uff0c\u800c\u662f\u5206\u5225\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u9019\u4e9b\u5143\u7d20\u7684\u4f4d\u5740\u4e0d\u9023\u7e8c\uff0c\u90a3\u9ebc m \u9084\u662f\u9663\u5217\u55ce\uff1f

\u5047\u5982\u628a\u4e32\u5217\u5143\u7d20\u63db\u6210\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u9019 5 \u500b\u7bc0\u9ede\u7269\u4ef6\u4e5f\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u7136\u800c\uff0c\u7d66\u5b9a\u4e00\u500b\u4e32\u5217\u7d22\u5f15\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u7bc0\u9ede\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u8a2a\u554f\u5230\u5c0d\u61c9\u7684\u7bc0\u9ede\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u4e2d\u5132\u5b58\u7684\u662f\u7bc0\u9ede\u7684\u5f15\u7528\uff0c\u800c\u975e\u7bc0\u9ede\u672c\u8eab\u3002

\u8207\u8a31\u591a\u8a9e\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6578\u5b57\u4e5f\u88ab\u5305\u88dd\u70ba\u7269\u4ef6\uff0c\u4e32\u5217\u4e2d\u5132\u5b58\u7684\u4e0d\u662f\u6578\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5c0d\u6578\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6703\u767c\u73fe\u5169\u500b\u9663\u5217\u4e2d\u7684\u76f8\u540c\u6578\u5b57\u64c1\u6709\u540c\u4e00\u500b id \uff0c\u4e26\u4e14\u9019\u4e9b\u6578\u5b57\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

Q\uff1aC++ STL \u88e1\u9762\u7684 std::list \u5df2\u7d93\u5be6\u73fe\u4e86\u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u6f14\u7b97\u6cd5\u66f8\u4e0a\u4e0d\u600e\u9ebc\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u70ba\u6709\u4ec0\u9ebc\u4fb7\u9650\u6027\u5462\uff1f

\u4e00\u65b9\u9762\uff0c\u6211\u5011\u5f80\u5f80\u66f4\u9752\u775e\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u6f14\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u6642\u624d\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\uff0c\u4e3b\u8981\u6709\u5169\u500b\u539f\u56e0\u3002

  • \u7a7a\u9593\u958b\u92b7\uff1a\u7531\u65bc\u6bcf\u500b\u5143\u7d20\u9700\u8981\u5169\u500b\u984d\u5916\u7684\u6307\u6a19\uff08\u4e00\u500b\u7528\u65bc\u524d\u4e00\u500b\u5143\u7d20\uff0c\u4e00\u500b\u7528\u65bc\u5f8c\u4e00\u500b\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u4f54\u7528\u7a7a\u9593\u3002
  • \u5feb\u53d6\u4e0d\u53cb\u597d\uff1a\u7531\u65bc\u8cc7\u6599\u4e0d\u662f\u9023\u7e8c\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5c0d\u5feb\u53d6\u7684\u5229\u7528\u7387\u8f03\u4f4e\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0cstd::vector \u7684\u6548\u80fd\u6703\u66f4\u597d\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u7684\u60c5\u6cc1\u4e3b\u8981\u662f\u4e8c\u5143\u6a39\u548c\u5716\u3002\u5806\u758a\u548c\u4f47\u5217\u5f80\u5f80\u6703\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u93c8\u7d50\u4e32\u5217\u3002

Q\uff1a\u521d\u59cb\u5316\u4e32\u5217 res = [0] * self.size() \u64cd\u4f5c\uff0c\u6703\u5c0e\u81f4 res \u7684\u6bcf\u500b\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u4f4d\u5740\u55ce\uff1f

\u4e0d\u6703\u3002\u4f46\u4e8c\u7dad\u9663\u5217\u6703\u6709\u9019\u500b\u554f\u984c\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7dad\u4e32\u5217 res = [[0] * self.size()] \uff0c\u5247\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u500b\u4e32\u5217 [0] \u3002

"},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

Abstract

\u6211\u5011\u5982\u540c\u8ff7\u5bae\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u9032\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u6703\u9047\u5230\u56f0\u96e3\u3002

\u56de\u6eaf\u7684\u529b\u91cf\u8b93\u6211\u5011\u80fd\u5920\u91cd\u65b0\u958b\u59cb\uff0c\u4e0d\u65b7\u5617\u8a66\uff0c\u6700\u7d42\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

"},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 13.1 \u00a0 \u56de\u6eaf\u6f14\u7b97\u6cd5
  • 13.2 \u00a0 \u5168\u6392\u5217\u554f\u984c
  • 13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c
  • 13.4 \u00a0 N \u7687\u540e\u554f\u984c
  • 13.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u6f14\u7b97\u6cd5","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u7a2e\u900f\u904e\u7aae\u8209\u4f86\u89e3\u6c7a\u554f\u984c\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u5f9e\u4e00\u500b\u521d\u59cb\u72c0\u614b\u51fa\u767c\uff0c\u66b4\u529b\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u7576\u9047\u5230\u6b63\u78ba\u7684\u89e3\u5247\u5c07\u5176\u8a18\u9304\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5617\u8a66\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u90fd\u7121\u6cd5\u627e\u5230\u89e3\u70ba\u6b62\u3002

\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u4f86\u8d70\u8a2a\u89e3\u7a7a\u9593\u3002\u5728\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u4e2d\uff0c\u6211\u5011\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5229\u7528\u524d\u5e8f\u8d70\u8a2a\u69cb\u9020\u4e00\u500b\u56de\u6eaf\u554f\u984c\uff0c\u9010\u6b65\u77ad\u89e3\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u4f8b\u984c\u4e00

\u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\uff0c\u641c\u5c0b\u4e26\u8a18\u9304\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u7bc0\u9ede\u4e32\u5217\u3002

\u5c0d\u65bc\u6b64\u984c\uff0c\u6211\u5011\u524d\u5e8f\u8d70\u8a2a\u9019\u68f5\u6a39\uff0c\u4e26\u5224\u65b7\u7576\u524d\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \uff0c\u82e5\u662f\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u7684\u503c\u52a0\u5165\u7d50\u679c\u4e32\u5217 res \u4e4b\u4e2d\u3002\u76f8\u95dc\u904e\u7a0b\u5be6\u73fe\u5982\u5716 13-1 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
preorder_traversal_i_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
preorder_traversal_i_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
preorder_traversal_i_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
preorder_traversal_i_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
preorder_traversal_i_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
preorder_traversal_i_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
preorder_traversal_i_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
preorder_traversal_i_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
preorder_traversal_i_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_i_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-1 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u4e2d\u641c\u7d22\u7bc0\u9ede

"},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5617\u8a66\u8207\u56de\u9000","text":"

\u4e4b\u6240\u4ee5\u7a31\u4e4b\u70ba\u56de\u6eaf\u6f14\u7b97\u6cd5\uff0c\u662f\u56e0\u70ba\u8a72\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u89e3\u7a7a\u9593\u6642\u6703\u63a1\u7528\u201c\u5617\u8a66\u201d\u8207\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u7576\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u9047\u5230\u67d0\u500b\u72c0\u614b\u7121\u6cd5\u7e7c\u7e8c\u524d\u9032\u6216\u7121\u6cd5\u5f97\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u6642\uff0c\u5b83\u6703\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u5617\u8a66\u5176\u4ed6\u53ef\u80fd\u7684\u9078\u64c7\u3002

\u5c0d\u65bc\u4f8b\u984c\u4e00\uff0c\u8a2a\u554f\u6bcf\u500b\u7bc0\u9ede\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5617\u8a66\u201d\uff0c\u800c\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u8fd4\u56de\u7236\u7bc0\u9ede\u7684 return \u5247\u8868\u793a\u201c\u56de\u9000\u201d\u3002

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u56de\u9000\u4e26\u4e0d\u50c5\u50c5\u5305\u62ec\u51fd\u5f0f\u8fd4\u56de\u3002\u70ba\u89e3\u91cb\u9019\u4e00\u9ede\uff0c\u6211\u5011\u5c0d\u4f8b\u984c\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

\u4f8b\u984c\u4e8c

\u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\u3002

\u5728\u4f8b\u984c\u4e00\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u4e32\u5217 path \u8a18\u9304\u8a2a\u554f\u904e\u7684\u7bc0\u9ede\u8def\u5f91\u3002\u7576\u8a2a\u554f\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u8907\u88fd path \u4e26\u65b0\u589e\u9032\u7d50\u679c\u4e32\u5217 res \u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0cres \u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_ii_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_ii_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_ii_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_ii_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_ii_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_ii_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_ii_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_ii_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_ii_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_ii_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_ii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_ii_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u6bcf\u6b21\u201c\u5617\u8a66\u201d\u4e2d\uff0c\u6211\u5011\u900f\u904e\u5c07\u7576\u524d\u7bc0\u9ede\u65b0\u589e\u9032 path \u4f86\u8a18\u9304\u8def\u5f91\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u5011\u9700\u8981\u5c07\u8a72\u7bc0\u9ede\u5f9e path \u4e2d\u5f48\u51fa\uff0c\u4ee5\u6062\u5fa9\u672c\u6b21\u5617\u8a66\u4e4b\u524d\u7684\u72c0\u614b\u3002

\u89c0\u5bdf\u5716 13-2 \u6240\u793a\u7684\u904e\u7a0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5617\u8a66\u548c\u56de\u9000\u7406\u89e3\u70ba\u201c\u524d\u9032\u201d\u8207\u201c\u64a4\u92b7\u201d\uff0c\u5169\u500b\u64cd\u4f5c\u4e92\u70ba\u9006\u5411\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 13-2 \u00a0 \u5617\u8a66\u8207\u56de\u9000

"},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

\u8907\u96dc\u7684\u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u4e00\u500b\u6216\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u7d04\u675f\u689d\u4ef6\u901a\u5e38\u53ef\u7528\u65bc\u201c\u526a\u679d\u201d\u3002

\u4f8b\u984c\u4e09

\u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\uff0c\u4e26\u8981\u6c42\u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u3002

\u70ba\u4e86\u6eff\u8db3\u4ee5\u4e0a\u7d04\u675f\u689d\u4ef6\uff0c\u6211\u5011\u9700\u8981\u65b0\u589e\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\uff0c\u5247\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
preorder_traversal_iii_compact.cpp
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
preorder_traversal_iii_compact.java
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
preorder_traversal_iii_compact.cs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
preorder_traversal_iii_compact.go
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
preorder_traversal_iii_compact.swift
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
preorder_traversal_iii_compact.js
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.ts
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
preorder_traversal_iii_compact.dart
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
preorder_traversal_iii_compact.rs
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
preorder_traversal_iii_compact.c
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
preorder_traversal_iii_compact.kt
/* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
preorder_traversal_iii_compact.rb
[class]{}-[func]{pre_order}\n
preorder_traversal_iii_compact.zig
[class]{}-[func]{preOrder}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u201c\u526a\u679d\u201d\u662f\u4e00\u500b\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8a5e\u3002\u5982\u5716 13-3 \u6240\u793a\uff0c\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u641c\u5c0b\u5206\u652f\uff0c\u907f\u514d\u8a31\u591a\u7121\u610f\u7fa9\u7684\u5617\u8a66\uff0c\u5f9e\u800c\u63d0\u9ad8\u4e86\u641c\u5c0b\u6548\u7387\u3002

\u5716 13-3 \u00a0 \u6839\u64da\u7d04\u675f\u689d\u4ef6\u526a\u679d

"},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u7a0b\u5f0f\u78bc","text":"

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5617\u8a66\u5c07\u56de\u6eaf\u7684\u201c\u5617\u8a66\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u9ad4\u6846\u67b6\u63d0\u7149\u51fa\u4f86\uff0c\u63d0\u5347\u7a0b\u5f0f\u78bc\u7684\u901a\u7528\u6027\u3002

\u5728\u4ee5\u4e0b\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\uff0cstate \u8868\u793a\u554f\u984c\u7684\u7576\u524d\u72c0\u614b\uff0cchoices \u8868\u793a\u7576\u524d\u72c0\u614b\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9078\u64c7\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
\n
\n

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u57fa\u65bc\u6846\u67b6\u7a0b\u5f0f\u78bc\u4f86\u89e3\u6c7a\u4f8b\u984c\u4e09\u3002\u72c0\u614b state \u70ba\u7bc0\u9ede\u8d70\u8a2a\u8def\u5f91\uff0c\u9078\u64c7 choices \u70ba\u7576\u524d\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\uff0c\u7d50\u679c res \u662f\u8def\u5f91\u4e32\u5217\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8a18\u9304\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72c0\u614b\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u5fa9\u72c0\u614b\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
preorder_traversal_iii_template.cpp
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.java
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.cs
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
preorder_traversal_iii_template.go
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.swift
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.js
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.ts
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
preorder_traversal_iii_template.dart
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
preorder_traversal_iii_template.rs
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice.clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
preorder_traversal_iii_template.c
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution()) {\n        // \u8a18\u9304\u89e3\n        recordSolution();\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice();\n        }\n    }\n}\n
preorder_traversal_iii_template.kt
/* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
preorder_traversal_iii_template.rb
[class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\n
preorder_traversal_iii_template.zig
[class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6839\u64da\u984c\u610f\uff0c\u6211\u5011\u5728\u627e\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u5f8c\u61c9\u8a72\u7e7c\u7e8c\u641c\u5c0b\uff0c\u56e0\u6b64\u9700\u8981\u5c07\u8a18\u9304\u89e3\u4e4b\u5f8c\u7684 return \u8a9e\u53e5\u522a\u9664\u3002\u5716 13-4 \u5c0d\u6bd4\u4e86\u4fdd\u7559\u6216\u522a\u9664 return \u8a9e\u53e5\u7684\u641c\u5c0b\u904e\u7a0b\u3002

\u5716 13-4 \u00a0 \u4fdd\u7559\u8207\u522a\u9664 return \u7684\u641c\u5c0b\u904e\u7a0b\u5c0d\u6bd4

\u76f8\u6bd4\u57fa\u65bc\u524d\u5e8f\u8d70\u8a2a\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\uff0c\u57fa\u65bc\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u96d6\u7136\u986f\u5f97\u56c9\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u56de\u6eaf\u554f\u984c\u53ef\u4ee5\u5728\u8a72\u6846\u67b6\u4e0b\u89e3\u6c7a\u3002\u6211\u5011\u53ea\u9700\u6839\u64da\u5177\u9ad4\u554f\u984c\u4f86\u5b9a\u7fa9 state \u548c choices \uff0c\u4e26\u5be6\u73fe\u6846\u67b6\u4e2d\u7684\u5404\u500b\u65b9\u6cd5\u5373\u53ef\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u8853\u8a9e","text":"

\u70ba\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u6211\u5011\u7e3d\u7d50\u4e00\u4e0b\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e2d\u5e38\u7528\u8853\u8a9e\u7684\u542b\u7fa9\uff0c\u4e26\u5c0d\u7167\u4f8b\u984c\u4e09\u7d66\u51fa\u5c0d\u61c9\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

\u8868 13-1 \u00a0 \u5e38\u898b\u7684\u56de\u6eaf\u6f14\u7b97\u6cd5\u8853\u8a9e

\u540d\u8a5e \u5b9a\u7fa9 \u4f8b\u984c\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6eff\u8db3\u554f\u984c\u7279\u5b9a\u689d\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u500b\u6216\u591a\u500b \u6839\u7bc0\u9ede\u5230\u7bc0\u9ede \\(7\\) \u7684\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u6240\u6709\u8def\u5f91 \u7d04\u675f\u689d\u4ef6\uff08constraint\uff09 \u7d04\u675f\u689d\u4ef6\u662f\u554f\u984c\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u689d\u4ef6\uff0c\u901a\u5e38\u7528\u65bc\u526a\u679d \u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u7bc0\u9ede \\(3\\) \u72c0\u614b\uff08state\uff09 \u72c0\u614b\u8868\u793a\u554f\u984c\u5728\u67d0\u4e00\u6642\u523b\u7684\u60c5\u6cc1\uff0c\u5305\u62ec\u5df2\u7d93\u505a\u51fa\u7684\u9078\u64c7 \u7576\u524d\u5df2\u8a2a\u554f\u7684\u7bc0\u9ede\u8def\u5f91\uff0c\u5373 path \u7bc0\u9ede\u4e32\u5217 \u5617\u8a66\uff08attempt\uff09 \u5617\u8a66\u662f\u6839\u64da\u53ef\u7528\u9078\u64c7\u4f86\u63a2\u7d22\u89e3\u7a7a\u9593\u7684\u904e\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\uff0c\u6aa2\u67e5\u662f\u5426\u70ba\u89e3 \u905e\u8ff4\u8a2a\u554f\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\uff0c\u5c07\u7bc0\u9ede\u65b0\u589e\u9032 path \uff0c\u5224\u65b7\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u72c0\u614b\u6642\uff0c\u64a4\u92b7\u524d\u9762\u505a\u51fa\u7684\u9078\u64c7\uff0c\u56de\u5230\u4e0a\u4e00\u500b\u72c0\u614b \u7576\u8d8a\u904e\u8449\u7bc0\u9ede\u3001\u7d50\u675f\u7bc0\u9ede\u8a2a\u554f\u3001\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\u7d42\u6b62\u641c\u5c0b\uff0c\u51fd\u5f0f\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u64da\u554f\u984c\u7279\u6027\u548c\u7d04\u675f\u689d\u4ef6\u907f\u514d\u7121\u610f\u7fa9\u7684\u641c\u5c0b\u8def\u5f91\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u5c0b\u6548\u7387 \u7576\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b

Tip

\u554f\u984c\u3001\u89e3\u3001\u72c0\u614b\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

"},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u4e0a\u662f\u4e00\u7a2e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u5617\u8a66\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\u76f4\u5230\u627e\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u3002\u9019\u7a2e\u65b9\u6cd5\u7684\u512a\u9ede\u5728\u65bc\u80fd\u5920\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

\u7136\u800c\uff0c\u5728\u8655\u7406\u5927\u898f\u6a21\u6216\u8005\u8907\u96dc\u554f\u984c\u6642\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6548\u7387\u53ef\u80fd\u96e3\u4ee5\u63a5\u53d7\u3002

  • \u6642\u9593\uff1a\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u8d70\u8a2a\u72c0\u614b\u7a7a\u9593\u7684\u6240\u6709\u53ef\u80fd\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u6307\u6578\u968e\u6216\u968e\u4e58\u968e\u3002
  • \u7a7a\u9593\uff1a\u5728\u905e\u8ff4\u547c\u53eb\u4e2d\u9700\u8981\u5132\u5b58\u7576\u524d\u7684\u72c0\u614b\uff08\u4f8b\u5982\u8def\u5f91\u3001\u7528\u65bc\u526a\u679d\u7684\u8f14\u52a9\u8b8a\u6578\u7b49\uff09\uff0c\u7576\u6df1\u5ea6\u5f88\u5927\u6642\uff0c\u7a7a\u9593\u9700\u6c42\u53ef\u80fd\u6703\u8b8a\u5f97\u5f88\u5927\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u7684\u6700\u4f73\u89e3\u6c7a\u65b9\u6848\u3002\u5c0d\u65bc\u9019\u4e9b\u554f\u984c\uff0c\u7531\u65bc\u7121\u6cd5\u9810\u6e2c\u54ea\u4e9b\u9078\u64c7\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u5011\u5fc5\u9808\u5c0d\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u9032\u884c\u8d70\u8a2a\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u95dc\u9375\u662f\u5982\u4f55\u6700\u4f73\u5316\u6548\u7387\uff0c\u5e38\u898b\u7684\u6548\u7387\u6700\u4f73\u5316\u65b9\u6cd5\u6709\u5169\u7a2e\u3002

  • \u526a\u679d\uff1a\u907f\u514d\u641c\u5c0b\u90a3\u4e9b\u80af\u5b9a\u4e0d\u6703\u7522\u751f\u89e3\u7684\u8def\u5f91\uff0c\u5f9e\u800c\u7bc0\u7701\u6642\u9593\u548c\u7a7a\u9593\u3002
  • \u555f\u767c\u5f0f\u641c\u5c0b\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8a08\u503c\uff0c\u5f9e\u800c\u512a\u5148\u641c\u5c0b\u6700\u6709\u53ef\u80fd\u7522\u751f\u6709\u6548\u89e3\u7684\u8def\u5f91\u3002
"},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u984c","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u641c\u5c0b\u554f\u984c\u3001\u7d04\u675f\u6eff\u8db3\u554f\u984c\u548c\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u3002

\u641c\u5c0b\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u89e3\u6c7a\u65b9\u6848\u3002

  • \u5168\u6392\u5217\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7d44\u5408\u3002
  • \u5b50\u96c6\u548c\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\u548c\u4e00\u500b\u76ee\u6a19\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u70ba\u76ee\u6a19\u548c\u7684\u5b50\u96c6\u3002
  • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5713\u76e4\uff0c\u8981\u6c42\u5c07\u6240\u6709\u5713\u76e4\u5f9e\u4e00\u6839\u67f1\u5b50\u79fb\u52d5\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\uff0c\u4e14\u4e0d\u80fd\u5c07\u5927\u5713\u76e4\u653e\u5728\u5c0f\u5713\u76e4\u4e0a\u3002

\u7d04\u675f\u6eff\u8db3\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u6240\u6709\u7d04\u675f\u689d\u4ef6\u7684\u89e3\u3002

  • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76e4\u4e0a\u653e\u7f6e \\(n\\) \u500b\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u5011\u4e92\u4e0d\u653b\u64ca\u3002
  • \u6578\u7368\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7db2\u683c\u4e2d\u586b\u5165\u6578\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u500b \\(3 \\times 3\\) \u5b50\u7db2\u683c\u4e2d\u7684\u6578\u5b57\u4e0d\u91cd\u8907\u3002
  • \u5716\u8457\u8272\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u7528\u6700\u5c11\u7684\u984f\u8272\u7d66\u5716\u7684\u6bcf\u500b\u9802\u9ede\u8457\u8272\uff0c\u4f7f\u5f97\u76f8\u9130\u9802\u9ede\u984f\u8272\u4e0d\u540c\u3002

\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u4e00\u500b\u7d44\u5408\u7a7a\u9593\u4e2d\u627e\u5230\u6eff\u8db3\u67d0\u4e9b\u689d\u4ef6\u7684\u6700\u512a\u89e3\u3002

  • 0-1 \u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u80cc\u5305\uff0c\u6bcf\u500b\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u50f9\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5167\uff0c\u9078\u64c7\u7269\u54c1\u4f7f\u5f97\u7e3d\u50f9\u503c\u6700\u5927\u3002
  • \u65c5\u884c\u5546\u554f\u984c\uff1a\u5728\u4e00\u500b\u5716\u4e2d\uff0c\u5f9e\u4e00\u500b\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u6240\u6709\u5176\u4ed6\u9ede\u6070\u597d\u4e00\u6b21\u5f8c\u8fd4\u56de\u8d77\u9ede\uff0c\u6c42\u6700\u77ed\u8def\u5f91\u3002
  • \u6700\u5927\u5718\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u5716\uff0c\u5373\u5b50\u5716\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9802\u9ede\u4e4b\u9593\u90fd\u6709\u908a\u76f8\u9023\u3002

\u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u512a\u89e3\u6c7a\u65b9\u6848\u3002

  • 0-1 \u80cc\u5305\u554f\u984c\u901a\u5e38\u4f7f\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\uff0c\u4ee5\u9054\u5230\u66f4\u9ad8\u7684\u6642\u9593\u6548\u7387\u3002
  • \u65c5\u884c\u5546\u662f\u4e00\u500b\u8457\u540d\u7684 NP-Hard \u554f\u984c\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u907a\u50b3\u6f14\u7b97\u6cd5\u548c\u87fb\u7fa4\u6f14\u7b97\u6cd5\u7b49\u3002
  • \u6700\u5927\u5718\u554f\u984c\u662f\u5716\u8ad6\u4e2d\u7684\u4e00\u500b\u7d93\u5178\u554f\u984c\uff0c\u53ef\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u555f\u767c\u5f0f\u6f14\u7b97\u6cd5\u4f86\u89e3\u6c7a\u3002
"},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u554f\u984c","text":"

Question

\u6839\u64da\u570b\u969b\u8c61\u68cb\u7684\u898f\u5247\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u64ca\u8207\u540c\u8655\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u689d\u659c\u7dda\u4e0a\u7684\u68cb\u5b50\u3002\u7d66\u5b9a \\(n\\) \u500b\u7687\u540e\u548c\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5c0b\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u9593\u7121\u6cd5\u76f8\u4e92\u653b\u64ca\u7684\u64fa\u653e\u65b9\u6848\u3002

\u5982\u5716 13-15 \u6240\u793a\uff0c\u7576 \\(n = 4\\) \u6642\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u5169\u500b\u89e3\u3002\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\u5171\u6709 \\(n^2\\) \u500b\u683c\u5b50\uff0c\u7d66\u51fa\u4e86\u6240\u6709\u7684\u9078\u64c7 choices \u3002\u5728\u9010\u500b\u653e\u7f6e\u7687\u540e\u7684\u904e\u7a0b\u4e2d\uff0c\u68cb\u76e4\u72c0\u614b\u5728\u4e0d\u65b7\u5730\u8b8a\u5316\uff0c\u6bcf\u500b\u6642\u523b\u7684\u68cb\u76e4\u5c31\u662f\u72c0\u614b state \u3002

\u5716 13-15 \u00a0 4 \u7687\u540e\u554f\u984c\u7684\u89e3

\u5716 13-16 \u5c55\u793a\u4e86\u672c\u984c\u7684\u4e09\u500b\u7d04\u675f\u689d\u4ef6\uff1a\u591a\u500b\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u689d\u5c0d\u89d2\u7dda\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5c0d\u89d2\u7dda\u5206\u70ba\u4e3b\u5c0d\u89d2\u7dda \\ \u548c\u6b21\u5c0d\u89d2\u7dda / \u5169\u7a2e\u3002

\u5716 13-16 \u00a0 n \u7687\u540e\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6

"},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

\u7687\u540e\u7684\u6578\u91cf\u548c\u68cb\u76e4\u7684\u884c\u6578\u90fd\u70ba \\(n\\) \uff0c\u56e0\u6b64\u6211\u5011\u5bb9\u6613\u5f97\u5230\u4e00\u500b\u63a8\u8ad6\uff1a\u68cb\u76e4\u6bcf\u884c\u90fd\u5141\u8a31\u4e14\u53ea\u5141\u8a31\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u5f9e\u7b2c\u4e00\u884c\u958b\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\uff0c\u76f4\u81f3\u6700\u5f8c\u4e00\u884c\u7d50\u675f\u3002

\u5716 13-17 \u6240\u793a\u70ba \\(4\\) \u7687\u540e\u554f\u984c\u7684\u9010\u884c\u653e\u7f6e\u904e\u7a0b\u3002\u53d7\u756b\u5e45\u9650\u5236\uff0c\u5716 13-17 \u50c5\u5c55\u958b\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u500b\u641c\u5c0b\u5206\u652f\uff0c\u4e26\u4e14\u5c07\u4e0d\u6eff\u8db3\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u65b9\u6848\u90fd\u9032\u884c\u4e86\u526a\u679d\u3002

\u5716 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73fe\u591a\u500b\u7687\u540e\u7684\u6240\u6709\u641c\u5c0b\u5206\u652f\u3002

"},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u8207\u5c0d\u89d2\u7dda\u526a\u679d","text":"

\u70ba\u4e86\u6eff\u8db3\u5217\u7d04\u675f\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u5e03\u6797\u578b\u9663\u5217 cols \u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u6c7a\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u5011\u900f\u904e cols \u5c07\u5df2\u6709\u7687\u540e\u7684\u5217\u9032\u884c\u526a\u679d\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u52d5\u614b\u66f4\u65b0 cols \u7684\u72c0\u614b\u3002

\u90a3\u9ebc\uff0c\u5982\u4f55\u8655\u7406\u5c0d\u89d2\u7dda\u7d04\u675f\u5462\uff1f\u8a2d\u68cb\u76e4\u4e2d\u67d0\u500b\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\((row, col)\\) \uff0c\u9078\u5b9a\u77e9\u9663\u4e2d\u7684\u67d0\u689d\u4e3b\u5c0d\u89d2\u7dda\uff0c\u6211\u5011\u767c\u73fe\u8a72\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u6e1b\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u70ba\u6046\u5b9a\u503c\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5982\u679c\u5169\u500b\u683c\u5b50\u6eff\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5247\u5b83\u5011\u4e00\u5b9a\u8655\u5728\u540c\u4e00\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u3002\u5229\u7528\u8a72\u898f\u5f8b\uff0c\u6211\u5011\u53ef\u4ee5\u85c9\u52a9\u5716 13-18 \u6240\u793a\u7684\u9663\u5217 diags1 \u8a18\u9304\u6bcf\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

\u540c\u7406\uff0c\u6b21\u5c0d\u89d2\u7dda\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6046\u5b9a\u503c\u3002\u6211\u5011\u540c\u6a23\u4e5f\u53ef\u4ee5\u85c9\u52a9\u9663\u5217 diags2 \u4f86\u8655\u7406\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002

\u5716 13-18 \u00a0 \u8655\u7406\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f

"},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u8acb\u6ce8\u610f\uff0c\\(n\\) \u7dad\u65b9\u9663\u4e2d \\(row - col\\) \u7684\u7bc4\u570d\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u7bc4\u570d\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7684\u6578\u91cf\u90fd\u70ba \\(2n - 1\\) \uff0c\u5373\u9663\u5217 diags1 \u548c diags2 \u7684\u9577\u5ea6\u90fd\u70ba \\(2n - 1\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u8d70\u8a2a\u6240\u6709\u5217\n    for col in range(n):\n        # \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
n_queens.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
n_queens.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
n_queens.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
n_queens.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
n_queens.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
n_queens.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
n_queens.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
n_queens.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
n_queens.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
n_queens.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u616e\u5217\u7d04\u675f\uff0c\u5247\u5f9e\u7b2c\u4e00\u884c\u5230\u6700\u5f8c\u4e00\u884c\u5206\u5225\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u500b\u9078\u64c7\uff0c\u4f7f\u7528 \\(O(n!)\\) \u6642\u9593\u3002\u7576\u8a18\u9304\u89e3\u6642\uff0c\u9700\u8981\u8907\u88fd\u77e9\u9663 state \u4e26\u65b0\u589e\u9032 res \uff0c\u8907\u88fd\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002\u56e0\u6b64\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n! \\cdot n^2)\\) \u3002\u5be6\u969b\u4e0a\uff0c\u6839\u64da\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u526a\u679d\u4e5f\u80fd\u5920\u5927\u5e45\u7e2e\u5c0f\u641c\u5c0b\u7a7a\u9593\uff0c\u56e0\u800c\u641c\u5c0b\u6548\u7387\u5f80\u5f80\u512a\u65bc\u4ee5\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u3002

\u9663\u5217 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff0c\u9663\u5217 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u554f\u984c","text":"

\u5168\u6392\u5217\u554f\u984c\u662f\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u7684\u5b9a\u7fa9\u662f\u5728\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff08\u5982\u4e00\u500b\u9663\u5217\u6216\u5b57\u4e32\uff09\u7684\u60c5\u6cc1\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u8868 13-2 \u5217\u8209\u4e86\u5e7e\u500b\u793a\u4f8b\u8cc7\u6599\uff0c\u5305\u62ec\u8f38\u5165\u9663\u5217\u548c\u5c0d\u61c9\u7684\u6240\u6709\u6392\u5217\u3002

\u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

\u8f38\u5165\u9663\u5217 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u7121\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\u3002\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u5011\u5148\u9078\u64c7 \\(1\\) \uff0c\u518d\u9078\u64c7 \\(3\\) \uff0c\u6700\u5f8c\u9078\u64c7 \\(2\\) \uff0c\u5247\u7372\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u92b7\u4e00\u500b\u9078\u64c7\uff0c\u4e4b\u5f8c\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002

\u5f9e\u56de\u6eaf\u7a0b\u5f0f\u78bc\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9078\u96c6\u5408 choices \u662f\u8f38\u5165\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72c0\u614b state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9078\u64c7\u7684\u5143\u7d20\u3002\u8acb\u6ce8\u610f\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u5141\u8a31\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u61c9\u8a72\u662f\u552f\u4e00\u7684\u3002

\u5982\u5716 13-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u641c\u5c0b\u904e\u7a0b\u5c55\u958b\u6210\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u7576\u524d\u72c0\u614b state \u3002\u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u7d93\u904e\u4e09\u8f2a\u9078\u64c7\u5f8c\u5230\u9054\u8449\u7bc0\u9ede\uff0c\u6bcf\u500b\u8449\u7bc0\u9ede\u90fd\u5c0d\u61c9\u4e00\u500b\u6392\u5217\u3002

\u5716 13-5 \u00a0 \u5168\u6392\u5217\u7684\u905e\u8ff4\u6a39

"},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u8907\u9078\u64c7\u526a\u679d","text":"

\u70ba\u4e86\u5be6\u73fe\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u6211\u5011\u8003\u616e\u5f15\u5165\u4e00\u500b\u5e03\u6797\u578b\u9663\u5217 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9078\u64c7\uff0c\u4e26\u57fa\u65bc\u5b83\u5be6\u73fe\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

  • \u5728\u505a\u51fa\u9078\u64c7 choice[i] \u5f8c\uff0c\u6211\u5011\u5c31\u5c07 selected[i] \u8ce6\u503c\u70ba \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9078\u64c7\u3002
  • \u8d70\u8a2a\u9078\u64c7\u4e32\u5217 choices \u6642\uff0c\u8df3\u904e\u6240\u6709\u5df2\u88ab\u9078\u64c7\u7684\u7bc0\u9ede\uff0c\u5373\u526a\u679d\u3002

\u5982\u5716 13-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u7b2c\u4e00\u8f2a\u9078\u64c7 1 \uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7 3 \uff0c\u7b2c\u4e09\u8f2a\u9078\u64c7 2 \uff0c\u5247\u9700\u8981\u5728\u7b2c\u4e8c\u8f2a\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f2a\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

\u5716 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

\u89c0\u5bdf\u5716 13-6 \u767c\u73fe\uff0c\u8a72\u526a\u679d\u64cd\u4f5c\u5c07\u641c\u5c0b\u7a7a\u9593\u5927\u5c0f\u5f9e \\(O(n^n)\\) \u6e1b\u5c0f\u81f3 \\(O(n!)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u60f3\u6e05\u695a\u4ee5\u4e0a\u8cc7\u8a0a\u4e4b\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u70ba\u4e86\u7e2e\u77ed\u6574\u9ad4\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4e0d\u55ae\u7368\u5be6\u73fe\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u7684\u5404\u500b\u51fd\u5f0f\uff0c\u800c\u662f\u5c07\u5b83\u5011\u5c55\u958b\u5728 backtrack() \u51fd\u5f0f\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if not selected[i]:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_i.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_i.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_i.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_i.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_i.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_i.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_i.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    if (!selected[i]) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_i.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_i.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_i.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
permutations_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u616e\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u8907\u7684\u6392\u5217\u3002

\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 1, 2]\\) \u3002\u70ba\u4e86\u65b9\u4fbf\u5340\u5206\u5169\u500b\u91cd\u8907\u5143\u7d20 \\(1\\) \uff0c\u6211\u5011\u5c07\u7b2c\u4e8c\u500b \\(1\\) \u8a18\u70ba \\(\\hat{1}\\) \u3002

\u5982\u5716 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u8907\u7684\u3002

\u5716 13-7 \u00a0 \u91cd\u8907\u6392\u5217

\u90a3\u9ebc\u5982\u4f55\u53bb\u9664\u91cd\u8907\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408\uff0c\u76f4\u63a5\u5c0d\u6392\u5217\u7d50\u679c\u9032\u884c\u53bb\u91cd\u3002\u7136\u800c\u9019\u6a23\u505a\u4e0d\u5920\u512a\u96c5\uff0c\u56e0\u70ba\u751f\u6210\u91cd\u8907\u6392\u5217\u7684\u641c\u5c0b\u5206\u652f\u6c92\u6709\u5fc5\u8981\uff0c\u61c9\u7576\u63d0\u524d\u8b58\u5225\u4e26\u526a\u679d\uff0c\u9019\u6a23\u53ef\u4ee5\u9032\u4e00\u6b65\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002

"},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u89c0\u5bdf\u5716 13-8 \uff0c\u5728\u7b2c\u4e00\u8f2a\u4e2d\uff0c\u9078\u64c7 \\(1\\) \u6216\u9078\u64c7 \\(\\hat{1}\\) \u662f\u7b49\u50f9\u7684\uff0c\u5728\u9019\u5169\u500b\u9078\u64c7\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u8907\u7684\u3002\u56e0\u6b64\u61c9\u8a72\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

\u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(2\\) \u4e4b\u5f8c\uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u61c9\u5c07\u7b2c\u4e8c\u8f2a\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u5728\u67d0\u4e00\u8f2a\u9078\u64c7\u4e2d\uff0c\u4fdd\u8b49\u591a\u500b\u76f8\u7b49\u7684\u5143\u7d20\u50c5\u88ab\u9078\u64c7\u4e00\u6b21\u3002

\u5716 13-8 \u00a0 \u91cd\u8907\u6392\u5217\u526a\u679d

"},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5728\u4e0a\u4e00\u984c\u7684\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u8003\u616e\u5728\u6bcf\u4e00\u8f2a\u9078\u64c7\u4e2d\u958b\u555f\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 duplicated \uff0c\u7528\u65bc\u8a18\u9304\u8a72\u8f2a\u4e2d\u5df2\u7d93\u5617\u8a66\u904e\u7684\u5143\u7d20\uff0c\u4e26\u5c07\u91cd\u8907\u5143\u7d20\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice)  # \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
permutations_ii.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.emplace(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
permutations_ii.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
permutations_ii.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.Add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
permutations_ii.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
permutations_ii.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
permutations_ii.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
permutations_ii.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
permutations_ii.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
permutations_ii.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated[choice] = true; // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
permutations_ii.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
permutations_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
permutations_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5047\u8a2d\u5143\u7d20\u5169\u5169\u4e4b\u9593\u4e92\u4e0d\u76f8\u540c\uff0c\u5247 \\(n\\) \u500b\u5143\u7d20\u5171\u6709 \\(n!\\) \u7a2e\u6392\u5217\uff08\u968e\u4e58\uff09\uff1b\u5728\u8a18\u9304\u7d50\u679c\u6642\uff0c\u9700\u8981\u8907\u88fd\u9577\u5ea6\u70ba \\(n\\) \u7684\u4e32\u5217\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n!n)\\) \u3002

\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u540c\u4e00\u6642\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u500b duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\u3002\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u5169\u7a2e\u526a\u679d\u5c0d\u6bd4","text":"

\u8acb\u6ce8\u610f\uff0c\u96d6\u7136 selected \u548c duplicated \u90fd\u7528\u65bc\u526a\u679d\uff0c\u4f46\u5169\u8005\u7684\u76ee\u6a19\u4e0d\u540c\u3002

  • \u91cd\u8907\u9078\u64c7\u526a\u679d\uff1a\u6574\u500b\u641c\u5c0b\u904e\u7a0b\u4e2d\u53ea\u6709\u4e00\u500b selected \u3002\u5b83\u8a18\u9304\u7684\u662f\u7576\u524d\u72c0\u614b\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u500b\u5143\u7d20\u5728 state \u4e2d\u91cd\u8907\u51fa\u73fe\u3002
  • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f2a\u9078\u64c7\uff08\u6bcf\u500b\u547c\u53eb\u7684 backtrack \u51fd\u5f0f\uff09\u90fd\u5305\u542b\u4e00\u500b duplicated \u3002\u5b83\u8a18\u9304\u7684\u662f\u5728\u672c\u8f2a\u8d70\u8a2a\uff08for \u8ff4\u5708\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9078\u64c7\u904e\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8b49\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002

\u5716 13-9 \u5c55\u793a\u4e86\u5169\u500b\u526a\u679d\u689d\u4ef6\u7684\u751f\u6548\u7bc4\u570d\u3002\u6ce8\u610f\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u9078\u64c7\uff0c\u5f9e\u6839\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\u69cb\u6210\u4e00\u500b\u6392\u5217\u3002

\u5716 13-9 \u00a0 \u5169\u7a2e\u526a\u679d\u689d\u4ef6\u7684\u4f5c\u7528\u7bc4\u570d

"},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u7121\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ef\u4ee5\u88ab\u9078\u53d6\u591a\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

\u4f8b\u5982\uff0c\u8f38\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6a19\u6574\u6578 \\(9\\) \uff0c\u89e3\u70ba \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

  • \u8f38\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u91cd\u8907\u9078\u53d6\u3002
  • \u5b50\u96c6\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u500b\u5b50\u96c6\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c3\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

\u985e\u4f3c\u65bc\u5168\u6392\u5217\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\uff0c\u4e26\u5728\u9078\u64c7\u904e\u7a0b\u4e2d\u5be6\u6642\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u7576\u5143\u7d20\u548c\u7b49\u65bc target \u6642\uff0c\u5c31\u5c07\u5b50\u96c6\u8a18\u9304\u81f3\u7d50\u679c\u4e32\u5217\u3002

\u800c\u8207\u5168\u6392\u5217\u554f\u984c\u4e0d\u540c\u7684\u662f\uff0c\u672c\u984c\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u9078\u53d6\uff0c\u56e0\u6b64\u7121\u9808\u85c9\u52a9 selected \u5e03\u6797\u4e32\u5217\u4f86\u8a18\u9304\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9078\u64c7\u3002\u6211\u5011\u53ef\u4ee5\u5c0d\u5168\u6392\u5217\u7a0b\u5f0f\u78bc\u9032\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u984c\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
subset_sum_i_naive.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i_naive.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
subset_sum_i_naive.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
subset_sum_i_naive.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
subset_sum_i_naive.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
subset_sum_i_naive.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6578\u91cf\u70ba0\n    backtrack(target, 0, nums, numsSize);\n}\n
subset_sum_i_naive.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
subset_sum_i_naive.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
subset_sum_i_naive.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5411\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u8f38\u5165\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u8f38\u51fa\u7d50\u679c\u70ba \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u96d6\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u70ba \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u8907\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

\u9019\u662f\u56e0\u70ba\u641c\u5c0b\u904e\u7a0b\u662f\u5340\u5206\u9078\u64c7\u9806\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u5340\u5206\u9078\u64c7\u9806\u5e8f\u3002\u5982\u5716 13-10 \u6240\u793a\uff0c\u5148\u9078 \\(4\\) \u5f8c\u9078 \\(5\\) \u8207\u5148\u9078 \\(5\\) \u5f8c\u9078 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5c0d\u61c9\u540c\u4e00\u500b\u5b50\u96c6\u3002

\u5716 13-10 \u00a0 \u5b50\u96c6\u641c\u5c0b\u8207\u8d8a\u754c\u526a\u679d

\u70ba\u4e86\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u601d\u8def\u662f\u5c0d\u7d50\u679c\u4e32\u5217\u9032\u884c\u53bb\u91cd\u3002\u4f46\u9019\u500b\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u5169\u65b9\u9762\u539f\u56e0\u3002

  • \u7576\u9663\u5217\u5143\u7d20\u8f03\u591a\uff0c\u5c24\u5176\u662f\u7576 target \u8f03\u5927\u6642\uff0c\u641c\u5c0b\u904e\u7a0b\u6703\u7522\u751f\u5927\u91cf\u7684\u91cd\u8907\u5b50\u96c6\u3002
  • \u6bd4\u8f03\u5b50\u96c6\uff08\u9663\u5217\uff09\u7684\u7570\u540c\u975e\u5e38\u8017\u6642\uff0c\u9700\u8981\u5148\u6392\u5e8f\u9663\u5217\uff0c\u518d\u6bd4\u8f03\u9663\u5217\u4e2d\u6bcf\u500b\u5143\u7d20\u7684\u7570\u540c\u3002
"},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u8907\u5b50\u96c6\u526a\u679d","text":"

\u6211\u5011\u8003\u616e\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u900f\u904e\u526a\u679d\u9032\u884c\u53bb\u91cd\u3002\u89c0\u5bdf\u5716 13-11 \uff0c\u91cd\u8907\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u9806\u5e8f\u9078\u64c7\u9663\u5217\u5143\u7d20\u6642\u7522\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u6cc1\u3002

  1. \u7576\u7b2c\u4e00\u8f2a\u548c\u7b2c\u4e8c\u8f2a\u5206\u5225\u9078\u64c7 \\(3\\) \u548c \\(4\\) \u6642\uff0c\u6703\u751f\u6210\u5305\u542b\u9019\u5169\u500b\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8a18\u70ba \\([3, 4, \\dots]\\) \u3002
  2. \u4e4b\u5f8c\uff0c\u7576\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(4\\) \u6642\uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \uff0c\u56e0\u70ba\u8a72\u9078\u64c7\u7522\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c64\u7684\u9078\u64c7\u90fd\u662f\u5f9e\u5de6\u5230\u53f3\u88ab\u9010\u500b\u5617\u8a66\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

  1. \u524d\u5169\u8f2a\u9078\u64c7 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
  2. \u524d\u5169\u8f2a\u9078\u64c7 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
  3. \u82e5\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(5\\) \uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u70ba\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u8207\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

\u5716 13-11 \u00a0 \u4e0d\u540c\u9078\u64c7\u9806\u5e8f\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

\u7e3d\u7d50\u4f86\u770b\uff0c\u7d66\u5b9a\u8f38\u5165\u9663\u5217 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8a2d\u641c\u5c0b\u904e\u7a0b\u4e2d\u7684\u9078\u64c7\u5e8f\u5217\u70ba \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5247\u8a72\u9078\u64c7\u5e8f\u5217\u9700\u8981\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6eff\u8db3\u8a72\u689d\u4ef6\u7684\u9078\u64c7\u5e8f\u5217\u90fd\u6703\u9020\u6210\u91cd\u8907\uff0c\u61c9\u7576\u526a\u679d\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u70ba\u5be6\u73fe\u8a72\u526a\u679d\uff0c\u6211\u5011\u521d\u59cb\u5316\u8b8a\u6578 start \uff0c\u7528\u65bc\u6307\u793a\u8d70\u8a2a\u8d77\u59cb\u9ede\u3002\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i\\) \u958b\u59cb\u8d70\u8a2a\u3002\u9019\u6a23\u505a\u5c31\u53ef\u4ee5\u8b93\u9078\u64c7\u5e8f\u5217\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u5f9e\u800c\u4fdd\u8b49\u5b50\u96c6\u552f\u4e00\u3002

\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u5011\u9084\u5c0d\u7a0b\u5f0f\u78bc\u9032\u884c\u4e86\u4ee5\u4e0b\u5169\u9805\u6700\u4f73\u5316\u3002

  • \u5728\u958b\u555f\u641c\u5c0b\u524d\uff0c\u5148\u5c07\u9663\u5217 nums \u6392\u5e8f\u3002\u5728\u8d70\u8a2a\u6240\u6709\u9078\u64c7\u6642\uff0c\u7576\u5b50\u96c6\u548c\u8d85\u904e target \u6642\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\uff0c\u56e0\u70ba\u5f8c\u908a\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target \u3002
  • \u7701\u53bb\u5143\u7d20\u548c\u8b8a\u6578 total \uff0c\u900f\u904e\u5728 target \u4e0a\u57f7\u884c\u6e1b\u6cd5\u4f86\u7d71\u8a08\u5143\u7d20\u548c\uff0c\u7576 target \u7b49\u65bc \\(0\\) \u6642\u8a18\u9304\u89e3\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_i.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_i.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_i.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_i.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_i.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_i.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                           // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    backtrack(target, nums, numsSize, start);\n}\n
subset_sum_i.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_i.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
subset_sum_i.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-12 \u6240\u793a\u70ba\u5c07\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u8f38\u5165\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u5f8c\u7684\u6574\u9ad4\u56de\u6eaf\u904e\u7a0b\u3002

\u5716 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u904e\u7a0b

"},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u616e\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u53ef\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

\u76f8\u6bd4\u65bc\u4e0a\u984c\uff0c\u672c\u984c\u7684\u8f38\u5165\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u9019\u5f15\u5165\u4e86\u65b0\u7684\u554f\u984c\u3002\u4f8b\u5982\uff0c\u7d66\u5b9a\u9663\u5217 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u5247\u73fe\u6709\u7a0b\u5f0f\u78bc\u7684\u8f38\u51fa\u7d50\u679c\u70ba \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73fe\u4e86\u91cd\u8907\u5b50\u96c6\u3002

\u9020\u6210\u9019\u7a2e\u91cd\u8907\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f2a\u4e2d\u88ab\u591a\u6b21\u9078\u64c7\u3002\u5728\u5716 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f2a\u5171\u6709\u4e09\u500b\u9078\u64c7\uff0c\u5176\u4e2d\u5169\u500b\u90fd\u70ba \\(4\\) \uff0c\u6703\u7522\u751f\u5169\u500b\u91cd\u8907\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5f9e\u800c\u8f38\u51fa\u91cd\u8907\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f2a\u7684\u5169\u500b \\(4\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002

\u5716 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

"},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

\u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5be6\u73fe\u65b9\u5f0f\u6bd4\u8f03\u5de7\u5999\uff1a\u7531\u65bc\u9663\u5217\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u9130\u7684\u3002\u9019\u610f\u5473\u8457\u5728\u67d0\u8f2a\u9078\u64c7\u4e2d\uff0c\u82e5\u7576\u524d\u5143\u7d20\u8207\u5176\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u5247\u8aaa\u660e\u5b83\u5df2\u7d93\u88ab\u9078\u64c7\u904e\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u904e\u7576\u524d\u5143\u7d20\u3002

\u8207\u6b64\u540c\u6642\uff0c\u672c\u984c\u898f\u5b9a\u6bcf\u500b\u9663\u5217\u5143\u7d20\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5e78\u904b\u7684\u662f\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u5229\u7528\u8b8a\u6578 start \u4f86\u6eff\u8db3\u8a72\u7d04\u675f\uff1a\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i + 1\\) \u958b\u59cb\u5411\u5f8c\u8d70\u8a2a\u3002\u9019\u6a23\u65e2\u80fd\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u8907\u9078\u64c7\u5143\u7d20\u3002

"},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
subset_sum_ii.cpp
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.java
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.cs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.go
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
subset_sum_ii.swift
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
subset_sum_ii.js
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.ts
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
subset_sum_ii.dart
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
subset_sum_ii.rs
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
subset_sum_ii.c
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u8df3\u904e\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u958b\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
subset_sum_ii.kt
/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
subset_sum_ii.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
subset_sum_ii.zig
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 13-14 \u5c55\u793a\u4e86\u9663\u5217 \\([4, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u904e\u7a0b\uff0c\u5171\u5305\u542b\u56db\u7a2e\u526a\u679d\u64cd\u4f5c\u3002\u8acb\u4f60\u5c07\u5716\u793a\u8207\u7a0b\u5f0f\u78bc\u8a3b\u91cb\u76f8\u7d50\u5408\uff0c\u7406\u89e3\u6574\u500b\u641c\u5c0b\u904e\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u7a2e\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

\u5716 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u904e\u7a0b

"},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u662f\u7aae\u8209\u6cd5\uff0c\u900f\u904e\u5c0d\u89e3\u7a7a\u9593\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4f86\u5c0b\u627e\u7b26\u5408\u689d\u4ef6\u7684\u89e3\u3002\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u9047\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u5247\u8a18\u9304\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u8d70\u8a2a\u5b8c\u6210\u5f8c\u7d50\u675f\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u641c\u5c0b\u904e\u7a0b\u5305\u62ec\u5617\u8a66\u8207\u56de\u9000\u5169\u500b\u90e8\u5206\u3002\u5b83\u900f\u904e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4f86\u5617\u8a66\u5404\u7a2e\u9078\u64c7\uff0c\u7576\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u60c5\u6cc1\u6642\uff0c\u5247\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002\u5617\u8a66\u8207\u56de\u9000\u662f\u5169\u500b\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
  • \u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u5b83\u5011\u53ef\u7528\u65bc\u5be6\u73fe\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7d50\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u5c0b\u6548\u7387\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u65bc\u89e3\u6c7a\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u3002\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u96d6\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u6f14\u7b97\u6cd5\u89e3\u6c7a\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
  • \u5168\u6392\u5217\u554f\u984c\u65e8\u5728\u641c\u5c0b\u7d66\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u500b\u5143\u7d20\u662f\u5426\u88ab\u9078\u64c7\uff0c\u526a\u6389\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\u7684\u641c\u5c0b\u5206\u652f\uff0c\u78ba\u4fdd\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002
  • \u5728\u5168\u6392\u5217\u554f\u984c\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff0c\u5247\u6700\u7d42\u7d50\u679c\u6703\u51fa\u73fe\u91cd\u8907\u6392\u5217\u3002\u6211\u5011\u9700\u8981\u7d04\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u9019\u901a\u5e38\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408\u4f86\u5be6\u73fe\u3002
  • \u5b50\u96c6\u548c\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u7d66\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u70ba\u76ee\u6a19\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u800c\u641c\u5c0b\u904e\u7a0b\u6703\u8f38\u51fa\u6240\u6709\u9806\u5e8f\u7684\u7d50\u679c\uff0c\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002\u6211\u5011\u5728\u56de\u6eaf\u524d\u5c07\u8cc7\u6599\u9032\u884c\u6392\u5e8f\uff0c\u4e26\u8a2d\u5b9a\u4e00\u500b\u8b8a\u6578\u4f86\u6307\u793a\u6bcf\u4e00\u8f2a\u7684\u8d70\u8a2a\u8d77\u59cb\u9ede\uff0c\u5f9e\u800c\u5c07\u751f\u6210\u91cd\u8907\u5b50\u96c6\u7684\u641c\u5c0b\u5206\u652f\u9032\u884c\u526a\u679d\u3002
  • \u5c0d\u65bc\u5b50\u96c6\u548c\u554f\u984c\uff0c\u9663\u5217\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u6703\u7522\u751f\u91cd\u8907\u96c6\u5408\u3002\u6211\u5011\u5229\u7528\u9663\u5217\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\uff0c\u900f\u904e\u5224\u65b7\u76f8\u9130\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5be6\u73fe\u526a\u679d\uff0c\u5f9e\u800c\u78ba\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u4e2d\u4e00\u6b21\u3002
  • \\(n\\) \u7687\u540e\u554f\u984c\u65e8\u5728\u5c0b\u627e\u5c07 \\(n\\) \u500b\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76e4\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u5169\u5169\u4e4b\u9593\u7121\u6cd5\u653b\u64ca\u5c0d\u65b9\u3002\u8a72\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6\u6709\u884c\u7d04\u675f\u3001\u5217\u7d04\u675f\u3001\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002\u70ba\u6eff\u8db3\u884c\u7d04\u675f\uff0c\u6211\u5011\u63a1\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8b49\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002
  • \u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u8655\u7406\u65b9\u5f0f\u985e\u4f3c\u3002\u5c0d\u65bc\u5217\u7d04\u675f\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u5f9e\u800c\u6307\u793a\u9078\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5c0d\u65bc\u5c0d\u89d2\u7dda\u7d04\u675f\uff0c\u6211\u5011\u85c9\u52a9\u5169\u500b\u9663\u5217\u4f86\u5206\u5225\u8a18\u9304\u8a72\u4e3b\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96e3\u9ede\u5728\u65bc\u627e\u8655\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5c0d\u89d2\u7dda\u4e0a\u683c\u5b50\u6eff\u8db3\u7684\u884c\u5217\u7d22\u5f15\u898f\u5f8b\u3002
"},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u600e\u9ebc\u7406\u89e3\u56de\u6eaf\u548c\u905e\u8ff4\u7684\u95dc\u4fc2\uff1f

\u7e3d\u7684\u4f86\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u7a2e\u201c\u6f14\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u905e\u8ff4\u66f4\u50cf\u662f\u4e00\u500b\u201c\u5de5\u5177\u201d\u3002

  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u905e\u8ff4\u7684\u61c9\u7528\u5834\u666f\u4e4b\u4e00\uff0c\u662f\u905e\u8ff4\u5728\u641c\u5c0b\u554f\u984c\u4e2d\u7684\u61c9\u7528\u3002
  • \u905e\u8ff4\u7684\u7d50\u69cb\u9ad4\u73fe\u4e86\u201c\u5b50\u554f\u984c\u5206\u89e3\u201d\u7684\u89e3\u984c\u7bc4\u5f0f\uff0c\u5e38\u7528\u65bc\u89e3\u6c7a\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\uff08\u8a18\u61b6\u5316\u905e\u8ff4\uff09\u7b49\u554f\u984c\u3002
"},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

Abstract

\u8907\u96dc\u5ea6\u5206\u6790\u7336\u5982\u6d69\u701a\u7684\u6f14\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u6642\u7a7a\u56ae\u5c0e\u3002

\u5b83\u5e36\u9818\u6211\u5011\u5728\u6642\u9593\u8207\u7a7a\u9593\u9019\u5169\u500b\u7dad\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5c0b\u627e\u66f4\u512a\u96c5\u7684\u89e3\u6c7a\u65b9\u6848\u3002

"},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30
  • 2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4
  • 2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6
  • 2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6
  • 2.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4","text":"

\u5728\u6f14\u7b97\u6cd5\u4e2d\uff0c\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u662f\u5f88\u5e38\u898b\u7684\uff0c\u5b83\u8207\u8907\u96dc\u5ea6\u5206\u6790\u606f\u606f\u76f8\u95dc\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7d39\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u4e4b\u524d\uff0c\u6211\u5011\u5148\u4f86\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5f0f\u4e2d\u5be6\u73fe\u91cd\u8907\u57f7\u884c\u4efb\u52d9\uff0c\u5373\u5169\u7a2e\u57fa\u672c\u7684\u7a0b\u5f0f\u63a7\u5236\u7d50\u69cb\uff1a\u8fed\u4ee3\u3001\u905e\u8ff4\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

\u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u7a2e\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u7684\u63a7\u5236\u7d50\u69cb\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5f0f\u6703\u5728\u6eff\u8db3\u4e00\u5b9a\u7684\u689d\u4ef6\u4e0b\u91cd\u8907\u57f7\u884c\u67d0\u6bb5\u7a0b\u5f0f\u78bc\uff0c\u76f4\u5230\u9019\u500b\u689d\u4ef6\u4e0d\u518d\u6eff\u8db3\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u8ff4\u5708","text":"

for \u8ff4\u5708\u662f\u6700\u5e38\u898b\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9069\u5408\u5728\u9810\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6578\u6642\u4f7f\u7528\u3002

\u4ee5\u4e0b\u51fd\u5f0f\u57fa\u65bc for \u8ff4\u5708\u5be6\u73fe\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7d50\u679c\u4f7f\u7528\u8b8a\u6578 res \u8a18\u9304\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5c0d\u61c9\u7684\u5340\u9593\u662f\u201c\u5de6\u9589\u53f3\u958b\u201d\u7684\uff0c\u5c0d\u61c9\u7684\u8d70\u8a2a\u7bc4\u570d\u70ba \\(a, a + 1, \\dots, b-1\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def for_loop(n: int) -> int:\n    \"\"\"for \u8ff4\u5708\"\"\"\n    res = 0\n    # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
iteration.cpp
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
iteration.java
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.cs
/* for \u8ff4\u5708 */\nint ForLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.go
/* for \u8ff4\u5708 */\nfunc forLoop(n int) int {\n    res := 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
iteration.swift
/* for \u8ff4\u5708 */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
iteration.js
/* for \u8ff4\u5708 */\nfunction forLoop(n) {\n    let res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.ts
/* for \u8ff4\u5708 */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.dart
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n  int res = 0;\n  // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
iteration.rs
/* for \u8ff4\u5708 */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
iteration.c
/* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
iteration.kt
/* for \u8ff4\u5708 */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
iteration.rb
### for \u8ff4\u5708 ###\ndef for_loop(n)\n  res = 0\n\n  # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
iteration.zig
// for \u8ff4\u5708\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-1 \u662f\u8a72\u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716\u3002

\u5716 2-1 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716

\u6b64\u6c42\u548c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6210\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u9019\u500b\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u76f8\u95dc\u5167\u5bb9\u5c07\u6703\u5728\u4e0b\u4e00\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u8ff4\u5708","text":"

\u8207 for \u8ff4\u5708\u985e\u4f3c\uff0cwhile \u8ff4\u5708\u4e5f\u662f\u4e00\u7a2e\u5be6\u73fe\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u7a0b\u5f0f\u6bcf\u8f2a\u90fd\u6703\u5148\u6aa2\u67e5\u689d\u4ef6\uff0c\u5982\u679c\u689d\u4ef6\u70ba\u771f\uff0c\u5247\u7e7c\u7e8c\u57f7\u884c\uff0c\u5426\u5247\u5c31\u7d50\u675f\u8ff4\u5708\u3002

\u4e0b\u9762\u6211\u5011\u7528 while \u8ff4\u5708\u4f86\u5be6\u73fe\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop(n: int) -> int:\n    \"\"\"while \u8ff4\u5708\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    return res\n
iteration.cpp
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.java
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.cs
/* while \u8ff4\u5708 */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.go
/* while \u8ff4\u5708 */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    i := 1\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n    }\n    return res\n}\n
iteration.swift
/* while \u8ff4\u5708 */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res\n}\n
iteration.js
/* while \u8ff4\u5708 */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.ts
/* while \u8ff4\u5708 */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.dart
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n  // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n  }\n  return res;\n}\n
iteration.rs
/* while \u8ff4\u5708 */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    res\n}\n
iteration.c
/* while \u8ff4\u5708 */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res;\n}\n
iteration.kt
/* while \u8ff4\u5708 */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    }\n    return res\n}\n
iteration.rb
### while \u8ff4\u5708 ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n  # \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n  end\n\n  res\nend\n
iteration.zig
// while \u8ff4\u5708\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

while \u8ff4\u5708\u6bd4 for \u8ff4\u5708\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u81ea\u7531\u5730\u8a2d\u8a08\u689d\u4ef6\u8b8a\u6578\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9a5f\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u689d\u4ef6\u8b8a\u6578 \\(i\\) \u6bcf\u8f2a\u9032\u884c\u5169\u6b21\u66f4\u65b0\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u8ff4\u5708\u5be6\u73fe\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def while_loop_ii(n: int) -> int:\n    \"\"\"while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    # \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1\n        i *= 2\n    return res\n
iteration.cpp
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.java
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.cs
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
iteration.go
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    i := 1\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.swift
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
iteration.js
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.ts
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.dart
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n  // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
iteration.rs
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
iteration.c
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
iteration.kt
/* while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i++\n        i *= 2\n    }\n    return res\n}\n
iteration.rb
### while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n\n  # \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
iteration.zig
//  while \u8ff4\u5708\uff08\u5169\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u689d\u4ef6\u8b8a\u6578\n    // \u8ff4\u5708\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u689d\u4ef6\u8b8a\u6578\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u7684\u4f86\u8aaa\uff0cfor \u8ff4\u5708\u7684\u7a0b\u5f0f\u78bc\u66f4\u52a0\u7dca\u6e4a\uff0cwhile \u8ff4\u5708\u66f4\u52a0\u9748\u6d3b\uff0c\u5169\u8005\u90fd\u53ef\u4ee5\u5be6\u73fe\u8fed\u4ee3\u7d50\u69cb\u3002\u9078\u64c7\u4f7f\u7528\u54ea\u4e00\u500b\u61c9\u8a72\u6839\u64da\u7279\u5b9a\u554f\u984c\u7684\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5de2\u72c0\u8ff4\u5708","text":"

\u6211\u5011\u53ef\u4ee5\u5728\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\u5167\u5de2\u72c0\u53e6\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\uff0c\u4e0b\u9762\u4ee5 for \u8ff4\u5708\u70ba\u4f8b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
def nested_for_loop(n: int) -> str:\n    \"\"\"\u96d9\u5c64 for \u8ff4\u5708\"\"\"\n    res = \"\"\n    # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
iteration.cpp
/* \u96d9\u5c64 for \u8ff4\u5708 */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
iteration.java
/* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
iteration.cs
/* \u96d9\u5c64 for \u8ff4\u5708 */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
iteration.go
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
iteration.swift
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
iteration.js
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.ts
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
iteration.dart
/* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
iteration.rs
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
iteration.c
/* \u96d9\u5c64 for \u8ff4\u5708 */\nchar *nestedForLoop(int n) {\n    // n * n \u70ba\u5c0d\u61c9\u9ede\u6578\u91cf\uff0c\"(i, j), \" \u5c0d\u61c9\u5b57\u4e32\u9577\u6700\u5927\u70ba 6+10*2\uff0c\u52a0\u4e0a\u6700\u5f8c\u4e00\u500b\u7a7a\u5b57\u5143 \\0 \u7684\u984d\u5916\u7a7a\u9593\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
iteration.kt
/* \u96d9\u5c64 for \u8ff4\u5708 */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
iteration.rb
### \u96d9\u5c64 for \u8ff4\u5708 ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u8ff4\u5708 j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
iteration.zig
// \u96d9\u5c64 for \u8ff4\u5708\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-2 \u662f\u8a72\u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716\u3002

\u5716 2-2 \u00a0 \u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716

\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207 \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u548c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u95dc\u4fc2\u201d\u3002

\u6211\u5011\u53ef\u4ee5\u7e7c\u7e8c\u65b0\u589e\u5de2\u72c0\u8ff4\u5708\uff0c\u6bcf\u4e00\u6b21\u5de2\u72c0\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7dad\u201d\uff0c\u5c07\u6703\u4f7f\u6642\u9593\u8907\u96dc\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u95dc\u4fc2\u201d\u201c\u56db\u6b21\u65b9\u95dc\u4fc2\u201d\uff0c\u4ee5\u6b64\u985e\u63a8\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u905e\u8ff4","text":"

\u905e\u8ff4\uff08recursion\uff09\u662f\u4e00\u7a2e\u6f14\u7b97\u6cd5\u7b56\u7565\uff0c\u900f\u904e\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\u4f86\u89e3\u6c7a\u554f\u984c\u3002\u5b83\u4e3b\u8981\u5305\u542b\u5169\u500b\u968e\u6bb5\u3002

  1. \u905e\uff1a\u7a0b\u5f0f\u4e0d\u65b7\u6df1\u5165\u5730\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u50b3\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\uff0c\u76f4\u5230\u9054\u5230\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u3002
  2. \u8ff4\uff1a\u89f8\u767c\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u5f8c\uff0c\u7a0b\u5f0f\u5f9e\u6700\u6df1\u5c64\u7684\u905e\u8ff4\u51fd\u5f0f\u958b\u59cb\u9010\u5c64\u8fd4\u56de\uff0c\u532f\u805a\u6bcf\u4e00\u5c64\u7684\u7d50\u679c\u3002

\u800c\u5f9e\u5be6\u73fe\u7684\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u7a0b\u5f0f\u78bc\u4e3b\u8981\u5305\u542b\u4e09\u500b\u8981\u7d20\u3002

  1. \u7d42\u6b62\u689d\u4ef6\uff1a\u7528\u65bc\u6c7a\u5b9a\u4ec0\u9ebc\u6642\u5019\u7531\u201c\u905e\u201d\u8f49\u201c\u8ff4\u201d\u3002
  2. \u905e\u8ff4\u547c\u53eb\uff1a\u5c0d\u61c9\u201c\u905e\u201d\uff0c\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u8f38\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\u3002
  3. \u8fd4\u56de\u7d50\u679c\uff1a\u5c0d\u61c9\u201c\u8ff4\u201d\uff0c\u5c07\u7576\u524d\u905e\u8ff4\u5c64\u7d1a\u7684\u7d50\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c64\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u53ea\u9700\u547c\u53eb\u51fd\u5f0f recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8a08\u7b97\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def recur(n: int) -> int:\n    \"\"\"\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 1:\n        return 1\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res = recur(n - 1)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n
recursion.cpp
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.java
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.cs
/* \u905e\u8ff4 */\nint Recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = Recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.go
/* \u905e\u8ff4 */\nfunc recur(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res := recur(n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.swift
/* \u905e\u8ff4 */\nfunc recur(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n: n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.js
/* \u905e\u8ff4 */\nfunction recur(n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.ts
/* \u905e\u8ff4 */\nfunction recur(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.dart
/* \u905e\u8ff4 */\nint recur(int n) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 1) return 1;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  int res = recur(n - 1);\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  return n + res;\n}\n
recursion.rs
/* \u905e\u8ff4 */\nfn recur(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    n + res\n}\n
recursion.c
/* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
recursion.kt
/* \u905e\u8ff4 */\nfun recur(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    val res = recur(n - 1)\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
recursion.rb
### \u905e\u8ff4 ###\ndef recur(n)\n  # \u7d42\u6b62\u689d\u4ef6\n  return 1 if n == 1\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  res = recur(n - 1)\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  n + res\nend\n
recursion.zig
// \u905e\u8ff4\u51fd\u5f0f\nfn recur(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var res: i32 = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-3 \u5c55\u793a\u4e86\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b\u3002

\u5716 2-3 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b

\u96d6\u7136\u5f9e\u8a08\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u8207\u905e\u8ff4\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7d50\u679c\uff0c\u4f46\u5b83\u5011\u4ee3\u8868\u4e86\u5169\u7a2e\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u6c7a\u554f\u984c\u7684\u7bc4\u5f0f\u3002

  • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5f9e\u6700\u57fa\u790e\u7684\u6b65\u9a5f\u958b\u59cb\uff0c\u7136\u5f8c\u4e0d\u65b7\u91cd\u8907\u6216\u7d2f\u52a0\u9019\u4e9b\u6b65\u9a5f\uff0c\u76f4\u5230\u4efb\u52d9\u5b8c\u6210\u3002
  • \u905e\u8ff4\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u9019\u4e9b\u5b50\u554f\u984c\u548c\u539f\u554f\u984c\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u4f86\u5c07\u5b50\u554f\u984c\u7e7c\u7e8c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u6cc1\u6642\u505c\u6b62\uff08\u57fa\u672c\u60c5\u6cc1\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

\u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u5f0f\u70ba\u4f8b\uff0c\u8a2d\u554f\u984c \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

  • \u8fed\u4ee3\uff1a\u5728\u8ff4\u5708\u4e2d\u6a21\u64ec\u6c42\u548c\u904e\u7a0b\uff0c\u5f9e \\(1\\) \u8d70\u8a2a\u5230 \\(n\\) \uff0c\u6bcf\u8f2a\u57f7\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
  • \u905e\u8ff4\uff1a\u5c07\u554f\u984c\u5206\u89e3\u70ba\u5b50\u554f\u984c \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65b7\uff08\u905e\u8ff4\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u6cc1 \\(f(1) = 1\\) \u6642\u7d42\u6b62\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u547c\u53eb\u5806\u758a","text":"

\u905e\u8ff4\u51fd\u5f0f\u6bcf\u6b21\u547c\u53eb\u81ea\u8eab\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u70ba\u65b0\u958b\u555f\u7684\u51fd\u5f0f\u5206\u914d\u8a18\u61b6\u9ad4\uff0c\u4ee5\u5132\u5b58\u5340\u57df\u6027\u8b8a\u6578\u3001\u547c\u53eb\u4f4d\u5740\u548c\u5176\u4ed6\u8cc7\u8a0a\u7b49\u3002\u9019\u5c07\u5c0e\u81f4\u5169\u65b9\u9762\u7684\u7d50\u679c\u3002

  • \u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u90fd\u5132\u5b58\u5728\u7a31\u70ba\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u7684\u8a18\u61b6\u9ad4\u5340\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u5f0f\u8fd4\u56de\u5f8c\u624d\u6703\u88ab\u91cb\u653e\u3002\u56e0\u6b64\uff0c\u905e\u8ff4\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u905e\u8ff4\u547c\u53eb\u51fd\u5f0f\u6703\u7522\u751f\u984d\u5916\u7684\u958b\u92b7\u3002\u56e0\u6b64\u905e\u8ff4\u901a\u5e38\u6bd4\u8ff4\u5708\u7684\u6642\u9593\u6548\u7387\u66f4\u4f4e\u3002

\u5982\u5716 2-4 \u6240\u793a\uff0c\u5728\u89f8\u767c\u7d42\u6b62\u689d\u4ef6\u524d\uff0c\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u51fd\u5f0f\uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002

\u5716 2-4 \u00a0 \u905e\u8ff4\u547c\u53eb\u6df1\u5ea6

\u5728\u5be6\u969b\u4e2d\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u5141\u8a31\u7684\u905e\u8ff4\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u904e\u6df1\u7684\u905e\u8ff4\u53ef\u80fd\u5c0e\u81f4\u5806\u758a\u6ea2\u4f4d\u932f\u8aa4\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u905e\u8ff4","text":"

\u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u5f0f\u5728\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u6b65\u624d\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5247\u8a72\u51fd\u5f0f\u53ef\u4ee5\u88ab\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u6700\u4f73\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u9593\u6548\u7387\u4e0a\u8207\u8fed\u4ee3\u76f8\u7576\u3002\u9019\u7a2e\u60c5\u6cc1\u88ab\u7a31\u70ba\u5c3e\u905e\u8ff4\uff08tail recursion\uff09\u3002

  • \u666e\u901a\u905e\u8ff4\uff1a\u7576\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u7684\u51fd\u5f0f\u5f8c\uff0c\u9700\u8981\u7e7c\u7e8c\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u56e0\u6b64\u7cfb\u7d71\u9700\u8981\u5132\u5b58\u4e0a\u4e00\u5c64\u547c\u53eb\u7684\u4e0a\u4e0b\u6587\u3002
  • \u5c3e\u905e\u8ff4\uff1a\u905e\u8ff4\u547c\u53eb\u662f\u51fd\u5f0f\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u500b\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u5f8c\uff0c\u7121\u9808\u7e7c\u7e8c\u57f7\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7d71\u7121\u9808\u5132\u5b58\u4e0a\u4e00\u5c64\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u3002

\u4ee5\u8a08\u7b97 \\(1 + 2 + \\dots + n\\) \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u7d50\u679c\u8b8a\u6578 res \u8a2d\u70ba\u51fd\u5f0f\u53c3\u6578\uff0c\u5f9e\u800c\u5be6\u73fe\u5c3e\u905e\u8ff4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def tail_recur(n, res):\n    \"\"\"\u5c3e\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tail_recur(n - 1, res + n)\n
recursion.cpp
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.java
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.cs
/* \u5c3e\u905e\u8ff4 */\nint TailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return TailRecur(n - 1, res + n);\n}\n
recursion.go
/* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n int, res int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n-1, res+n)\n}\n
recursion.swift
/* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n: n - 1, res: res + n)\n}\n
recursion.js
/* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n, res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.ts
/* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.dart
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u905e\u8ff4\u547c\u53eb\n  return tailRecur(n - 1, res + n);\n}\n
recursion.rs
/* \u5c3e\u905e\u8ff4 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    tail_recur(n - 1, res + n)\n}\n
recursion.c
/* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
recursion.kt
/* \u5c3e\u905e\u8ff4 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u65b0\u589e tailrec \u95dc\u9375\u8a5e\uff0c\u4ee5\u958b\u555f\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n)\n}\n
recursion.rb
### \u5c3e\u905e\u8ff4 ###\ndef tail_recur(n, res)\n  # \u7d42\u6b62\u689d\u4ef6\n  return res if n == 0\n  # \u5c3e\u905e\u8ff4\u547c\u53eb\n  tail_recur(n - 1, res + n)\nend\n
recursion.zig
// \u5c3e\u905e\u8ff4\u51fd\u5f0f\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5c3e\u905e\u8ff4\u7684\u57f7\u884c\u904e\u7a0b\u5982\u5716 2-5 \u6240\u793a\u3002\u5c0d\u6bd4\u666e\u901a\u905e\u8ff4\u548c\u5c3e\u905e\u8ff4\uff0c\u5169\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u57f7\u884c\u9ede\u662f\u4e0d\u540c\u7684\u3002

  • \u666e\u901a\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u6bcf\u5c64\u8fd4\u56de\u5f8c\u90fd\u8981\u518d\u57f7\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
  • \u5c3e\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u53ea\u9700\u5c64\u5c64\u8fd4\u56de\u3002

\u5716 2-5 \u00a0 \u5c3e\u905e\u8ff4\u904e\u7a0b

Tip

\u8acb\u6ce8\u610f\uff0c\u8a31\u591a\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u4e26\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u3002\u4f8b\u5982\uff0cPython \u9810\u8a2d\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u5f0f\u662f\u5c3e\u905e\u8ff4\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u6703\u9047\u5230\u5806\u758a\u6ea2\u4f4d\u554f\u984c\u3002

"},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u905e\u8ff4\u6a39","text":"

\u7576\u8655\u7406\u8207\u201c\u5206\u6cbb\u201d\u76f8\u95dc\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u905e\u8ff4\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c0\u3001\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6613\u8b80\u3002\u4ee5\u201c\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u201d\u70ba\u4f8b\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u8cbb\u6ce2\u90a3\u5951\u6578\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8a72\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u3002

\u8a2d\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u70ba \\(f(n)\\) \uff0c\u6613\u5f97\u5169\u500b\u7d50\u8ad6\u3002

  • \u6578\u5217\u7684\u524d\u5169\u500b\u6578\u5b57\u70ba \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
  • \u6578\u5217\u4e2d\u7684\u6bcf\u500b\u6578\u5b57\u662f\u524d\u5169\u500b\u6578\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

\u6309\u7167\u905e\u63a8\u95dc\u4fc2\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5c07\u524d\u5169\u500b\u6578\u5b57\u4f5c\u70ba\u7d42\u6b62\u689d\u4ef6\uff0c\u4fbf\u53ef\u5beb\u51fa\u905e\u8ff4\u7a0b\u5f0f\u78bc\u3002\u547c\u53eb fib(n) \u5373\u53ef\u5f97\u5230\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def fib(n: int) -> int:\n    \"\"\"\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n
recursion.cpp
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.java
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.cs
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint Fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.go
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.swift
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.js
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.ts
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.dart
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n  // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7d50\u679c f(n)\n  return res;\n}\n
recursion.rs
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfn fib(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c\n    res\n}\n
recursion.c
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
recursion.kt
/* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfun fib(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
recursion.rb
### \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 ###\ndef fib(n)\n  # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7d50\u679c f(n)\n  res\nend\n
recursion.zig
// \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\nfn fib(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u5728\u51fd\u5f0f\u5167\u905e\u8ff4\u547c\u53eb\u4e86\u5169\u500b\u51fd\u5f0f\uff0c\u9019\u610f\u5473\u8457\u5f9e\u4e00\u500b\u547c\u53eb\u7522\u751f\u4e86\u5169\u500b\u547c\u53eb\u5206\u652f\u3002\u5982\u5716 2-6 \u6240\u793a\uff0c\u9019\u6a23\u4e0d\u65b7\u905e\u8ff4\u547c\u53eb\u4e0b\u53bb\uff0c\u6700\u7d42\u5c07\u7522\u751f\u4e00\u68f5\u5c64\u6578\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff08recursion tree\uff09\u3002

\u5716 2-6 \u00a0 \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u905e\u8ff4\u6a39

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u905e\u8ff4\u9ad4\u73fe\u4e86\u201c\u5c07\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u5b50\u554f\u984c\u201d\u7684\u601d\u7dad\u7bc4\u5f0f\uff0c\u9019\u7a2e\u5206\u6cbb\u7b56\u7565\u81f3\u95dc\u91cd\u8981\u3002

  • \u5f9e\u6f14\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u7b49\u8a31\u591a\u91cd\u8981\u6f14\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u9593\u63a5\u5730\u61c9\u7528\u4e86\u9019\u7a2e\u601d\u7dad\u65b9\u5f0f\u3002
  • \u5f9e\u8cc7\u6599\u7d50\u69cb\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u5929\u7136\u9069\u5408\u8655\u7406\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u76f8\u95dc\u554f\u984c\uff0c\u56e0\u70ba\u5b83\u5011\u975e\u5e38\u9069\u5408\u7528\u5206\u6cbb\u601d\u60f3\u9032\u884c\u5206\u6790\u3002
"},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u5169\u8005\u5c0d\u6bd4","text":"

\u7e3d\u7d50\u4ee5\u4e0a\u5167\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5be6\u73fe\u3001\u6548\u80fd\u548c\u9069\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

\u8868 2-1 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4\u7279\u9ede\u5c0d\u6bd4

\u8fed\u4ee3 \u905e\u8ff4 \u5be6\u73fe\u65b9\u5f0f \u8ff4\u5708\u7d50\u69cb \u51fd\u5f0f\u547c\u53eb\u81ea\u8eab \u6642\u9593\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f03\u9ad8\uff0c\u7121\u51fd\u5f0f\u547c\u53eb\u958b\u92b7 \u6bcf\u6b21\u51fd\u5f0f\u547c\u53eb\u90fd\u6703\u7522\u751f\u958b\u92b7 \u8a18\u61b6\u9ad4\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593 \u7d2f\u7a4d\u51fd\u5f0f\u547c\u53eb\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u5806\u758a\u5e40\u7a7a\u9593 \u9069\u7528\u554f\u984c \u9069\u7528\u65bc\u7c21\u55ae\u8ff4\u5708\u4efb\u52d9\uff0c\u7a0b\u5f0f\u78bc\u76f4\u89c0\u3001\u53ef\u8b80\u6027\u597d \u9069\u7528\u65bc\u5b50\u554f\u984c\u5206\u89e3\uff0c\u5982\u6a39\u3001\u5716\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u7a0b\u5f0f\u78bc\u7d50\u69cb\u7c21\u6f54\u3001\u6e05\u6670

Tip

\u5982\u679c\u611f\u89ba\u4ee5\u4e0b\u5167\u5bb9\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5728\u8b80\u5b8c\u201c\u5806\u758a\u201d\u7ae0\u7bc0\u5f8c\u518d\u4f86\u8907\u7fd2\u3002

\u90a3\u9ebc\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5177\u6709\u4ec0\u9ebc\u5167\u5728\u95dc\u806f\u5462\uff1f\u4ee5\u4e0a\u8ff0\u905e\u8ff4\u51fd\u5f0f\u70ba\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u905e\u8ff4\u7684\u201c\u8ff4\u201d\u968e\u6bb5\u9032\u884c\u3002\u9019\u610f\u5473\u8457\u6700\u521d\u88ab\u547c\u53eb\u7684\u51fd\u5f0f\u5be6\u969b\u4e0a\u662f\u6700\u5f8c\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u9019\u7a2e\u5de5\u4f5c\u6a5f\u5236\u8207\u5806\u758a\u7684\u201c\u5148\u5165\u5f8c\u51fa\u201d\u539f\u5247\u7570\u66f2\u540c\u5de5\u3002

\u4e8b\u5be6\u4e0a\uff0c\u201c\u547c\u53eb\u5806\u758a\u201d\u548c\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u9019\u985e\u905e\u8ff4\u8853\u8a9e\u5df2\u7d93\u6697\u793a\u4e86\u905e\u8ff4\u8207\u5806\u758a\u4e4b\u9593\u7684\u5bc6\u5207\u95dc\u4fc2\u3002

  1. \u905e\uff1a\u7576\u51fd\u5f0f\u88ab\u547c\u53eb\u6642\uff0c\u7cfb\u7d71\u6703\u5728\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u70ba\u8a72\u51fd\u5f0f\u5206\u914d\u65b0\u7684\u5806\u758a\u5e40\uff0c\u7528\u65bc\u5132\u5b58\u51fd\u5f0f\u7684\u5340\u57df\u6027\u8b8a\u6578\u3001\u53c3\u6578\u3001\u8fd4\u56de\u4f4d\u5740\u7b49\u8cc7\u6599\u3002
  2. \u8ff4\uff1a\u7576\u51fd\u5f0f\u5b8c\u6210\u57f7\u884c\u4e26\u8fd4\u56de\u6642\uff0c\u5c0d\u61c9\u7684\u5806\u758a\u5e40\u6703\u88ab\u5f9e\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u5fa9\u4e4b\u524d\u51fd\u5f0f\u7684\u57f7\u884c\u74b0\u5883\u3002

\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\uff0c\u5f9e\u800c\u5c07\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f62\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\"\"\"\n    # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack = []\n    res = 0\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in range(n, 0, -1):\n        # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while stack:\n        # \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
recursion.cpp
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack<int> stack;\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.empty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.java
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.isEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.cs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<int> stack = new();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.Push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.Count > 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.go
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack := list.New()\n    res := 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i := n; i > 0; i-- {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.PushBack(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    for stack.Len() != 0 {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.swift
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [Int] = []\n    var res = 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1 ... n).reversed() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.isEmpty {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.js
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    const stack = [];\n    let res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.ts
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.dart
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  List<int> stack = [];\n  int res = 0;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for (int i = n; i > 0; i--) {\n    // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack.add(i);\n  }\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while (!stack.isEmpty) {\n    // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
recursion.rs
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1..=n).rev() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.is_empty() {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
recursion.c
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u85c9\u52a9\u4e00\u500b\u5927\u9663\u5217\u4f86\u6a21\u64ec\u5806\u758a\n    int top = -1;    // \u5806\u758a\u9802\u7d22\u5f15\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack[1 + top++] = i;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (top >= 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
recursion.kt
/* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    val stack = Stack<Int>()\n    var res = 0\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    for (i in n downTo 0) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i)\n    }\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    while (stack.isNotEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
recursion.rb
### \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  stack = []\n  res = 0\n\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for i in n.downto(0)\n    # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack << i\n  end\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
recursion.zig
// \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7576\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f8c\uff0c\u7a0b\u5f0f\u78bc\u8b8a\u5f97\u66f4\u52a0\u8907\u96dc\u4e86\u3002\u5118\u7ba1\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5f88\u591a\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f49\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u9019\u6a23\u505a\uff0c\u6709\u4ee5\u4e0b\u5169\u9ede\u539f\u56e0\u3002

  • \u8f49\u5316\u5f8c\u7684\u7a0b\u5f0f\u78bc\u53ef\u80fd\u66f4\u52a0\u96e3\u4ee5\u7406\u89e3\uff0c\u53ef\u8b80\u6027\u66f4\u5dee\u3002
  • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\u53ef\u80fd\u975e\u5e38\u56f0\u96e3\u3002

\u7e3d\u4e4b\uff0c\u9078\u64c7\u8fed\u4ee3\u9084\u662f\u905e\u8ff4\u53d6\u6c7a\u65bc\u7279\u5b9a\u554f\u984c\u7684\u6027\u8cea\u3002\u5728\u7a0b\u5f0f\u8a2d\u8a08\u5be6\u8e10\u4e2d\uff0c\u6b0a\u8861\u5169\u8005\u7684\u512a\u52a3\u4e26\u6839\u64da\u60c5\u5883\u9078\u64c7\u5408\u9069\u7684\u65b9\u6cd5\u81f3\u95dc\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30","text":"

\u5728\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u8ffd\u6c42\u4ee5\u4e0b\u5169\u500b\u5c64\u9762\u7684\u76ee\u6a19\u3002

  1. \u627e\u5230\u554f\u984c\u89e3\u6cd5\uff1a\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u898f\u5b9a\u7684\u8f38\u5165\u7bc4\u570d\u5167\u53ef\u9760\u5730\u6c42\u5f97\u554f\u984c\u7684\u6b63\u78ba\u89e3\u3002
  2. \u5c0b\u6c42\u6700\u512a\u89e3\u6cd5\uff1a\u540c\u4e00\u500b\u554f\u984c\u53ef\u80fd\u5b58\u5728\u591a\u7a2e\u89e3\u6cd5\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u5118\u53ef\u80fd\u9ad8\u6548\u7684\u6f14\u7b97\u6cd5\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5728\u80fd\u5920\u89e3\u6c7a\u554f\u984c\u7684\u524d\u63d0\u4e0b\uff0c\u6f14\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u70ba\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u5169\u500b\u7dad\u5ea6\u3002

  • \u6642\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
  • \u7a7a\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u7684\u5927\u5c0f\u3002

\u7c21\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u8a2d\u8a08\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u81f3\u95dc\u91cd\u8981\uff0c\u56e0\u70ba\u53ea\u6709\u9019\u6a23\uff0c\u6211\u5011\u624d\u80fd\u5c07\u5404\u7a2e\u6f14\u7b97\u6cd5\u9032\u884c\u5c0d\u6bd4\uff0c\u9032\u800c\u6307\u5c0e\u6f14\u7b97\u6cd5\u8a2d\u8a08\u8207\u6700\u4f73\u5316\u904e\u7a0b\u3002

\u6548\u7387\u8a55\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u70ba\u5169\u7a2e\uff1a\u5be6\u969b\u6e2c\u8a66\u3001\u7406\u8ad6\u4f30\u7b97\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5be6\u969b\u6e2c\u8a66","text":"

\u5047\u8a2d\u6211\u5011\u73fe\u5728\u6709\u6f14\u7b97\u6cd5 A \u548c\u6f14\u7b97\u6cd5 B \uff0c\u5b83\u5011\u90fd\u80fd\u89e3\u6c7a\u540c\u4e00\u554f\u984c\uff0c\u73fe\u5728\u9700\u8981\u5c0d\u6bd4\u9019\u5169\u500b\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u81fa\u8a08\u7b97\u6a5f\uff0c\u57f7\u884c\u9019\u5169\u500b\u6f14\u7b97\u6cd5\uff0c\u4e26\u76e3\u63a7\u8a18\u9304\u5b83\u5011\u7684\u57f7\u884c\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u4f54\u7528\u60c5\u6cc1\u3002\u9019\u7a2e\u8a55\u4f30\u65b9\u5f0f\u80fd\u5920\u53cd\u6620\u771f\u5be6\u60c5\u6cc1\uff0c\u4f46\u4e5f\u5b58\u5728\u8f03\u5927\u7684\u4fb7\u9650\u6027\u3002

\u4e00\u65b9\u9762\uff0c\u96e3\u4ee5\u6392\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5e72\u64fe\u56e0\u7d20\u3002\u786c\u9ad4\u914d\u7f6e\u6703\u5f71\u97ff\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u81fa\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u81fa\u914d\u7f6e\u4e0d\u540c\u7684\u8a08\u7b97\u6a5f\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6e2c\u8a66\u7d50\u679c\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u9700\u8981\u5728\u5404\u7a2e\u6a5f\u5668\u4e0a\u9032\u884c\u6e2c\u8a66\uff0c\u7d71\u8a08\u5e73\u5747\u6548\u7387\uff0c\u800c\u9019\u662f\u4e0d\u73fe\u5be6\u7684\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u958b\u5b8c\u6574\u6e2c\u8a66\u975e\u5e38\u8017\u8cbb\u8cc7\u6e90\u3002\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u91cf\u7684\u8b8a\u5316\uff0c\u6f14\u7b97\u6cd5\u6703\u8868\u73fe\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5927\u6642\uff0c\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u70ba\u4e86\u5f97\u5230\u6709\u8aaa\u670d\u529b\u7684\u7d50\u8ad6\uff0c\u6211\u5011\u9700\u8981\u6e2c\u8a66\u5404\u7a2e\u898f\u6a21\u7684\u8f38\u5165\u8cc7\u6599\uff0c\u800c\u9019\u9700\u8981\u8017\u8cbb\u5927\u91cf\u7684\u8a08\u7b97\u8cc7\u6e90\u3002

"},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8ad6\u4f30\u7b97","text":"

\u7531\u65bc\u5be6\u969b\u6e2c\u8a66\u5177\u6709\u8f03\u5927\u7684\u4fb7\u9650\u6027\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u8003\u616e\u50c5\u900f\u904e\u4e00\u4e9b\u8a08\u7b97\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u9019\u7a2e\u4f30\u7b97\u65b9\u6cd5\u88ab\u7a31\u70ba\u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7c21\u7a31\u8907\u96dc\u5ea6\u5206\u6790\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u80fd\u5920\u9ad4\u73fe\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u4e4b\u9593\u7684\u95dc\u4fc2\u3002\u5b83\u63cf\u8ff0\u4e86\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u5b9a\u7fa9\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u5206\u70ba\u4e09\u500b\u91cd\u9ede\u4f86\u7406\u89e3\u3002

  • \u201c\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u201d\u5206\u5225\u5c0d\u61c9\u6642\u9593\u8907\u96dc\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u3002
  • \u201c\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u8457\u8907\u96dc\u5ea6\u53cd\u6620\u4e86\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u8207\u8f38\u5165\u8cc7\u6599\u9ad4\u91cf\u4e4b\u9593\u7684\u95dc\u4fc2\u3002
  • \u201c\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u201d\u8868\u793a\u8907\u96dc\u5ea6\u5206\u6790\u95dc\u6ce8\u7684\u4e0d\u662f\u57f7\u884c\u6642\u9593\u6216\u4f54\u7528\u7a7a\u9593\u7684\u5177\u9ad4\u503c\uff0c\u800c\u662f\u6642\u9593\u6216\u7a7a\u9593\u589e\u9577\u7684\u201c\u5feb\u6162\u201d\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5be6\u969b\u6e2c\u8a66\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5169\u500b\u65b9\u9762\u3002

  • \u5b83\u7368\u7acb\u65bc\u6e2c\u8a66\u74b0\u5883\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\u3002
  • \u5b83\u53ef\u4ee5\u9ad4\u73fe\u4e0d\u540c\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002

Tip

\u5982\u679c\u4f60\u4ecd\u5c0d\u8907\u96dc\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u7121\u9808\u64d4\u5fc3\uff0c\u6211\u5011\u6703\u5728\u5f8c\u7e8c\u7ae0\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

\u8907\u96dc\u5ea6\u5206\u6790\u70ba\u6211\u5011\u63d0\u4f9b\u4e86\u4e00\u628a\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6a19\u5c3a\u201d\uff0c\u4f7f\u6211\u5011\u53ef\u4ee5\u8861\u91cf\u57f7\u884c\u67d0\u500b\u6f14\u7b97\u6cd5\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\uff0c\u5c0d\u6bd4\u4e0d\u540c\u6f14\u7b97\u6cd5\u4e4b\u9593\u7684\u6548\u7387\u3002

\u8907\u96dc\u5ea6\u662f\u500b\u6578\u5b78\u6982\u5ff5\uff0c\u5c0d\u65bc\u521d\u5b78\u8005\u53ef\u80fd\u6bd4\u8f03\u62bd\u8c61\uff0c\u5b78\u7fd2\u96e3\u5ea6\u76f8\u5c0d\u8f03\u9ad8\u3002\u5f9e\u9019\u500b\u89d2\u5ea6\u770b\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9069\u5408\u4f5c\u70ba\u6700\u5148\u4ecb\u7d39\u7684\u5167\u5bb9\u3002\u7136\u800c\uff0c\u7576\u6211\u5011\u8a0e\u8ad6\u67d0\u500b\u8cc7\u6599\u7d50\u69cb\u6216\u6f14\u7b97\u6cd5\u7684\u7279\u9ede\u6642\uff0c\u96e3\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u57f7\u884c\u901f\u5ea6\u548c\u7a7a\u9593\u4f7f\u7528\u60c5\u6cc1\u3002

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u5efa\u8b70\u4f60\u5728\u6df1\u5165\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5c0d\u8907\u96dc\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u77ad\u89e3\uff0c\u4ee5\u4fbf\u80fd\u5920\u5b8c\u6210\u7c21\u55ae\u6f14\u7b97\u6cd5\u7684\u8907\u96dc\u5ea6\u5206\u6790\u3002

"},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6","text":"

\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u6982\u5ff5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u975e\u5e38\u985e\u4f3c\uff0c\u53ea\u9700\u5c07\u201c\u57f7\u884c\u6642\u9593\u201d\u66ff\u63db\u70ba\u201c\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u201d\u3002

"},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u6f14\u7b97\u6cd5\u76f8\u95dc\u7a7a\u9593","text":"

\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u4f7f\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

  • \u8f38\u5165\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u5165\u8cc7\u6599\u3002
  • \u66ab\u5b58\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u8b8a\u6578\u3001\u7269\u4ef6\u3001\u51fd\u5f0f\u4e0a\u4e0b\u6587\u7b49\u8cc7\u6599\u3002
  • \u8f38\u51fa\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u51fa\u8cc7\u6599\u3002

\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u7d71\u8a08\u7bc4\u570d\u662f\u201c\u66ab\u5b58\u7a7a\u9593\u201d\u52a0\u4e0a\u201c\u8f38\u51fa\u7a7a\u9593\u201d\u3002

\u66ab\u5b58\u7a7a\u9593\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

  • \u66ab\u5b58\u8cc7\u6599\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u5404\u7a2e\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u7b49\u3002
  • \u5806\u758a\u5e40\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u547c\u53eb\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u3002\u7cfb\u7d71\u5728\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\u90fd\u6703\u5728\u5806\u758a\u9802\u90e8\u5efa\u7acb\u4e00\u500b\u5806\u758a\u5e40\uff0c\u51fd\u5f0f\u8fd4\u56de\u5f8c\uff0c\u5806\u758a\u5e40\u7a7a\u9593\u6703\u88ab\u91cb\u653e\u3002
  • \u6307\u4ee4\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u7de8\u8b6f\u5f8c\u7684\u7a0b\u5f0f\u6307\u4ee4\uff0c\u5728\u5be6\u969b\u7d71\u8a08\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8a08\u3002

\u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6642\uff0c\u6211\u5011\u901a\u5e38\u7d71\u8a08\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u8f38\u51fa\u8cc7\u6599\u4e09\u90e8\u5206\uff0c\u5982\u5716 2-15 \u6240\u793a\u3002

\u5716 2-15 \u00a0 \u6f14\u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u95dc\u7a7a\u9593

\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class Node:\n    \"\"\"\u985e\u5225\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u7bc0\u9ede\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f38\u5165\u8cc7\u6599\n    A = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff0c\u4e00\u822c\u7528\u5927\u5beb\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node(0)        # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function()        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return A + b + c      # \u8f38\u51fa\u8cc7\u6599\n
/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node* node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = func();           // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    final int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new(0);       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = Function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u7d50\u69cb\u9ad4 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u5efa\u7acb node \u7d50\u69cb\u9ad4  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f38\u5165\u8cc7\u6599\n    const a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b := 0                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    newNode(0)              // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c := function()         // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c        // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u5f0f */\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f38\u5165\u8cc7\u6599\n    let a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node(x: 0) // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function()    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c      // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f38\u5165\u8cc7\u6599\n    const a = 0;              // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f38\u5165\u8cc7\u6599\n    const a = 0;                        // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                          // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0);           // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();              // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;                   // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f38\u5165\u8cc7\u6599\n  const int a = 0;      // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n  int b = 0;            // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n  Node node = Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n  int c = function();   // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n  return a + b + c;     // \u8f38\u51fa\u8cc7\u6599\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u5efa\u7acb Node \u7d50\u69cb\u9ad4 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u5f0f */\nfn function() -> i32 {      \n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f38\u5165\u8cc7\u6599\n    const a: i32 = 0;               // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let mut b = 0;                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node::new(0);        // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function();             // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;               // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;   // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;         // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    int c = func();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;  // \u8f38\u51fa\u8cc7\u6599\n}\n
/* \u985e\u5225 */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f38\u5165\u8cc7\u6599\n    val a = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    val node = Node(0)       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    val c = function()       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c         // \u8f38\u51fa\u8cc7\u6599\n}\n
### \u985e\u5225 ###\nclass Node\n    attr_accessor :val      # \u7bc0\u9ede\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u5f0f ###\ndef function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u6f14\u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f38\u5165\u8cc7\u6599\n    a = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node.new(0)  # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    a + b + c           # \u8f38\u51fa\u8cc7\u6599\nend\n
\n
"},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c07\u7d71\u8a08\u7269\u4ef6\u5f9e\u201c\u64cd\u4f5c\u6578\u91cf\u201d\u8f49\u70ba\u201c\u4f7f\u7528\u7a7a\u9593\u5927\u5c0f\u201d\u3002

\u800c\u8207\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u3002\u9019\u662f\u56e0\u70ba\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u4e00\u9805\u786c\u6027\u8981\u6c42\uff0c\u6211\u5011\u5fc5\u9808\u78ba\u4fdd\u5728\u6240\u6709\u8f38\u5165\u8cc7\u6599\u4e0b\u90fd\u6709\u8db3\u5920\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u9810\u7559\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u5169\u5c64\u542b\u7fa9\u3002

  1. \u4ee5\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u70ba\u6e96\uff1a\u7576 \\(n < 10\\) \u6642\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1b\u4f46\u7576 \\(n > 10\\) \u6642\uff0c\u521d\u59cb\u5316\u7684\u9663\u5217 nums \u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
  2. \u4ee5\u6f14\u7b97\u6cd5\u57f7\u884c\u4e2d\u7684\u5cf0\u503c\u8a18\u61b6\u9ad4\u70ba\u6e96\uff1a\u4f8b\u5982\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6700\u5f8c\u4e00\u884c\u4e4b\u524d\uff0c\u4f54\u7528 \\(O(1)\\) \u7a7a\u9593\uff1b\u7576\u521d\u59cb\u5316\u9663\u5217 nums \u6642\uff0c\u7a0b\u5f0f\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
\n

\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7d71\u8a08\u5806\u758a\u5e40\u7a7a\u9593\u3002\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def function() -> int:\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
int Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
func function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
function constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
function constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
int function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
fn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
fun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
def function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
\n

\u51fd\u5f0f loop() \u548c recur() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u4f46\u7a7a\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u3002

  • \u51fd\u5f0f loop() \u5728\u8ff4\u5708\u4e2d\u547c\u53eb\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f2a\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u4e26\u91cb\u653e\u4e86\u5806\u758a\u5e40\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \u3002
  • \u905e\u8ff4\u51fd\u5f0f recur() \u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u6703\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 recur() \uff0c\u5f9e\u800c\u4f54\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
"},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u898b\u578b\u5225","text":"

\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5716 2-16 \u5c55\u793a\u4e86\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\uff08\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} \\end{aligned} \\]

\u5716 2-16 \u00a0 \u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225

"},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6578\u968e \\(O(1)\\)","text":"

\u5e38\u6578\u968e\u5e38\u898b\u65bc\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u7684\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u8ff4\u5708\u4e2d\u521d\u59cb\u5316\u8b8a\u6578\u6216\u547c\u53eb\u51fd\u5f0f\u800c\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\uff0c\u5728\u9032\u5165\u4e0b\u4e00\u8ff4\u5708\u5f8c\u5c31\u6703\u88ab\u91cb\u653e\uff0c\u56e0\u6b64\u4e0d\u6703\u7d2f\u7a4d\u4f54\u7528\u7a7a\u9593\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        c = 0\n    # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        function()\n
space_complexity.cpp
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.java
/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
space_complexity.cs
/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid Constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
space_complexity.go
/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc spaceConstant(n int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
space_complexity.swift
/* \u51fd\u5f0f */\n@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
space_complexity.js
/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.ts
/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n: number): void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
space_complexity.dart
/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n  // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
space_complexity.rs
/* \u51fd\u5f0f */\nfn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        function();\n    }\n}\n
space_complexity.c
/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
space_complexity.kt
/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfun constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        function()\n    }\n}\n
space_complexity.rb
### \u51fd\u5f0f ###\ndef function\n  # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6578\u968e ###\ndef constant(n)\n  # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { c = 0 }\n  # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { function }\nend\n
space_complexity.zig
// \u51fd\u5f0f\nfn function() i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6578\u968e\nfn constant(n: i32) void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7dda\u6027\u968e \\(O(n)\\)","text":"

\u7dda\u6027\u968e\u5e38\u898b\u65bc\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u6b63\u6bd4\u7684\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u7b49\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear(n: int):\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    nums = [0] * n\n    # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
space_complexity.cpp
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<int> nums(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
space_complexity.java
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
space_complexity.cs
/* \u7dda\u6027\u968e */\nvoid Linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
space_complexity.go
/* \u7dda\u6027\u968e */\nfunc spaceLinear(n int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    _ = make([]int, n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
space_complexity.swift
/* \u7dda\u6027\u968e */\nfunc linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nums = Array(repeating: 0, count: n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
space_complexity.js
/* \u7dda\u6027\u968e */\nfunction linear(n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.ts
/* \u7dda\u6027\u968e */\nfunction linear(n: number): void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
space_complexity.dart
/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n  // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<int> nums = List.filled(n, 0);\n  // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
space_complexity.rs
/* \u7dda\u6027\u968e */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nums = vec![0; n as usize];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
space_complexity.c
/* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
space_complexity.kt
/* \u7dda\u6027\u968e */\nfun linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nums = Array(n) { 0 }\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
space_complexity.rb
### \u7dda\u6027\u968e ###\ndef linear(n)\n  # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  nums = Array.new(n, 0)\n\n  # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
space_complexity.zig
// \u7dda\u6027\u968e\nfn linear(comptime n: i32) !void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nums = [_]i32{0}**n;\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5373\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u5f0f\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def linear_recur(n: int):\n    \"\"\"\u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    print(\"\u905e\u8ff4 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
space_complexity.cpp
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u905e\u8ff4 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.java
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u905e\u8ff4 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.cs
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
space_complexity.go
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u905e\u8ff4 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
space_complexity.swift
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u905e\u8ff4 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
space_complexity.js
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u905e\u8ff4 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.ts
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u905e\u8ff4 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
space_complexity.dart
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n  print('\u905e\u8ff4 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
space_complexity.rs
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u905e\u8ff4 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
space_complexity.c
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u905e\u8ff4 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
space_complexity.kt
/* \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u905e\u8ff4 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
space_complexity.rb
### \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef linear_recur(n)\n  puts \"\u905e\u8ff4 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
space_complexity.zig
// \u7dda\u6027\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u905e\u8ff4 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-17 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u7dda\u6027\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u968e \\(O(n^2)\\)","text":"

\u5e73\u65b9\u968e\u5e38\u898b\u65bc\u77e9\u9663\u548c\u5716\uff0c\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u5e73\u65b9\u95dc\u4fc2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    num_matrix = [[0] * n for _ in range(n)]\n
space_complexity.cpp
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
space_complexity.java
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
space_complexity.cs
/* \u5e73\u65b9\u968e */\nvoid Quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
space_complexity.go
/* \u5e73\u65b9\u968e */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
space_complexity.swift
/* \u5e73\u65b9\u968e */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
space_complexity.js
/* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.ts
/* \u5e73\u65b9\u968e */\nfunction quadratic(n: number): void {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
space_complexity.dart
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n  // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
space_complexity.rs
/* \u5e73\u65b9\u968e */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
space_complexity.c
/* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
space_complexity.kt
/* \u5e73\u65b9\u968e */\nfun quadratic(n: Int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
space_complexity.rb
### \u5e73\u65b9\u968e ###\ndef quadratic(n)\n  # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  Array.new(n) { Array.new(n, 0) }\nend\n
space_complexity.zig
// \u5e73\u65b9\u968e\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 2-18 \u6240\u793a\uff0c\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5728\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u500b\u9663\u5217\uff0c\u9577\u5ea6\u5206\u5225\u70ba \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u9577\u5ea6\u70ba \\(n / 2\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u4f54\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
space_complexity.cpp
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u905e\u8ff4 n = \" << n << \" \u4e2d\u7684 nums \u9577\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
space_complexity.java
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.cs
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
space_complexity.go
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
space_complexity.swift
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u905e\u8ff4 n = \\(n) \u4e2d\u7684 nums \u9577\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
space_complexity.js
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.ts
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
space_complexity.dart
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
space_complexity.rs
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
space_complexity.c
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
space_complexity.kt
/* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
space_complexity.rb
### \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
space_complexity.zig
// \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-18 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u5e73\u65b9\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6578\u968e \\(O(2^n)\\)","text":"

\u6307\u6578\u968e\u5e38\u898b\u65bc\u4e8c\u5143\u6a39\u3002\u89c0\u5bdf\u5716 2-19 \uff0c\u5c64\u6578\u70ba \\(n\\) \u7684\u201c\u6eff\u4e8c\u5143\u6a39\u201d\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(2^n - 1\\) \uff0c\u4f54\u7528 \\(O(2^n)\\) \u7a7a\u9593\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
space_complexity.cpp
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.java
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.cs
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
space_complexity.go
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
space_complexity.swift
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
space_complexity.js
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.ts
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.dart
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
space_complexity.rs
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
space_complexity.c
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
space_complexity.kt
/* \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
space_complexity.rb
### \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
space_complexity.zig
// \u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-19 \u00a0 \u6eff\u4e8c\u5143\u6a39\u7522\u751f\u7684\u6307\u6578\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

"},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

\u5c0d\u6578\u968e\u5e38\u898b\u65bc\u5206\u6cbb\u6f14\u7b97\u6cd5\u3002\u4f8b\u5982\u5408\u4f75\u6392\u5e8f\uff0c\u8f38\u5165\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u6bcf\u8f2a\u905e\u8ff4\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002

\u518d\u4f8b\u5982\u5c07\u6578\u5b57\u8f49\u5316\u70ba\u5b57\u4e32\uff0c\u8f38\u5165\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6578\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5c0d\u61c9\u5b57\u4e32\u9577\u5ea6\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6b0a\u8861\u6642\u9593\u8207\u7a7a\u9593","text":"

\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u80fd\u9054\u5230\u6700\u512a\u3002\u7136\u800c\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u540c\u6642\u6700\u4f73\u5316\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96e3\u3002

\u964d\u4f4e\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba\u4ee3\u50f9\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u5011\u5c07\u72a7\u7272\u8a18\u61b6\u9ad4\u7a7a\u9593\u4f86\u63d0\u5347\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u601d\u8def\u7a31\u70ba\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff1b\u53cd\u4e4b\uff0c\u5247\u7a31\u70ba\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002

\u9078\u64c7\u54ea\u7a2e\u601d\u8def\u53d6\u6c7a\u65bc\u6211\u5011\u66f4\u770b\u91cd\u54ea\u500b\u65b9\u9762\u3002\u5728\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u6642\u9593\u6bd4\u7a7a\u9593\u66f4\u5bf6\u8cb4\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u7576\u7136\uff0c\u5728\u8cc7\u6599\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\uff0c\u63a7\u5236\u7a7a\u9593\u8907\u96dc\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

"},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"

\u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30

  • \u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u5169\u500b\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\u3002
  • \u6211\u5011\u53ef\u4ee5\u900f\u904e\u5be6\u969b\u6e2c\u8a66\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96e3\u4ee5\u6d88\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5f71\u97ff\uff0c\u4e14\u6703\u8017\u8cbb\u5927\u91cf\u8a08\u7b97\u8cc7\u6e90\u3002
  • \u8907\u96dc\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5be6\u969b\u6e2c\u8a66\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\uff0c\u4e26\u4e14\u80fd\u5920\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u8cc7\u6599\u898f\u6a21\u4e0b\u7684\u6548\u7387\u3002

\u6642\u9593\u8907\u96dc\u5ea6

  • \u6642\u9593\u8907\u96dc\u5ea6\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\uff0c\u53ef\u4ee5\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f38\u5165\u7684\u8cc7\u6599\u91cf\u8f03\u5c0f\u6216\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\u6642\uff0c\u7121\u6cd5\u7cbe\u78ba\u5c0d\u6bd4\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u512a\u52a3\u3002
  • \u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u865f\u8868\u793a\uff0c\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u7576 \\(n\\) \u8da8\u5411\u6b63\u7121\u7aae\u6642\uff0c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u7684\u589e\u9577\u7d1a\u5225\u3002
  • \u63a8\u7b97\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u5169\u6b65\uff0c\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002
  • \u5e38\u898b\u6642\u9593\u8907\u96dc\u5ea6\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
  • \u67d0\u4e9b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u5e7e\u4e4e\u4e0d\u7528\uff0c\u56e0\u70ba\u8f38\u5165\u8cc7\u6599\u4e00\u822c\u9700\u8981\u6eff\u8db3\u56b4\u683c\u689d\u4ef6\u624d\u80fd\u9054\u5230\u6700\u4f73\u60c5\u6cc1\u3002
  • \u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53cd\u6620\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8cc7\u6599\u8f38\u5165\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5be6\u969b\u61c9\u7528\u4e2d\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u9700\u8981\u7d71\u8a08\u8f38\u5165\u8cc7\u6599\u5206\u4f48\u4ee5\u53ca\u7d9c\u5408\u5f8c\u7684\u6578\u5b78\u671f\u671b\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6

  • \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u4f5c\u7528\u985e\u4f3c\u65bc\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\u3002
  • \u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u76f8\u95dc\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u5206\u70ba\u8f38\u5165\u7a7a\u9593\u3001\u66ab\u5b58\u7a7a\u9593\u3001\u8f38\u51fa\u7a7a\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u8f38\u5165\u7a7a\u9593\u4e0d\u7d0d\u5165\u7a7a\u9593\u8907\u96dc\u5ea6\u8a08\u7b97\u3002\u66ab\u5b58\u7a7a\u9593\u53ef\u5206\u70ba\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u6307\u4ee4\u7a7a\u9593\uff0c\u5176\u4e2d\u5806\u758a\u5e40\u7a7a\u9593\u901a\u5e38\u50c5\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\u5f71\u97ff\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5373\u7d71\u8a08\u6f14\u7b97\u6cd5\u5728\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u548c\u6700\u5dee\u57f7\u884c\u6642\u523b\u4e0b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u5e38\u898b\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
"},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c3e\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u55ce\uff1f

\u7406\u8ad6\u4e0a\uff0c\u5c3e\u905e\u8ff4\u51fd\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u904e\u7d55\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52d5\u6700\u4f73\u5316\u5c3e\u905e\u8ff4\uff0c\u56e0\u6b64\u901a\u5e38\u8a8d\u70ba\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(n)\\) \u3002

Q\uff1a\u51fd\u5f0f\u548c\u65b9\u6cd5\u9019\u5169\u500b\u8853\u8a9e\u7684\u5340\u5225\u662f\u4ec0\u9ebc\uff1f

\u51fd\u5f0f\uff08function\uff09\u53ef\u4ee5\u88ab\u7368\u7acb\u57f7\u884c\uff0c\u6240\u6709\u53c3\u6578\u90fd\u4ee5\u986f\u5f0f\u50b3\u905e\u3002\u65b9\u6cd5\uff08method\uff09\u8207\u4e00\u500b\u7269\u4ef6\u95dc\u806f\uff0c\u88ab\u96b1\u5f0f\u50b3\u905e\u7d66\u547c\u53eb\u5b83\u7684\u7269\u4ef6\uff0c\u80fd\u5920\u5c0d\u985e\u5225\u7684\u4f8b\u9805\u4e2d\u5305\u542b\u7684\u8cc7\u6599\u9032\u884c\u64cd\u4f5c\u3002

\u4e0b\u9762\u4ee5\u5e7e\u7a2e\u5e38\u898b\u7684\u7a0b\u5f0f\u8a9e\u8a00\u70ba\u4f8b\u4f86\u8aaa\u660e\u3002

  • C \u8a9e\u8a00\u662f\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\u8a9e\u8a00\uff0c\u6c92\u6709\u7269\u4ef6\u5c0e\u5411\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u5f0f\u3002\u4f46\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5efa\u7acb\u7d50\u69cb\u9ad4\uff08struct\uff09\u4f86\u6a21\u64ec\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff0c\u8207\u7d50\u69cb\u9ad4\u76f8\u95dc\u806f\u7684\u51fd\u5f0f\u5c31\u76f8\u7576\u65bc\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
  • Java \u548c C# \u662f\u7269\u4ef6\u5c0e\u5411\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u78bc\u584a\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u70ba\u67d0\u500b\u985e\u5225\u7684\u4e00\u90e8\u5206\u3002\u975c\u614b\u65b9\u6cd5\u7684\u884c\u70ba\u985e\u4f3c\u65bc\u51fd\u5f0f\uff0c\u56e0\u70ba\u5b83\u88ab\u7e6b\u7d50\u5728\u985e\u5225\u4e0a\uff0c\u4e0d\u80fd\u8a2a\u554f\u7279\u5b9a\u7684\u4f8b\u9805\u8b8a\u6578\u3002
  • C++ \u548c Python \u65e2\u652f\u6301\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\uff08\u51fd\u5f0f\uff09\uff0c\u4e5f\u652f\u6301\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff08\u65b9\u6cd5\uff09\u3002

Q\uff1a\u5716\u89e3\u201c\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\uff1f

\u4e0d\u662f\uff0c\u8a72\u5716\u5c55\u793a\u7684\u662f\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u9577\u8da8\u52e2\uff0c\u800c\u4e0d\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\u3002

\u5047\u8a2d\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u6bcf\u689d\u66f2\u7dda\u7684\u503c\u8207\u51fd\u5f0f\u5c0d\u61c9\u4e0d\u4e0a\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u689d\u66f2\u7dda\u90fd\u5305\u542b\u4e00\u500b\u5e38\u6578\u9805\uff0c\u7528\u65bc\u5c07\u53d6\u503c\u7bc4\u570d\u58d3\u7e2e\u5230\u4e00\u500b\u8996\u89ba\u8212\u9069\u7684\u7bc4\u570d\u5167\u3002

\u5728\u5be6\u969b\u4e2d\uff0c\u56e0\u70ba\u6211\u5011\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u500b\u65b9\u6cd5\u7684\u201c\u5e38\u6578\u9805\u201d\u8907\u96dc\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u7121\u6cd5\u50c5\u6191\u8907\u96dc\u5ea6\u4f86\u9078\u64c7 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u512a\u89e3\u6cd5\u3002\u4f46\u5c0d\u65bc \\(n = 8^5\\) \u5c31\u5f88\u597d\u9078\u4e86\uff0c\u9019\u6642\u589e\u9577\u8da8\u52e2\u5df2\u7d93\u4f54\u4e3b\u5c0e\u4e86\u3002

"},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6","text":"

\u57f7\u884c\u6642\u9593\u53ef\u4ee5\u76f4\u89c0\u4e14\u6e96\u78ba\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u5011\u60f3\u6e96\u78ba\u9810\u4f30\u4e00\u6bb5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6642\u9593\uff0c\u61c9\u8a72\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

  1. \u78ba\u5b9a\u57f7\u884c\u5e73\u81fa\uff0c\u5305\u62ec\u786c\u9ad4\u914d\u7f6e\u3001\u7a0b\u5f0f\u8a9e\u8a00\u3001\u7cfb\u7d71\u74b0\u5883\u7b49\uff0c\u9019\u4e9b\u56e0\u7d20\u90fd\u6703\u5f71\u97ff\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6548\u7387\u3002
  2. \u8a55\u4f30\u5404\u7a2e\u8a08\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u57f7\u884c\u6642\u9593\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u5217\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
  3. \u7d71\u8a08\u7a0b\u5f0f\u78bc\u4e2d\u6240\u6709\u7684\u8a08\u7b97\u64cd\u4f5c\uff0c\u4e26\u5c07\u6240\u6709\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u6c42\u548c\uff0c\u5f9e\u800c\u5f97\u5230\u57f7\u884c\u6642\u9593\u3002

\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u8ff4\u5708 n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n    print(0); // 5 ns\n  }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f2a\u90fd\u8981\u57f7\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
# \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u8ff4\u5708 n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
// \u5728\u67d0\u57f7\u884c\u5e73\u81fa\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

\u6839\u64da\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u70ba \\((6n + 12)\\) ns \uff1a

\\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

\u4f46\u5be6\u969b\u4e0a\uff0c\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73fe\u5be6\u3002\u9996\u5148\uff0c\u6211\u5011\u4e0d\u5e0c\u671b\u5c07\u9810\u4f30\u6642\u9593\u548c\u57f7\u884c\u5e73\u81fa\u7e6b\u7d50\uff0c\u56e0\u70ba\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u5404\u7a2e\u4e0d\u540c\u7684\u5e73\u81fa\u4e0a\u57f7\u884c\u3002\u5176\u6b21\uff0c\u6211\u5011\u5f88\u96e3\u7372\u77e5\u6bcf\u7a2e\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\uff0c\u9019\u7d66\u9810\u4f30\u904e\u7a0b\u5e36\u4f86\u4e86\u6975\u5927\u7684\u96e3\u5ea6\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7d71\u8a08\u6642\u9593\u589e\u9577\u8da8\u52e2","text":"

\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u7d71\u8a08\u7684\u4e0d\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\uff0c\u800c\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002

\u201c\u6642\u9593\u589e\u9577\u8da8\u52e2\u201d\u9019\u500b\u6982\u5ff5\u6bd4\u8f03\u62bd\u8c61\uff0c\u6211\u5011\u900f\u904e\u4e00\u500b\u4f8b\u5b50\u4f86\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7d66\u5b9a\u4e09\u500b\u6f14\u7b97\u6cd5 A\u3001B \u548c C \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_A(n: int):\n    print(0)\n# \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
# \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
// \u6f14\u7b97\u6cd5 A \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u7dda\u6027\u968e\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u6f14\u7b97\u6cd5 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u5e38\u6578\u968e\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

\u5716 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u500b\u6f14\u7b97\u6cd5\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

  • \u6f14\u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u500b\u5217\u5370\u64cd\u4f5c\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u4e0d\u96a8\u8457 \\(n\\) \u589e\u5927\u800c\u589e\u9577\u3002\u6211\u5011\u7a31\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002
  • \u6f14\u7b97\u6cd5 B \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(n\\) \u6b21\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457 \\(n\\) \u589e\u5927\u5448\u7dda\u6027\u589e\u9577\u3002\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u968e\u201d\u3002
  • \u6f14\u7b97\u6cd5 C \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(1000000\\) \u6b21\uff0c\u96d6\u7136\u57f7\u884c\u6642\u9593\u5f88\u9577\uff0c\u4f46\u5b83\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u3002\u56e0\u6b64 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002

\u5716 2-7 \u00a0 \u6f14\u7b97\u6cd5 A\u3001B \u548c C \u7684\u6642\u9593\u589e\u9577\u8da8\u52e2

\u76f8\u8f03\u65bc\u76f4\u63a5\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u9ede\u5462\uff1f

  • \u6642\u9593\u8907\u96dc\u5ea6\u80fd\u5920\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u6f14\u7b97\u6cd5 B \u7684\u57f7\u884c\u6642\u9593\u5448\u7dda\u6027\u589e\u9577\uff0c\u5728 \\(n > 1\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5be6\u4e0a\uff0c\u53ea\u8981\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8db3\u5920\u5927\uff0c\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u7684\u6f14\u7b97\u6cd5\u4e00\u5b9a\u512a\u65bc\u201c\u7dda\u6027\u968e\u201d\u7684\u6f14\u7b97\u6cd5\uff0c\u9019\u6b63\u662f\u6642\u9593\u589e\u9577\u8da8\u52e2\u7684\u542b\u7fa9\u3002
  • \u6642\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7c21\u4fbf\u3002\u986f\u7136\uff0c\u57f7\u884c\u5e73\u81fa\u548c\u8a08\u7b97\u64cd\u4f5c\u578b\u5225\u90fd\u8207\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u7121\u95dc\u3002\u56e0\u6b64\u5728\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u5c07\u6240\u6709\u8a08\u7b97\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u8996\u70ba\u76f8\u540c\u7684\u201c\u55ae\u4f4d\u6642\u9593\u201d\uff0c\u5f9e\u800c\u5c07\u201c\u8a08\u7b97\u64cd\u4f5c\u57f7\u884c\u6642\u9593\u7d71\u8a08\u201d\u7c21\u5316\u70ba\u201c\u8a08\u7b97\u64cd\u4f5c\u6578\u91cf\u7d71\u8a08\u201d\uff0c\u9019\u6a23\u4e00\u4f86\u4f30\u7b97\u96e3\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
  • \u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u4fb7\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 A \u548c C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\uff0c\u4f46\u5be6\u969b\u57f7\u884c\u6642\u9593\u5dee\u5225\u5f88\u5927\u3002\u540c\u6a23\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 B \u660e\u986f\u512a\u65bc\u6f14\u7b97\u6cd5 C \u3002\u5728\u9019\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5f88\u96e3\u50c5\u6191\u6642\u9593\u8907\u96dc\u5ea6\u5224\u65b7\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u7576\u7136\uff0c\u5118\u7ba1\u5b58\u5728\u4e0a\u8ff0\u554f\u984c\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8a55\u5224\u6f14\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
"},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c","text":"

\u7d66\u5b9a\u4e00\u500b\u8f38\u5165\u5927\u5c0f\u70ba \\(n\\) \u7684\u51fd\u5f0f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u8ff4\u5708 n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u8ff4\u5708 n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u8ff4\u5708 n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

\u8a2d\u6f14\u7b97\u6cd5\u7684\u64cd\u4f5c\u6578\u91cf\u662f\u4e00\u500b\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7684\u51fd\u5f0f\uff0c\u8a18\u70ba \\(T(n)\\) \uff0c\u5247\u4ee5\u4e0a\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u70ba\uff1a

\\[ T(n) = 3 + 2n \\]

\\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u5f0f\uff0c\u8aaa\u660e\u5176\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u662f\u7dda\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u7dda\u6027\u968e\u3002

\u6211\u5011\u5c07\u7dda\u6027\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8a18\u70ba \\(O(n)\\) \uff0c\u9019\u500b\u6578\u5b78\u7b26\u865f\u7a31\u70ba\u5927 \\(O\\) \u8a18\u865f\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u5f0f \\(T(n)\\) \u7684\u6f38\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u672c\u8cea\u4e0a\u662f\u8a08\u7b97\u201c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\)\u201d\u7684\u6f38\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u78ba\u7684\u6578\u5b78\u5b9a\u7fa9\u3002

\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c

\u82e5\u5b58\u5728\u6b63\u5be6\u6578 \\(c\\) \u548c\u5be6\u6578 \\(n_0\\) \uff0c\u4f7f\u5f97\u5c0d\u65bc\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5247\u53ef\u8a8d\u70ba \\(f(n)\\) \u7d66\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u500b\u6f38\u8fd1\u4e0a\u754c\uff0c\u8a18\u70ba \\(T(n) = O(f(n))\\) \u3002

\u5982\u5716 2-8 \u6240\u793a\uff0c\u8a08\u7b97\u6f38\u8fd1\u4e0a\u754c\u5c31\u662f\u5c0b\u627e\u4e00\u500b\u51fd\u5f0f \\(f(n)\\) \uff0c\u4f7f\u5f97\u7576 \\(n\\) \u8da8\u5411\u65bc\u7121\u7aae\u5927\u6642\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u8655\u65bc\u76f8\u540c\u7684\u589e\u9577\u7d1a\u5225\uff0c\u50c5\u76f8\u5dee\u4e00\u500b\u5e38\u6578\u9805 \\(c\\) \u7684\u500d\u6578\u3002

\u5716 2-8 \u00a0 \u51fd\u5f0f\u7684\u6f38\u8fd1\u4e0a\u754c

"},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

\u6f38\u8fd1\u4e0a\u754c\u7684\u6578\u5b78\u5473\u5152\u6709\u9ede\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89ba\u6c92\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u7121\u9808\u64d4\u5fc3\u3002\u6211\u5011\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65b7\u7684\u5be6\u8e10\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6f38\u9818\u609f\u5176\u6578\u5b78\u610f\u7fa9\u3002

\u6839\u64da\u5b9a\u7fa9\uff0c\u78ba\u5b9a \\(f(n)\\) \u4e4b\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u9ebc\u5982\u4f55\u78ba\u5b9a\u6f38\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u7e3d\u9ad4\u5206\u70ba\u5169\u6b65\uff1a\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf","text":"

\u91dd\u5c0d\u7a0b\u5f0f\u78bc\uff0c\u9010\u884c\u5f9e\u4e0a\u5230\u4e0b\u8a08\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u65bc\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6578\u9805 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u7a2e\u4fc2\u6578\u3001\u5e38\u6578\u9805\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u64da\u6b64\u539f\u5247\uff0c\u53ef\u4ee5\u7e3d\u7d50\u51fa\u4ee5\u4e0b\u8a08\u6578\u7c21\u5316\u6280\u5de7\u3002

  1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6578\u9805\u3002\u56e0\u70ba\u5b83\u5011\u90fd\u8207 \\(n\\) \u7121\u95dc\uff0c\u6240\u4ee5\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u7522\u751f\u5f71\u97ff\u3002
  2. \u7701\u7565\u6240\u6709\u4fc2\u6578\u3002\u4f8b\u5982\uff0c\u8ff4\u5708 \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7c21\u5316\u8a18\u70ba \\(n\\) \u6b21\uff0c\u56e0\u70ba \\(n\\) \u524d\u9762\u7684\u4fc2\u6578\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u6c92\u6709\u5f71\u97ff\u3002
  3. \u8ff4\u5708\u5de2\u72c0\u6642\u4f7f\u7528\u4e58\u6cd5\u3002\u7e3d\u64cd\u4f5c\u6578\u91cf\u7b49\u65bc\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u64cd\u4f5c\u6578\u91cf\u4e4b\u7a4d\uff0c\u6bcf\u4e00\u5c64\u8ff4\u5708\u4f9d\u7136\u53ef\u4ee5\u5206\u5225\u5957\u7528\u7b2c 1. \u9ede\u548c\u7b2c 2. \u9ede\u7684\u6280\u5de7\u3002

\u7d66\u5b9a\u4e00\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u4f86\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

\u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u5f8c\u7684\u7d71\u8a08\u7d50\u679c\uff0c\u5169\u8005\u63a8\u7b97\u51fa\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002

\\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7d71\u8a08 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61f6\u7d71\u8a08 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c","text":"

\u6642\u9593\u8907\u96dc\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u968e\u7684\u9805\u4f86\u6c7a\u5b9a\u3002\u9019\u662f\u56e0\u70ba\u5728 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u6700\u9ad8\u968e\u7684\u9805\u5c07\u767c\u63ee\u4e3b\u5c0e\u4f5c\u7528\uff0c\u5176\u4ed6\u9805\u7684\u5f71\u97ff\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

\u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u8a87\u5f35\u7684\u503c\u662f\u70ba\u4e86\u5f37\u8abf\u201c\u4fc2\u6578\u7121\u6cd5\u64bc\u52d5\u968e\u6578\u201d\u9019\u4e00\u7d50\u8ad6\u3002\u7576 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u9019\u4e9b\u5e38\u6578\u8b8a\u5f97\u7121\u8db3\u8f15\u91cd\u3002

\u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6578\u91cf\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u898b\u578b\u5225","text":"

\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225\u5982\u5716 2-9 \u6240\u793a\uff08\u6309\u7167\u5f9e\u4f4e\u5230\u9ad8\u7684\u9806\u5e8f\u6392\u5217\uff09\u3002

\\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u7dda\u6027\u5c0d\u6578\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} < \\text{\u968e\u4e58\u968e} \\end{aligned} \\]

\u5716 2-9 \u00a0 \u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225

"},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6578\u968e \\(O(1)\\)","text":"

\u5e38\u6578\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u5373\u4e0d\u96a8\u8457 \\(n\\) \u7684\u8b8a\u5316\u800c\u8b8a\u5316\u3002

\u5728\u4ee5\u4e0b\u51fd\u5f0f\u4e2d\uff0c\u5118\u7ba1\u64cd\u4f5c\u6578\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u65bc\u5176\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def constant(n: int) -> int:\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u5e38\u6578\u968e */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u5e38\u6578\u968e */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e38\u6578\u968e */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u5e38\u6578\u968e */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u5e38\u6578\u968e */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e38\u6578\u968e */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5e38\u6578\u968e */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e38\u6578\u968e */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
time_complexity.rb
### \u5e38\u6578\u968e ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u5e38\u6578\u968e\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7dda\u6027\u968e \\(O(n)\\)","text":"

\u7dda\u6027\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u7dda\u6027\u7d1a\u5225\u589e\u9577\u3002\u7dda\u6027\u968e\u901a\u5e38\u51fa\u73fe\u5728\u55ae\u5c64\u8ff4\u5708\u4e2d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear(n: int) -> int:\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u968e */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u968e */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u968e */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u968e */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u968e */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u968e */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u968e */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7dda\u6027\u968e */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u968e */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u968e ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u968e\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8d70\u8a2a\u9663\u5217\u548c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u7b49\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u9577\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u9700\u6839\u64da\u8f38\u5165\u8cc7\u6599\u7684\u578b\u5225\u4f86\u5177\u9ad4\u78ba\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u500b\u793a\u4f8b\u4e2d\uff0c\u8b8a\u6578 \\(n\\) \u70ba\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u500b\u793a\u4f8b\u4e2d\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u70ba\u8cc7\u6599\u5927\u5c0f\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u968e \\(O(n^2)\\)","text":"

\u5e73\u65b9\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7d1a\u5225\u589e\u9577\u3002\u5e73\u65b9\u968e\u901a\u5e38\u51fa\u73fe\u5728\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u968e */\nint Quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u968e */\nfunc quadratic(n int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u968e */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u968e */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u968e */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u968e */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u968e ###\ndef quadratic(n)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u968e\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-10 \u5c0d\u6bd4\u4e86\u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u4e09\u7a2e\u6642\u9593\u8907\u96dc\u5ea6\u3002

\u5716 2-10 \u00a0 \u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u4ee5\u6ce1\u6cab\u6392\u5e8f\u70ba\u4f8b\uff0c\u5916\u5c64\u8ff4\u5708\u57f7\u884c \\(n - 1\\) \u6b21\uff0c\u5167\u5c64\u8ff4\u5708\u57f7\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u70ba \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8a08\u6578\u5668\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n    return count\n
time_complexity.cpp
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.java
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.go
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.swift
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.js
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8a08\u6578\u5668\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8a08\u6578\u5668\n\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
time_complexity.c
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
time_complexity.rb
### \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8a08\u6578\u5668\n\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
time_complexity.zig
// \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8a08\u6578\u5668 \n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6578\u968e \\(O(2^n)\\)","text":"

\u751f\u7269\u5b78\u7684\u201c\u7d30\u80de\u5206\u88c2\u201d\u662f\u6307\u6578\u968e\u589e\u9577\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72c0\u614b\u70ba \\(1\\) \u500b\u7d30\u80de\uff0c\u5206\u88c2\u4e00\u8f2a\u5f8c\u8b8a\u70ba \\(2\\) \u500b\uff0c\u5206\u88c2\u5169\u8f2a\u5f8c\u8b8a\u70ba \\(4\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f2a\u5f8c\u6709 \\(2^n\\) \u500b\u7d30\u80de\u3002

\u5716 2-11 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u7d30\u80de\u5206\u88c2\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exponential(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
time_complexity.cpp
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.java
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.cs
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.go
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.swift
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.js
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.ts
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.dart
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
time_complexity.rs
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
time_complexity.c
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
time_complexity.kt
/* \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
time_complexity.rb
### \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
time_complexity.zig
// \u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-11 \u00a0 \u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u5728\u5be6\u969b\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6307\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u5176\u905e\u8ff4\u5730\u4e00\u5206\u70ba\u4e8c\uff0c\u7d93\u904e \\(n\\) \u6b21\u5206\u88c2\u5f8c\u505c\u6b62\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
time_complexity.cpp
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.java
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.cs
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
time_complexity.go
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
time_complexity.swift
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
time_complexity.js
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.ts
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.dart
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.rs
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
time_complexity.c
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
time_complexity.kt
/* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
time_complexity.rb
### \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
time_complexity.zig
// \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6307\u6578\u968e\u589e\u9577\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7aae\u8209\u6cd5\uff08\u66b4\u529b\u641c\u5c0b\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f03\u5e38\u898b\u3002\u5c0d\u65bc\u8cc7\u6599\u898f\u6a21\u8f03\u5927\u7684\u554f\u984c\uff0c\u6307\u6578\u968e\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52d5\u614b\u898f\u5283\u6216\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u4f86\u89e3\u6c7a\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

\u8207\u6307\u6578\u968e\u76f8\u53cd\uff0c\u5c0d\u6578\u968e\u53cd\u6620\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u60c5\u6cc1\u3002\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7531\u65bc\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u5f0f\u3002

\u5716 2-12 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_2 n)\\) \uff0c\u7c21\u8a18\u70ba \\(O(\\log n)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def logarithmic(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
time_complexity.cpp
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
time_complexity.c
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
time_complexity.zig
// \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-12 \u00a0 \u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u8207\u6307\u6578\u968e\u985e\u4f3c\uff0c\u5c0d\u6578\u968e\u4e5f\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(\\log_2 n\\) \u7684\u905e\u8ff4\u6a39\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def log_recur(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
time_complexity.cpp
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.java
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.cs
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
time_complexity.go
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
time_complexity.swift
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
time_complexity.js
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.ts
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.dart
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
time_complexity.rs
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
time_complexity.c
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
time_complexity.kt
/* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
time_complexity.rb
### \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
time_complexity.zig
// \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6f14\u7b97\u6cd5\u4e2d\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u591a\u201d\u548c\u201c\u5316\u7e41\u70ba\u7c21\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u9577\u7de9\u6162\uff0c\u662f\u50c5\u6b21\u65bc\u5e38\u6578\u968e\u7684\u7406\u60f3\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

\\(O(\\log n)\\) \u7684\u5e95\u6578\u662f\u591a\u5c11\uff1f

\u6e96\u78ba\u4f86\u8aaa\uff0c\u201c\u4e00\u5206\u70ba \\(m\\)\u201d\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u900f\u904e\u5c0d\u6578\u63db\u5e95\u516c\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6578\u3001\u76f8\u7b49\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a

\\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5e95\u6578 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u97ff\u8907\u96dc\u5ea6\u7684\u524d\u63d0\u4e0b\u8f49\u63db\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u7701\u7565\u5e95\u6578 \\(m\\) \uff0c\u5c07\u5c0d\u6578\u968e\u76f4\u63a5\u8a18\u70ba \\(O(\\log n)\\) \u3002

"},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7dda\u6027\u5c0d\u6578\u968e \\(O(n \\log n)\\)","text":"

\u7dda\u6027\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5169\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5206\u5225\u70ba \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def linear_log_recur(n: int) -> int:\n    \"\"\"\u7dda\u6027\u5c0d\u6578\u968e\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
time_complexity.cpp
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.java
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.cs
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.go
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
time_complexity.swift
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
time_complexity.js
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.ts
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.dart
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
time_complexity.rs
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
time_complexity.c
/* \u7dda\u6027\u5c0d\u6578\u968e */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
time_complexity.kt
/* \u7dda\u6027\u5c0d\u6578\u968e */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
time_complexity.rb
### \u7dda\u6027\u5c0d\u6578\u968e ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
time_complexity.zig
// \u7dda\u6027\u5c0d\u6578\u968e\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-13 \u5c55\u793a\u4e86\u7dda\u6027\u5c0d\u6578\u968e\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u5143\u6a39\u7684\u6bcf\u4e00\u5c64\u7684\u64cd\u4f5c\u7e3d\u6578\u90fd\u70ba \\(n\\) \uff0c\u6a39\u5171\u6709 \\(\\log_2 n + 1\\) \u5c64\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u5716 2-13 \u00a0 \u7dda\u6027\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u7b49\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u968e\u4e58\u968e \\(O(n!)\\)","text":"

\u968e\u4e58\u968e\u5c0d\u61c9\u6578\u5b78\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u554f\u984c\u3002\u7d66\u5b9a \\(n\\) \u500b\u4e92\u4e0d\u91cd\u8907\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6578\u91cf\u70ba\uff1a

\\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

\u968e\u4e58\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u5be6\u73fe\u3002\u5982\u5716 2-14 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u7b2c\u4e00\u5c64\u5206\u88c2\u51fa \\(n\\) \u500b\uff0c\u7b2c\u4e8c\u5c64\u5206\u88c2\u51fa \\(n - 1\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c64\u6642\u505c\u6b62\u5206\u88c2\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
def factorial_recur(n: int) -> int:\n    \"\"\"\u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
time_complexity.cpp
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.java
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.cs
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.go
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.swift
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
time_complexity.js
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.ts
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.dart
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
time_complexity.rs
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
time_complexity.c
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
time_complexity.kt
/* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
time_complexity.rb
### \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
time_complexity.zig
// \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 2-14 \u00a0 \u968e\u4e58\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

\u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u7576 \\(n \\geq 4\\) \u6642\u6046\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u968e\u4e58\u968e\u6bd4\u6307\u6578\u968e\u589e\u9577\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f03\u5927\u6642\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

"},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6","text":"

\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u5047\u8a2d\u8f38\u5165\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d nums \u7531\u5f9e \\(1\\) \u81f3 \\(n\\) \u7684\u6578\u5b57\u7d44\u6210\uff0c\u6bcf\u500b\u6578\u5b57\u53ea\u51fa\u73fe\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u9806\u5e8f\u662f\u96a8\u6a5f\u6253\u4e82\u7684\uff0c\u4efb\u52d9\u76ee\u6a19\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

  • \u7576 nums = [?, ?, ..., 1] \uff0c\u5373\u7576\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u6642\uff0c\u9700\u8981\u5b8c\u6574\u8d70\u8a2a\u9663\u5217\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
  • \u7576 nums = [1, ?, ?, ...] \uff0c\u5373\u7576\u9996\u500b\u5143\u7d20\u70ba \\(1\\) \u6642\uff0c\u7121\u8ad6\u9663\u5217\u591a\u9577\u90fd\u4e0d\u9700\u8981\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(\\Omega(1)\\) \u3002

\u201c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8a18\u865f\u8868\u793a\u3002\u76f8\u61c9\u5730\uff0c\u201c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8a18\u865f\u8868\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82\"\"\"\n    # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
worst_best_time_complexity.cpp
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7d71\u6642\u9593\u751f\u6210\u96a8\u6a5f\u7a2e\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.java
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.cs
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.go
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.swift
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
worst_best_time_complexity.js
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.ts
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
worst_best_time_complexity.dart
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
worst_best_time_complexity.rs
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
worst_best_time_complexity.c
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u7a4d\u5340\u8a18\u61b6\u9ad4\uff08\u5efa\u7acb\u4e00\u7dad\u53ef\u8b8a\u9577\u9663\u5217\uff1a\u9663\u5217\u4e2d\u5143\u7d20\u6578\u91cf\u70ba n \uff0c\u5143\u7d20\u578b\u5225\u70ba int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
worst_best_time_complexity.kt
/* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
worst_best_time_complexity.rb
### \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82 ###\ndef random_numbers(n)\n  # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
worst_best_time_complexity.zig
// \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6211\u5011\u5728\u5be6\u969b\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u56e0\u70ba\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6a5f\u7387\u4e0b\u624d\u80fd\u9054\u5230\uff0c\u53ef\u80fd\u6703\u5e36\u4f86\u4e00\u5b9a\u7684\u8aa4\u5c0e\u6027\u3002\u800c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u70ba\u5be6\u7528\uff0c\u56e0\u70ba\u5b83\u7d66\u51fa\u4e86\u4e00\u500b\u6548\u7387\u5b89\u5168\u503c\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u6f14\u7b97\u6cd5\u3002

\u5f9e\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ea\u51fa\u73fe\u65bc\u201c\u7279\u6b8a\u7684\u8cc7\u6599\u5206\u4f48\u201d\uff0c\u9019\u4e9b\u60c5\u6cc1\u7684\u51fa\u73fe\u6a5f\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u4e26\u4e0d\u80fd\u771f\u5be6\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9ad4\u73fe\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8f38\u5165\u8cc7\u6599\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8a18\u865f\u4f86\u8868\u793a\u3002

\u5c0d\u65bc\u90e8\u5206\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u63a8\u7b97\u51fa\u96a8\u6a5f\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u5e73\u5747\u60c5\u6cc1\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u65bc\u8f38\u5165\u9663\u5217\u662f\u88ab\u6253\u4e82\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73fe\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6a5f\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u9ebc\u6f14\u7b97\u6cd5\u7684\u5e73\u5747\u8ff4\u5708\u6b21\u6578\u5c31\u662f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

\u4f46\u5c0d\u65bc\u8f03\u70ba\u8907\u96dc\u7684\u6f14\u7b97\u6cd5\uff0c\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5f80\u5f80\u6bd4\u8f03\u56f0\u96e3\uff0c\u56e0\u70ba\u5f88\u96e3\u5206\u6790\u51fa\u5728\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u6574\u9ad4\u6578\u5b78\u671f\u671b\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f5c\u70ba\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u8a55\u5224\u6a19\u6e96\u3002

\u70ba\u4ec0\u9ebc\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u865f\uff1f

\u53ef\u80fd\u7531\u65bc \\(O\\) \u7b26\u865f\u904e\u65bc\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u5011\u5e38\u5e38\u4f7f\u7528\u5b83\u4f86\u8868\u793a\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u3002\u4f46\u5f9e\u56b4\u683c\u610f\u7fa9\u4e0a\u8b1b\uff0c\u9019\u7a2e\u505a\u6cd5\u4e26\u4e0d\u898f\u7bc4\u3002\u5728\u672c\u66f8\u548c\u5176\u4ed6\u8cc7\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u985e\u4f3c\u201c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8acb\u5c07\u5176\u76f4\u63a5\u7406\u89e3\u70ba \\(\\Theta(n)\\) \u3002

"},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u8cc7\u6599\u7d50\u69cb","text":"

Abstract

\u8cc7\u6599\u7d50\u69cb\u5982\u540c\u4e00\u526f\u7a69\u56fa\u800c\u591a\u6a23\u7684\u6846\u67b6\u3002

\u5b83\u70ba\u8cc7\u6599\u7684\u6709\u5e8f\u7d44\u7e54\u63d0\u4f9b\u4e86\u85cd\u5716\uff0c\u6f14\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u790e\u4e0a\u751f\u52d5\u8d77\u4f86\u3002

"},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e
  • 3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225
  • 3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *
  • 3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *
  • 3.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225","text":"

\u7576\u8ac7\u53ca\u8a08\u7b97\u6a5f\u4e2d\u7684\u8cc7\u6599\u6642\uff0c\u6211\u5011\u6703\u60f3\u5230\u6587\u5b57\u3001\u5716\u7247\u3001\u5f71\u7247\u3001\u8a9e\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u7a2e\u5f62\u5f0f\u3002\u5118\u7ba1\u9019\u4e9b\u8cc7\u6599\u7684\u7d44\u7e54\u5f62\u5f0f\u5404\u7570\uff0c\u4f46\u5b83\u5011\u90fd\u7531\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u69cb\u6210\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u9032\u884c\u904b\u7b97\u7684\u578b\u5225\uff0c\u5728\u6f14\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

  • \u6574\u6578\u578b\u5225 byte\u3001short\u3001int\u3001long \u3002
  • \u6d6e\u9ede\u6578\u578b\u5225 float\u3001double \uff0c\u7528\u65bc\u8868\u793a\u5c0f\u6578\u3002
  • \u5b57\u5143\u578b\u5225 char \uff0c\u7528\u65bc\u8868\u793a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u6bcd\u3001\u6a19\u9ede\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002
  • \u5e03\u6797\u578b\u5225 bool \uff0c\u7528\u65bc\u8868\u793a\u201c\u662f\u201d\u8207\u201c\u5426\u201d\u5224\u65b7\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4ee5\u4e8c\u9032\u4f4d\u5236\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u3002\u4e00\u500b\u4e8c\u9032\u4f4d\u5236\u4f4d\u5373\u70ba \\(1\\) \u4f4d\u5143\u3002\u5728\u7d55\u5927\u591a\u6578\u73fe\u4ee3\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\\(1\\) \u4f4d\u5143\u7d44\uff08byte\uff09\u7531 \\(8\\) \u4f4d\u5143\uff08bit\uff09\u7d44\u6210\u3002

\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u5176\u4f54\u7528\u7684\u7a7a\u9593\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u70ba\u4f8b\u3002

  • \u6574\u6578\u578b\u5225 byte \u4f54\u7528 \\(1\\) \u4f4d\u5143\u7d44 = \\(8\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u500b\u6578\u5b57\u3002
  • \u6574\u6578\u578b\u5225 int \u4f54\u7528 \\(4\\) \u4f4d\u5143\u7d44 = \\(32\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u500b\u6578\u5b57\u3002

\u8868 3-1 \u5217\u8209\u4e86 Java \u4e2d\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u3002\u6b64\u8868\u683c\u7121\u9808\u6b7b\u8a18\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u6642\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u4f86\u56de\u61b6\u3002

\u8868 3-1 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u548c\u53d6\u503c\u7bc4\u570d

\u578b\u5225 \u7b26\u865f \u4f54\u7528\u7a7a\u9593 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9810\u8a2d\u503c \u6574\u6578 byte 1 \u4f4d\u5143\u7d44 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u4f4d\u5143\u7d44 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u4f4d\u5143\u7d44 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u4f4d\u5143\u7d44 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u9ede\u6578 float 4 \u4f4d\u5143\u7d44 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u4f4d\u5143\u7d44 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u5143 char 2 \u4f4d\u5143\u7d44 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u6797 bool 1 \u4f4d\u5143\u7d44 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

\u8acb\u6ce8\u610f\uff0c\u8868 3-1 \u91dd\u5c0d\u7684\u662f Java \u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u60c5\u6cc1\u3002\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u6709\u5404\u81ea\u7684\u8cc7\u6599\u578b\u5225\u5b9a\u7fa9\uff0c\u5b83\u5011\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002

  • \u5728 Python \u4e2d\uff0c\u6574\u6578\u578b\u5225 int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\uff1b\u6d6e\u9ede\u6578 float \u662f\u96d9\u7cbe\u5ea6 64 \u4f4d\uff1b\u6c92\u6709 char \u578b\u5225\uff0c\u55ae\u500b\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32 str \u3002
  • C \u548c C++ \u672a\u660e\u78ba\u898f\u5b9a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5be6\u73fe\u548c\u5e73\u81fa\u5404\u7570\u3002\u8868 3-1 \u9075\u5faa LP64 \u8cc7\u6599\u6a21\u578b\uff0c\u5176\u7528\u65bc\u5305\u62ec Linux \u548c macOS \u5728\u5167\u7684 Unix 64 \u4f4d\u4f5c\u696d\u7cfb\u7d71\u3002
  • \u5b57\u5143 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u53d6\u6c7a\u65bc\u7279\u5b9a\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\uff0c\u8a73\u898b\u201c\u5b57\u5143\u7de8\u78bc\u201d\u7ae0\u7bc0\u3002
  • \u5373\u4f7f\u8868\u793a\u5e03\u6797\u91cf\u50c5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u8a18\u61b6\u9ad4\u4e2d\u901a\u5e38\u4e5f\u5132\u5b58\u70ba 1 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba\u73fe\u4ee3\u8a08\u7b97\u6a5f CPU \u901a\u5e38\u5c07 1 \u4f4d\u5143\u7d44\u4f5c\u70ba\u6700\u5c0f\u5b9a\u5740\u8a18\u61b6\u9ad4\u55ae\u5143\u3002

\u90a3\u9ebc\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u9593\u6709\u4ec0\u9ebc\u95dc\u806f\u5462\uff1f\u6211\u5011\u77e5\u9053\uff0c\u8cc7\u6599\u7d50\u69cb\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u8207\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002\u9019\u53e5\u8a71\u7684\u4e3b\u8a9e\u662f\u201c\u7d50\u69cb\u201d\u800c\u975e\u201c\u8cc7\u6599\u201d\u3002

\u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6578\u5b57\u201d\uff0c\u6211\u5011\u81ea\u7136\u6703\u60f3\u5230\u4f7f\u7528\u9663\u5217\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u7684\u7dda\u6027\u7d50\u69cb\u53ef\u4ee5\u8868\u793a\u6578\u5b57\u7684\u76f8\u9130\u95dc\u4fc2\u548c\u9806\u5e8f\u95dc\u4fc2\uff0c\u4f46\u81f3\u65bc\u5132\u5b58\u7684\u5167\u5bb9\u662f\u6574\u6578 int\u3001\u5c0f\u6578 float \u9084\u662f\u5b57\u5143 char \uff0c\u5247\u8207\u201c\u8cc7\u6599\u7d50\u69cb\u201d\u7121\u95dc\u3002

\u63db\u53e5\u8a71\u8aaa\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u5167\u5bb9\u578b\u5225\u201d\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u7d44\u7e54\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u7528\u76f8\u540c\u7684\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\uff09\u4f86\u5132\u5b58\u8207\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
// JavaScript \u7684\u9663\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\nconst array = [0, 0.0, 'a', false];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
// \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
# Ruby \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *","text":"

\u5728\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6240\u6709\u8cc7\u6599\u90fd\u662f\u4ee5\u4e8c\u9032\u4f4d\u5236\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\uff0c\u5b57\u5143 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u70ba\u4e86\u8868\u793a\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u898f\u5b9a\u6bcf\u500b\u5b57\u5143\u548c\u4e8c\u9032\u4f4d\u5236\u6578\u4e4b\u9593\u7684\u4e00\u4e00\u5c0d\u61c9\u95dc\u4fc2\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u5f8c\uff0c\u8a08\u7b97\u6a5f\u5c31\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u5b8c\u6210\u4e8c\u9032\u4f4d\u5236\u6578\u5230\u5b57\u5143\u7684\u8f49\u63db\u3002

"},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u7a31\u70ba American Standard Code for Information Interchange\uff08\u7f8e\u570b\u6a19\u6e96\u8cc7\u8a0a\u4ea4\u63db\u7a0b\u5f0f\u78bc\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u9032\u4f4d\u5236\u6578\uff08\u4e00\u500b\u4f4d\u5143\u7d44\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6700\u591a\u80fd\u5920\u8868\u793a 128 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002\u5982\u5716 3-6 \u6240\u793a\uff0cASCII \u78bc\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5beb\u3001\u6578\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6a19\u9ede\u7b26\u865f\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u5143\uff08\u5982\u63db\u884c\u7b26\u548c\u88fd\u8868\u7b26\uff09\u3002

\u5716 3-6 \u00a0 ASCII \u78bc

\u7136\u800c\uff0cASCII \u78bc\u50c5\u80fd\u5920\u8868\u793a\u82f1\u6587\u3002\u96a8\u8457\u8a08\u7b97\u6a5f\u7684\u5168\u7403\u5316\uff0c\u8a95\u751f\u4e86\u4e00\u7a2e\u80fd\u5920\u8868\u793a\u66f4\u591a\u8a9e\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u790e\u4e0a\u64f4\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u5920\u8868\u793a 256 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002

\u5728\u4e16\u754c\u7bc4\u570d\u5167\uff0c\u9678\u7e8c\u51fa\u73fe\u4e86\u4e00\u6279\u9069\u7528\u65bc\u4e0d\u540c\u5730\u5340\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u9019\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u500b\u5b57\u5143\u7d71\u4e00\u70ba ASCII \u78bc\uff0c\u5f8c 128 \u500b\u5b57\u5143\u5b9a\u7fa9\u4e0d\u540c\uff0c\u4ee5\u9069\u61c9\u4e0d\u540c\u8a9e\u8a00\u7684\u9700\u6c42\u3002

"},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

\u5f8c\u4f86\u4eba\u5011\u767c\u73fe\uff0cEASCII \u78bc\u4ecd\u7136\u7121\u6cd5\u6eff\u8db3\u8a31\u591a\u8a9e\u8a00\u7684\u5b57\u5143\u6578\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6f22\u5b57\u6709\u8fd1\u5341\u842c\u500b\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u5e7e\u5343\u500b\u3002\u4e2d\u570b\u570b\u5bb6\u6a19\u6e96\u7e3d\u5c40\u65bc 1980 \u5e74\u91cb\u51fa\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u9304\u4e86 6763 \u500b\u6f22\u5b57\uff0c\u57fa\u672c\u6eff\u8db3\u4e86\u6f22\u5b57\u7684\u8a08\u7b97\u6a5f\u8655\u7406\u9700\u8981\u3002

\u7136\u800c\uff0cGB2312 \u7121\u6cd5\u8655\u7406\u90e8\u5206\u7f55\u898b\u5b57\u548c\u7e41\u9ad4\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u790e\u4e0a\u64f4\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u9304\u4e86 21886 \u500b\u6f22\u5b57\u3002\u5728 GBK \u7684\u7de8\u78bc\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u5143\u4f7f\u7528\u4e00\u500b\u4f4d\u5143\u7d44\u8868\u793a\uff0c\u6f22\u5b57\u4f7f\u7528\u5169\u500b\u4f4d\u5143\u7d44\u8868\u793a\u3002

"},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

\u96a8\u8457\u8a08\u7b97\u6a5f\u6280\u8853\u7684\u84ec\u52c3\u767c\u5c55\uff0c\u5b57\u7b26\u96c6\u8207\u7de8\u78bc\u6a19\u6e96\u767e\u82b1\u9f4a\u653e\uff0c\u800c\u9019\u5e36\u4f86\u4e86\u8a31\u591a\u554f\u984c\u3002\u4e00\u65b9\u9762\uff0c\u9019\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u7fa9\u4e86\u7279\u5b9a\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u7121\u6cd5\u5728\u591a\u8a9e\u8a00\u74b0\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u7a2e\u8a9e\u8a00\u5b58\u5728\u591a\u7a2e\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u5982\u679c\u5169\u81fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7de8\u78bc\u6a19\u6e96\uff0c\u5247\u5728\u8cc7\u8a0a\u50b3\u905e\u6642\u5c31\u6703\u51fa\u73fe\u4e82\u78bc\u3002

\u90a3\u500b\u6642\u4ee3\u7684\u7814\u7a76\u4eba\u54e1\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u500b\u8db3\u5920\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c07\u4e16\u754c\u7bc4\u570d\u5167\u7684\u6240\u6709\u8a9e\u8a00\u548c\u7b26\u865f\u90fd\u6536\u9304\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u6c7a\u8de8\u8a9e\u8a00\u74b0\u5883\u548c\u4e82\u78bc\u554f\u984c\u4e86\u55ce\uff1f\u5728\u9019\u7a2e\u60f3\u6cd5\u7684\u9a45\u52d5\u4e0b\uff0c\u4e00\u500b\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u61c9\u904b\u800c\u751f\u3002

Unicode \u7684\u4e2d\u6587\u540d\u7a31\u70ba\u201c\u7d71\u4e00\u78bc\u201d\uff0c\u7406\u8ad6\u4e0a\u80fd\u5bb9\u7d0d 100 \u591a\u842c\u500b\u5b57\u5143\u3002\u5b83\u81f4\u529b\u65bc\u5c07\u5168\u7403\u7bc4\u570d\u5167\u7684\u5b57\u5143\u7d0d\u5165\u7d71\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u7a2e\u901a\u7528\u7684\u5b57\u7b26\u96c6\u4f86\u8655\u7406\u548c\u986f\u793a\u5404\u7a2e\u8a9e\u8a00\u6587\u5b57\uff0c\u6e1b\u5c11\u56e0\u70ba\u7de8\u78bc\u6a19\u6e96\u4e0d\u540c\u800c\u7522\u751f\u7684\u4e82\u78bc\u554f\u984c\u3002

\u81ea 1991 \u5e74\u91cb\u51fa\u4ee5\u4f86\uff0cUnicode \u4e0d\u65b7\u64f4\u5145\u65b0\u7684\u8a9e\u8a00\u8207\u5b57\u5143\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7d93\u5305\u542b 149186 \u500b\u5b57\u5143\uff0c\u5305\u62ec\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\u3001\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002\u5728\u9f90\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u5143\u4f54\u7528 3 \u4f4d\u5143\u7d44\u751a\u81f3 4 \u4f4d\u5143\u7d44\u3002

Unicode \u662f\u4e00\u7a2e\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8cea\u4e0a\u662f\u7d66\u6bcf\u500b\u5b57\u5143\u5206\u914d\u4e00\u500b\u7de8\u865f\uff08\u7a31\u70ba\u201c\u78bc\u9ede\u201d\uff09\uff0c\u4f46\u5b83\u4e26\u6c92\u6709\u898f\u5b9a\u5728\u8a08\u7b97\u6a5f\u4e2d\u5982\u4f55\u5132\u5b58\u9019\u4e9b\u5b57\u5143\u78bc\u9ede\u3002\u6211\u5011\u4e0d\u7981\u6703\u554f\uff1a\u7576\u591a\u7a2e\u9577\u5ea6\u7684 Unicode \u78bc\u9ede\u540c\u6642\u51fa\u73fe\u5728\u4e00\u500b\u6587\u5b57\u4e2d\u6642\uff0c\u7cfb\u7d71\u5982\u4f55\u89e3\u6790\u5b57\u5143\uff1f\u4f8b\u5982\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u7684\u7de8\u78bc\uff0c\u7cfb\u7d71\u5982\u4f55\u78ba\u8a8d\u5b83\u662f\u4e00\u500b 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\u9084\u662f\u5169\u500b 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff1f

\u5c0d\u65bc\u4ee5\u4e0a\u554f\u984c\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u89e3\u6c7a\u65b9\u6848\u662f\u5c07\u6240\u6709\u5b57\u5143\u5132\u5b58\u70ba\u7b49\u9577\u7684\u7de8\u78bc\u3002\u5982\u5716 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff0c\u201c\u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u9ad8\u4f4d\u586b 0 \u5c07\u201cHello \u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u5143\u90fd\u7de8\u78bc\u70ba 2 \u4f4d\u5143\u7d44\u9577\u5ea6\u3002\u9019\u6a23\u7cfb\u7d71\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u4f4d\u5143\u7d44\u89e3\u6790\u4e00\u500b\u5b57\u5143\uff0c\u6062\u5fa9\u9019\u500b\u77ed\u8a9e\u7684\u5167\u5bb9\u4e86\u3002

\u5716 3-7 \u00a0 Unicode \u7de8\u78bc\u793a\u4f8b

\u7136\u800c ASCII \u78bc\u5df2\u7d93\u5411\u6211\u5011\u8b49\u660e\uff0c\u7de8\u78bc\u82f1\u6587\u53ea\u9700 1 \u4f4d\u5143\u7d44\u3002\u82e5\u63a1\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u5b57\u4f54\u7528\u7a7a\u9593\u7684\u5927\u5c0f\u5c07\u6703\u662f ASCII \u7de8\u78bc\u4e0b\u7684\u5169\u500d\uff0c\u975e\u5e38\u6d6a\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002

"},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7de8\u78bc","text":"

\u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u70ba\u570b\u969b\u4e0a\u4f7f\u7528\u6700\u5ee3\u6cdb\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u7a2e\u53ef\u8b8a\u9577\u5ea6\u7684\u7de8\u78bc\uff0c\u4f7f\u7528 1 \u5230 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6839\u64da\u5b57\u5143\u7684\u8907\u96dc\u6027\u800c\u8b8a\u3002ASCII \u5b57\u5143\u53ea\u9700 1 \u4f4d\u5143\u7d44\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u81d8\u5b57\u6bcd\u9700\u8981 2 \u4f4d\u5143\u7d44\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u5143\u9700\u8981 3 \u4f4d\u5143\u7d44\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u5143\u9700\u8981 4 \u4f4d\u5143\u7d44\u3002

UTF-8 \u7684\u7de8\u78bc\u898f\u5247\u4e26\u4e0d\u8907\u96dc\uff0c\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u5c0d\u65bc\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0c\u5c07\u6700\u9ad8\u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff0c\u5176\u9918 7 \u4f4d\u8a2d\u5b9a\u70ba Unicode \u78bc\u9ede\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u5143\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u4f54\u64da\u4e86\u524d 128 \u500b\u78bc\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0cUTF-8 \u7de8\u78bc\u53ef\u4ee5\u5411\u4e0b\u76f8\u5bb9 ASCII \u78bc\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u4f86\u89e3\u6790\u5e74\u4ee3\u4e45\u9060\u7684 ASCII \u78bc\u6587\u5b57\u3002
  • \u5c0d\u65bc\u9577\u5ea6\u70ba \\(n\\) \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c07\u9996\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff1b\u5f9e\u7b2c\u4e8c\u500b\u4f4d\u5143\u7d44\u958b\u59cb\uff0c\u5c07\u6bcf\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \uff1b\u5176\u9918\u6240\u6709\u4f4d\u7528\u65bc\u586b\u5145\u5b57\u5143\u7684 Unicode \u78bc\u9ede\u3002

\u5716 3-8 \u5c55\u793a\u4e86\u201cHello\u6f14\u7b97\u6cd5\u201d\u5c0d\u61c9\u7684 UTF-8 \u7de8\u78bc\u3002\u89c0\u5bdf\u767c\u73fe\uff0c\u7531\u65bc\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7d71\u53ef\u4ee5\u900f\u904e\u8b80\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u500b\u6578\u4f86\u89e3\u6790\u51fa\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(n\\) \u3002

\u4f46\u70ba\u4ec0\u9ebc\u8981\u5c07\u5176\u9918\u6240\u6709\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \u5462\uff1f\u5be6\u969b\u4e0a\uff0c\u9019\u500b \\(10\\) \u80fd\u5920\u8d77\u5230\u6821\u9a57\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8a2d\u7cfb\u7d71\u5f9e\u4e00\u500b\u932f\u8aa4\u7684\u4f4d\u5143\u7d44\u958b\u59cb\u89e3\u6790\u6587\u5b57\uff0c\u4f4d\u5143\u7d44\u982d\u90e8\u7684 \\(10\\) \u80fd\u5920\u5e6b\u52a9\u7cfb\u7d71\u5feb\u901f\u5224\u65b7\u51fa\u7570\u5e38\u3002

\u4e4b\u6240\u4ee5\u5c07 \\(10\\) \u7576\u4f5c\u6821\u9a57\u7b26\uff0c\u662f\u56e0\u70ba\u5728 UTF-8 \u7de8\u78bc\u898f\u5247\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \u3002\u9019\u500b\u7d50\u8ad6\u53ef\u4ee5\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\uff1a\u5047\u8a2d\u4e00\u500b\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \uff0c\u8aaa\u660e\u8a72\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(1\\) \uff0c\u5c0d\u61c9 ASCII \u78bc\u3002\u800c ASCII \u78bc\u7684\u6700\u9ad8\u4f4d\u61c9\u8a72\u662f \\(0\\) \uff0c\u8207\u5047\u8a2d\u77db\u76fe\u3002

\u5716 3-8 \u00a0 UTF-8 \u7de8\u78bc\u793a\u4f8b

\u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u898b\u7684\u7de8\u78bc\u65b9\u5f0f\u9084\u5305\u62ec\u4ee5\u4e0b\u5169\u7a2e\u3002

  • UTF-16 \u7de8\u78bc\uff1a\u4f7f\u7528 2 \u6216 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\u3002\u6240\u6709\u7684 ASCII \u5b57\u5143\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u5143\uff0c\u90fd\u7528 2 \u4f4d\u5143\u7d44\u8868\u793a\uff1b\u5c11\u6578\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4f4d\u5143\u7d44\u8868\u793a\u3002\u5c0d\u65bc 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0cUTF-16 \u7de8\u78bc\u8207 Unicode \u78bc\u9ede\u76f8\u7b49\u3002
  • UTF-32 \u7de8\u78bc\uff1a\u6bcf\u500b\u5b57\u5143\u90fd\u4f7f\u7528 4 \u4f4d\u5143\u7d44\u3002\u9019\u610f\u5473\u8457 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u4f54\u7528\u7a7a\u9593\uff0c\u7279\u5225\u662f\u5c0d\u65bc ASCII \u5b57\u5143\u4f54\u6bd4\u8f03\u9ad8\u7684\u6587\u5b57\u3002

\u5f9e\u5132\u5b58\u7a7a\u9593\u4f54\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u5143\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 1 \u4f4d\u5143\u7d44\uff1b\u4f7f\u7528 UTF-16 \u7de8\u78bc\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u5143\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u6703\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 2 \u4f4d\u5143\u7d44\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4f4d\u5143\u7d44\u3002

\u5f9e\u76f8\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8a31\u591a\u5de5\u5177\u548c\u5eab\u512a\u5148\u652f\u6301 UTF-8 \u3002

"},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc","text":"

\u5c0d\u65bc\u4ee5\u5f80\u7684\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u57f7\u884c\u4e2d\u7684\u5b57\u4e32\u90fd\u63a1\u7528 UTF-16 \u6216 UTF-32 \u9019\u985e\u7b49\u9577\u7de8\u78bc\u3002\u5728\u7b49\u9577\u7de8\u78bc\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b57\u4e32\u770b\u4f5c\u9663\u5217\u4f86\u8655\u7406\uff0c\u9019\u7a2e\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

  • \u96a8\u6a5f\u8a2a\u554f\uff1aUTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u9032\u884c\u96a8\u6a5f\u8a2a\u554f\u3002UTF-8 \u662f\u4e00\u7a2e\u8b8a\u9577\u7de8\u78bc\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5f9e\u5b57\u4e32\u7684\u958b\u59cb\u8655\u8d70\u8a2a\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u9019\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u3002
  • \u5b57\u5143\u8a08\u6578\uff1a\u8207\u96a8\u6a5f\u8a2a\u554f\u985e\u4f3c\uff0c\u8a08\u7b97 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8a08\u7b97 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u9700\u8981\u8d70\u8a2a\u6574\u500b\u5b57\u4e32\u3002
  • \u5b57\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u9023\u7dda\u3001\u63d2\u5165\u3001\u522a\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u9032\u884c\u3002\u5728 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u9032\u884c\u9019\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u984d\u5916\u7684\u8a08\u7b97\uff0c\u4ee5\u78ba\u4fdd\u4e0d\u6703\u7522\u751f\u7121\u6548\u7684 UTF-8 \u7de8\u78bc\u3002

\u5be6\u969b\u4e0a\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6848\u8a2d\u8a08\u662f\u4e00\u500b\u5f88\u6709\u8da3\u7684\u8a71\u984c\uff0c\u6d89\u53ca\u8a31\u591a\u56e0\u7d20\u3002

  • Java \u7684 String \u578b\u5225\u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba Java \u8a9e\u8a00\u8a2d\u8a08\u4e4b\u521d\uff0c\u4eba\u5011\u8a8d\u70ba 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u5143\u3002\u7136\u800c\uff0c\u9019\u662f\u4e00\u500b\u4e0d\u6b63\u78ba\u7684\u5224\u65b7\u3002\u5f8c\u4f86 Unicode \u898f\u7bc4\u64f4\u5c55\u5230\u4e86\u8d85\u904e 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u5143\u73fe\u5728\u53ef\u80fd\u7531\u4e00\u5c0d 16 \u4f4d\u7684\u503c\uff08\u7a31\u70ba\u201c\u4ee3\u7406\u5c0d\u201d\uff09\u8868\u793a\u3002
  • JavaScript \u548c TypeScript \u7684\u5b57\u4e32\u4f7f\u7528 UTF-16 \u7de8\u78bc\u7684\u539f\u56e0\u8207 Java \u985e\u4f3c\u3002\u7576 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8a9e\u8a00\u6642\uff0cUnicode \u9084\u8655\u65bc\u767c\u5c55\u65e9\u671f\uff0c\u90a3\u6642\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7de8\u78bc\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u5143\u4e86\u3002
  • C# \u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u4e3b\u8981\u662f\u56e0\u70ba .NET \u5e73\u81fa\u662f\u7531 Microsoft \u8a2d\u8a08\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u8853\uff08\u5305\u62ec Windows \u4f5c\u696d\u7cfb\u7d71\uff09\u90fd\u5ee3\u6cdb\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002

\u7531\u65bc\u4ee5\u4e0a\u7a0b\u5f0f\u8a9e\u8a00\u5c0d\u5b57\u5143\u6578\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u5011\u4e0d\u5f97\u4e0d\u63a1\u53d6\u201c\u4ee3\u7406\u5c0d\u201d\u7684\u65b9\u5f0f\u4f86\u8868\u793a\u8d85\u904e 16 \u4f4d\u9577\u5ea6\u7684 Unicode \u5b57\u5143\u3002\u9019\u662f\u4e00\u500b\u4e0d\u5f97\u5df2\u70ba\u4e4b\u7684\u7121\u5948\u4e4b\u8209\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5c0d\u7684\u5b57\u4e32\u4e2d\uff0c\u4e00\u500b\u5b57\u5143\u53ef\u80fd\u4f54\u7528 2 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\uff0c\u5f9e\u800c\u55aa\u5931\u4e86\u7b49\u9577\u7de8\u78bc\u7684\u512a\u52e2\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u8655\u7406\u4ee3\u7406\u5c0d\u9700\u8981\u984d\u5916\u589e\u52a0\u7a0b\u5f0f\u78bc\uff0c\u9019\u63d0\u9ad8\u4e86\u7a0b\u5f0f\u8a2d\u8a08\u7684\u8907\u96dc\u6027\u548c\u9664\u932f\u96e3\u5ea6\u3002

\u51fa\u65bc\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7de8\u78bc\u65b9\u6848\u3002

  • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7de8\u78bc\uff0c\u4e26\u63a1\u7528\u4e00\u7a2e\u9748\u6d3b\u7684\u5b57\u4e32\u8868\u793a\uff0c\u5132\u5b58\u7684\u5b57\u5143\u9577\u5ea6\u53d6\u6c7a\u65bc\u5b57\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u78bc\u9ede\u3002\u82e5\u5b57\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u5b57\u5143\u8d85\u51fa\u4e86 ASCII \u7bc4\u570d\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8a9e\u8a00\u5e73\u9762\uff08BMP\uff09\u5167\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 4 \u4f4d\u5143\u7d44\u3002
  • Go \u8a9e\u8a00\u7684 string \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Go \u8a9e\u8a00\u9084\u63d0\u4f9b\u4e86 rune \u578b\u5225\uff0c\u5b83\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002
  • Rust \u8a9e\u8a00\u7684 str \u548c String \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u578b\u5225\uff0c\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8a0e\u8ad6\u7684\u90fd\u662f\u5b57\u4e32\u5728\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u9019\u548c\u5b57\u4e32\u5982\u4f55\u5728\u6a94\u6848\u4e2d\u5132\u5b58\u6216\u5728\u7db2\u8def\u4e2d\u50b3\u8f38\u662f\u4e0d\u540c\u7684\u554f\u984c\u3002\u5728\u6a94\u6848\u5132\u5b58\u6216\u7db2\u8def\u50b3\u8f38\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u5b57\u4e32\u7de8\u78bc\u70ba UTF-8 \u683c\u5f0f\uff0c\u4ee5\u9054\u5230\u6700\u512a\u7684\u76f8\u5bb9\u6027\u548c\u7a7a\u9593\u6548\u7387\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e","text":"

\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\u5305\u62ec\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\uff0c\u5b83\u5011\u53ef\u4ee5\u5f9e\u201c\u908f\u8f2f\u7d50\u69cb\u201d\u548c\u201c\u7269\u7406\u7d50\u69cb\u201d\u5169\u500b\u7dad\u5ea6\u9032\u884c\u5206\u985e\u3002

"},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u908f\u8f2f\u7d50\u69cb\uff1a\u7dda\u6027\u8207\u975e\u7dda\u6027","text":"

\u908f\u8f2f\u7d50\u69cb\u63ed\u793a\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\u3002\u5728\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u8cc7\u6599\u6309\u7167\u4e00\u5b9a\u9806\u5e8f\u6392\u5217\uff0c\u9ad4\u73fe\u4e86\u8cc7\u6599\u4e4b\u9593\u7684\u7dda\u6027\u95dc\u4fc2\uff1b\u800c\u5728\u6a39\u4e2d\uff0c\u8cc7\u6599\u5f9e\u9802\u90e8\u5411\u4e0b\u6309\u5c64\u6b21\u6392\u5217\uff0c\u8868\u73fe\u51fa\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff1b\u5716\u5247\u7531\u7bc0\u9ede\u548c\u908a\u69cb\u6210\uff0c\u53cd\u6620\u4e86\u8907\u96dc\u7684\u7db2\u8def\u95dc\u4fc2\u3002

\u5982\u5716 3-1 \u6240\u793a\uff0c\u908f\u8f2f\u7d50\u69cb\u53ef\u5206\u70ba\u201c\u7dda\u6027\u201d\u548c\u201c\u975e\u7dda\u6027\u201d\u5169\u5927\u985e\u3002\u7dda\u6027\u7d50\u69cb\u6bd4\u8f03\u76f4\u89c0\uff0c\u6307\u8cc7\u6599\u5728\u908f\u8f2f\u95dc\u4fc2\u4e0a\u5448\u7dda\u6027\u6392\u5217\uff1b\u975e\u7dda\u6027\u7d50\u69cb\u5247\u76f8\u53cd\uff0c\u5448\u975e\u7dda\u6027\u6392\u5217\u3002

  • \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u4e00\u7684\u9806\u5e8f\u95dc\u4fc2\u3002
  • \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u96dc\u6e4a\u8868\u3002

\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u6a39\u5f62\u7d50\u69cb\u548c\u7db2\u72c0\u7d50\u69cb\u3002

  • \u6a39\u5f62\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u591a\u7684\u95dc\u4fc2\u3002
  • \u7db2\u72c0\u7d50\u69cb\uff1a\u5716\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u591a\u5c0d\u591a\u7684\u95dc\u4fc2\u3002

\u5716 3-1 \u00a0 \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u8207\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb

"},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7d50\u69cb\uff1a\u9023\u7e8c\u8207\u5206\u6563","text":"

\u7576\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u5716 3-2 \u5c55\u793a\u4e86\u4e00\u500b\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u689d\uff0c\u5176\u4e2d\u6bcf\u500b\u9ed1\u8272\u65b9\u584a\u90fd\u5305\u542b\u4e00\u584a\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u8a18\u61b6\u9ad4\u60f3\u8c61\u6210\u4e00\u500b\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u500b\u55ae\u5143\u683c\u90fd\u53ef\u4ee5\u5132\u5b58\u4e00\u5b9a\u5927\u5c0f\u7684\u8cc7\u6599\u3002

\u7cfb\u7d71\u900f\u904e\u8a18\u61b6\u9ad4\u4f4d\u5740\u4f86\u8a2a\u554f\u76ee\u6a19\u4f4d\u7f6e\u7684\u8cc7\u6599\u3002\u5982\u5716 3-2 \u6240\u793a\uff0c\u8a08\u7b97\u6a5f\u6839\u64da\u7279\u5b9a\u898f\u5247\u70ba\u8868\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5206\u914d\u7de8\u865f\uff0c\u78ba\u4fdd\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u6709\u552f\u4e00\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u3002\u6709\u4e86\u9019\u4e9b\u4f4d\u5740\uff0c\u7a0b\u5f0f\u4fbf\u53ef\u4ee5\u8a2a\u554f\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u3002

\u5716 3-2 \u00a0 \u8a18\u61b6\u9ad4\u689d\u3001\u8a18\u61b6\u9ad4\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u4f4d\u5740

Tip

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5c07\u8a18\u61b6\u9ad4\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u500b\u7c21\u5316\u7684\u985e\u6bd4\uff0c\u5be6\u969b\u8a18\u61b6\u9ad4\u7684\u5de5\u4f5c\u6a5f\u5236\u6bd4\u8f03\u8907\u96dc\uff0c\u6d89\u53ca\u4f4d\u5740\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u7ba1\u7406\u3001\u5feb\u53d6\u6a5f\u5236\u3001\u865b\u64ec\u8a18\u61b6\u9ad4\u548c\u7269\u7406\u8a18\u61b6\u9ad4\u7b49\u6982\u5ff5\u3002

\u8a18\u61b6\u9ad4\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u5171\u4eab\u8cc7\u6e90\uff0c\u7576\u67d0\u584a\u8a18\u61b6\u9ad4\u88ab\u67d0\u500b\u7a0b\u5f0f\u4f54\u7528\u6642\uff0c\u5247\u7121\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5f0f\u540c\u6642\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u4e2d\uff0c\u8a18\u61b6\u9ad4\u8cc7\u6e90\u662f\u4e00\u500b\u91cd\u8981\u7684\u8003\u616e\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u6f14\u7b97\u6cd5\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u5cf0\u503c\u4e0d\u61c9\u8d85\u904e\u7cfb\u7d71\u5269\u9918\u7a7a\u9592\u8a18\u61b6\u9ad4\uff1b\u5982\u679c\u7f3a\u5c11\u9023\u7e8c\u5927\u584a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u90a3\u9ebc\u6240\u9078\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u5fc5\u9808\u80fd\u5920\u5132\u5b58\u5728\u5206\u6563\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\u3002

\u5982\u5716 3-3 \u6240\u793a\uff0c\u7269\u7406\u7d50\u69cb\u53cd\u6620\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u53ef\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u7269\u7406\u7d50\u69cb\u5f9e\u5e95\u5c64\u6c7a\u5b9a\u4e86\u8cc7\u6599\u7684\u8a2a\u554f\u3001\u66f4\u65b0\u3001\u589e\u522a\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u65b9\u9762\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u9ede\u3002

\u5716 3-3 \u00a0 \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u8207\u5206\u6563\u7a7a\u9593\u5132\u5b58

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u57fa\u65bc\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u4e8c\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002\u4f8b\u5982\uff0c\u5806\u758a\u548c\u4f47\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u5be6\u73fe\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1b\u800c\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u3002

  • \u57fa\u65bc\u9663\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u77e9\u9663\u3001\u5f35\u91cf\uff08\u7dad\u5ea6 \\(\\geq 3\\) \u7684\u9663\u5217\uff09\u7b49\u3002
  • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u3002

\u93c8\u7d50\u4e32\u5217\u5728\u521d\u59cb\u5316\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u5c0d\u5176\u9577\u5ea6\u9032\u884c\u8abf\u6574\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u52d5\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u9663\u5217\u53ef\u900f\u904e\u91cd\u65b0\u5206\u914d\u8a18\u61b6\u9ad4\u5be6\u73fe\u9577\u5ea6\u8b8a\u5316\uff0c\u5f9e\u800c\u5177\u5099\u4e00\u5b9a\u7684\u201c\u52d5\u614b\u6027\u201d\u3002

Tip

\u5982\u679c\u4f60\u611f\u89ba\u7269\u7406\u7d50\u69cb\u7406\u89e3\u8d77\u4f86\u6709\u56f0\u96e3\uff0c\u5efa\u8b70\u5148\u95b1\u8b80\u4e0b\u4e00\u7ae0\uff0c\u7136\u5f8c\u518d\u56de\u9867\u672c\u7bc0\u5167\u5bb9\u3002

"},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *","text":"

Tip

\u5728\u672c\u66f8\u4e2d\uff0c\u6a19\u984c\u5e36\u6709 * \u7b26\u865f\u7684\u662f\u9078\u8b80\u7ae0\u7bc0\u3002\u5982\u679c\u4f60\u6642\u9593\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\uff0c\u7b49\u5b78\u5b8c\u5fc5\u8b80\u7ae0\u7bc0\u5f8c\u518d\u55ae\u7368\u653b\u514b\u3002

"},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578","text":"

\u5728\u4e0a\u4e00\u7bc0\u7684\u8868\u683c\u4e2d\u6211\u5011\u767c\u73fe\uff0c\u6240\u6709\u6574\u6578\u578b\u5225\u80fd\u5920\u8868\u793a\u7684\u8ca0\u6578\u90fd\u6bd4\u6b63\u6578\u591a\u4e00\u500b\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \u3002\u9019\u500b\u73fe\u8c61\u6bd4\u8f03\u53cd\u76f4\u89ba\uff0c\u5b83\u7684\u5167\u5728\u539f\u56e0\u6d89\u53ca\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u76f8\u95dc\u77e5\u8b58\u3002

\u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6578\u5b57\u662f\u4ee5\u201c\u4e8c\u88dc\u6578\u201d\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u7684\u3002\u5728\u5206\u6790\u9019\u6a23\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7d66\u51fa\u4e09\u8005\u7684\u5b9a\u7fa9\u3002

  • \u539f\u78bc\uff1a\u6211\u5011\u5c07\u6578\u5b57\u7684\u4e8c\u9032\u4f4d\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u8996\u70ba\u7b26\u865f\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6578\uff0c\\(1\\) \u8868\u793a\u8ca0\u6578\uff0c\u5176\u9918\u4f4d\u8868\u793a\u6578\u5b57\u7684\u503c\u3002
  • \u4e00\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e00\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e00\u88dc\u6578\u662f\u5c0d\u5176\u539f\u78bc\u9664\u7b26\u865f\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
  • \u4e8c\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e8c\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e8c\u88dc\u6578\u662f\u5728\u5176\u4e00\u88dc\u6578\u7684\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u3002

\u5716 3-4 \u5c55\u793a\u4e86\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u8f49\u63db\u65b9\u6cd5\u3002

\u5716 3-4 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u8207\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u76f8\u4e92\u8f49\u63db

\u539f\u78bc\uff08sign-magnitude\uff09\u96d6\u7136\u6700\u76f4\u89c0\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8ca0\u6578\u7684\u539f\u78bc\u4e0d\u80fd\u76f4\u63a5\u7528\u65bc\u904b\u7b97\u3002\u4f8b\u5982\u5728\u539f\u78bc\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7d50\u679c\u662f \\(-3\\) \uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u8a08\u7b97\u6a5f\u5f15\u5165\u4e86\u4e00\u88dc\u6578\uff081's complement\uff09\u3002\u5982\u679c\u6211\u5011\u5148\u5c07\u539f\u78bc\u8f49\u63db\u70ba\u4e00\u88dc\u6578\uff0c\u4e26\u5728\u4e00\u88dc\u6578\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5f9e\u4e00\u88dc\u6578\u8f49\u63db\u56de\u539f\u78bc\uff0c\u5247\u53ef\u5f97\u5230\u6b63\u78ba\u7d50\u679c \\(-1\\) \u3002

\\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0010 \\; \\text{(\u539f\u78bc)} \\newline & = 0000 \\; 0001 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1101 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & \\rightarrow -1 \\end{aligned} \\]

\u53e6\u4e00\u65b9\u9762\uff0c\u6578\u5b57\u96f6\u7684\u539f\u78bc\u6709 \\(+0\\) \u548c \\(-0\\) \u5169\u7a2e\u8868\u793a\u65b9\u5f0f\u3002\u9019\u610f\u5473\u8457\u6578\u5b57\u96f6\u5c0d\u61c9\u5169\u500b\u4e0d\u540c\u7684\u4e8c\u9032\u4f4d\u5236\u7de8\u78bc\uff0c\u9019\u53ef\u80fd\u6703\u5e36\u4f86\u6b67\u7fa9\u3002\u6bd4\u5982\u5728\u689d\u4ef6\u5224\u65b7\u4e2d\uff0c\u5982\u679c\u6c92\u6709\u5340\u5206\u6b63\u96f6\u548c\u8ca0\u96f6\uff0c\u5247\u53ef\u80fd\u6703\u5c0e\u81f4\u5224\u65b7\u7d50\u679c\u51fa\u932f\u3002\u800c\u5982\u679c\u6211\u5011\u60f3\u8655\u7406\u6b63\u96f6\u548c\u8ca0\u96f6\u6b67\u7fa9\uff0c\u5247\u9700\u8981\u5f15\u5165\u984d\u5916\u7684\u5224\u65b7\u64cd\u4f5c\uff0c\u9019\u53ef\u80fd\u6703\u964d\u4f4e\u8a08\u7b97\u6a5f\u7684\u904b\u7b97\u6548\u7387\u3002

\\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

\u8207\u539f\u78bc\u4e00\u6a23\uff0c\u4e00\u88dc\u6578\u4e5f\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u554f\u984c\uff0c\u56e0\u6b64\u8a08\u7b97\u6a5f\u9032\u4e00\u6b65\u5f15\u5165\u4e86\u4e8c\u88dc\u6578\uff082's complement\uff09\u3002\u6211\u5011\u5148\u4f86\u89c0\u5bdf\u4e00\u4e0b\u8ca0\u96f6\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u8f49\u63db\u904e\u7a0b\uff1a

\\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u78bc)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u4e00\u88dc\u6578)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline \\end{aligned} \\]

\u5728\u8ca0\u96f6\u7684\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u6703\u7522\u751f\u9032\u4f4d\uff0c\u4f46 byte \u578b\u5225\u7684\u9577\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u4f4d\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u6703\u88ab\u6368\u68c4\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8ca0\u96f6\u7684\u4e8c\u88dc\u6578\u70ba \\(0000 \\; 0000\\) \uff0c\u8207\u6b63\u96f6\u7684\u4e8c\u88dc\u6578\u76f8\u540c\u3002\u9019\u610f\u5473\u8457\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u500b\u96f6\uff0c\u6b63\u8ca0\u96f6\u6b67\u7fa9\u5f9e\u800c\u5f97\u5230\u89e3\u6c7a\u3002

\u9084\u5269\u6700\u5f8c\u4e00\u500b\u7591\u60d1\uff1abyte \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u4f86\u7684\u4e00\u500b\u8ca0\u6578 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u5011\u6ce8\u610f\u5230\uff0c\u5340\u9593 \\([-127, +127]\\) \u5167\u7684\u6240\u6709\u6574\u6578\u90fd\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\uff0c\u4e26\u4e14\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u53ef\u4ee5\u4e92\u76f8\u8f49\u63db\u3002

\u7136\u800c\uff0c\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u662f\u4e00\u500b\u4f8b\u5916\uff0c\u5b83\u4e26\u6c92\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3002\u6839\u64da\u8f49\u63db\u65b9\u6cd5\uff0c\u6211\u5011\u5f97\u5230\u8a72\u4e8c\u88dc\u6578\u7684\u539f\u78bc\u70ba \\(0000 \\; 0000\\) \u3002\u9019\u986f\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u70ba\u8a72\u539f\u78bc\u8868\u793a\u6578\u5b57 \\(0\\) \uff0c\u5b83\u7684\u4e8c\u88dc\u6578\u61c9\u8a72\u662f\u81ea\u8eab\u3002\u8a08\u7b97\u6a5f\u898f\u5b9a\u9019\u500b\u7279\u6b8a\u7684\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5be6\u969b\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u4e8c\u88dc\u6578\u4e0b\u7684\u8a08\u7b97\u7d50\u679c\u5c31\u662f \\(-128\\) \u3002

\\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u4e8c\u88dc\u6578)} + 1111 \\; 1111 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & \\rightarrow -128 \\end{aligned} \\]

\u4f60\u53ef\u80fd\u5df2\u7d93\u767c\u73fe\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8a08\u7b97\u90fd\u662f\u52a0\u6cd5\u904b\u7b97\u3002\u9019\u6697\u793a\u8457\u4e00\u500b\u91cd\u8981\u4e8b\u5be6\uff1a\u8a08\u7b97\u6a5f\u5167\u90e8\u7684\u786c\u9ad4\u96fb\u8def\u4e3b\u8981\u662f\u57fa\u65bc\u52a0\u6cd5\u904b\u7b97\u8a2d\u8a08\u7684\u3002\u9019\u662f\u56e0\u70ba\u52a0\u6cd5\u904b\u7b97\u76f8\u5c0d\u65bc\u5176\u4ed6\u904b\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u6e1b\u6cd5\uff09\u4f86\u8aaa\uff0c\u786c\u9ad4\u5be6\u73fe\u8d77\u4f86\u66f4\u7c21\u55ae\uff0c\u66f4\u5bb9\u6613\u9032\u884c\u4e26\u884c\u5316\u8655\u7406\uff0c\u904b\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

\u8acb\u6ce8\u610f\uff0c\u9019\u4e26\u4e0d\u610f\u5473\u8457\u8a08\u7b97\u6a5f\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u900f\u904e\u5c07\u52a0\u6cd5\u8207\u4e00\u4e9b\u57fa\u672c\u908f\u8f2f\u904b\u7b97\u7d50\u5408\uff0c\u8a08\u7b97\u6a5f\u80fd\u5920\u5be6\u73fe\u5404\u7a2e\u5176\u4ed6\u7684\u6578\u5b78\u904b\u7b97\u3002\u4f8b\u5982\uff0c\u8a08\u7b97\u6e1b\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8a08\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u6e1b\u6cd5\u3002

\u73fe\u5728\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u4e8c\u88dc\u6578\u7684\u539f\u56e0\uff1a\u57fa\u65bc\u4e8c\u88dc\u6578\u8868\u793a\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u7528\u540c\u6a23\u7684\u96fb\u8def\u548c\u64cd\u4f5c\u4f86\u8655\u7406\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\u4f86\u8655\u7406\u6e1b\u6cd5\uff0c\u4e26\u4e14\u7121\u9808\u7279\u5225\u8655\u7406\u6b63\u8ca0\u96f6\u7684\u6b67\u7fa9\u554f\u984c\u3002\u9019\u5927\u5927\u7c21\u5316\u4e86\u786c\u9ad4\u8a2d\u8a08\uff0c\u63d0\u9ad8\u4e86\u904b\u7b97\u6548\u7387\u3002

\u4e8c\u88dc\u6578\u7684\u8a2d\u8a08\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u95dc\u4fc2\u6211\u5011\u5c31\u5148\u4ecb\u7d39\u5230\u9019\u88e1\uff0c\u5efa\u8b70\u6709\u8208\u8da3\u7684\u8b80\u8005\u9032\u4e00\u6b65\u6df1\u5165\u77ad\u89e3\u3002

"},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u9ede\u6578\u7de8\u78bc","text":"

\u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u6703\u767c\u73fe\uff1aint \u548c float \u9577\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u4f4d\u5143\u7d44 \uff0c\u4f46\u70ba\u4ec0\u9ebc float \u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \uff1f\u9019\u975e\u5e38\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u6309\u7406\u8aaa float \u9700\u8981\u8868\u793a\u5c0f\u6578\uff0c\u53d6\u503c\u7bc4\u570d\u61c9\u8a72\u8b8a\u5c0f\u624d\u5c0d\u3002

\u5be6\u969b\u4e0a\uff0c\u9019\u662f\u56e0\u70ba\u6d6e\u9ede\u6578 float \u63a1\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8a18\u4e00\u500b 32 \u4f4d\u5143\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u70ba\uff1a

\\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

\u6839\u64da IEEE 754 \u6a19\u6e96\uff0c32-bit \u9577\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u500b\u90e8\u5206\u69cb\u6210\u3002

  • \u7b26\u865f\u4f4d \\(\\mathrm{S}\\) \uff1a\u4f54 1 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{31}\\) \u3002
  • \u6307\u6578\u4f4d \\(\\mathrm{E}\\) \uff1a\u4f54 8 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
  • \u5206\u6578\u4f4d \\(\\mathrm{N}\\) \uff1a\u4f54 23 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

\u4e8c\u9032\u4f4d\u5236\u6578 float \u5c0d\u61c9\u503c\u7684\u8a08\u7b97\u65b9\u6cd5\u70ba\uff1a

\\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

\u8f49\u5316\u5230\u5341\u9032\u4f4d\u5236\u4e0b\u7684\u8a08\u7b97\u516c\u5f0f\u70ba\uff1a

\\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

\u5176\u4e2d\u5404\u9805\u7684\u53d6\u503c\u7bc4\u570d\u70ba\uff1a

\\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

\u5716 3-5 \u00a0 IEEE 754 \u6a19\u6e96\u4e0b\u7684 float \u7684\u8a08\u7b97\u793a\u4f8b

\u89c0\u5bdf\u5716 3-5 \uff0c\u7d66\u5b9a\u4e00\u500b\u793a\u4f8b\u8cc7\u6599 \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5247\u6709\uff1a

\\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

\u73fe\u5728\u6211\u5011\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u554f\u984c\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6578\u4f4d\uff0c\u5c0e\u81f4\u5176\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \u3002\u6839\u64da\u4ee5\u4e0a\u8a08\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6578\u70ba \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u63db\u7b26\u865f\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8ca0\u6578\u3002

\u5118\u7ba1\u6d6e\u9ede\u6578 float \u64f4\u5c55\u4e86\u53d6\u503c\u7bc4\u570d\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6578\u578b\u5225 int \u5c07\u5168\u90e8 32 \u4f4d\u5143\u7528\u65bc\u8868\u793a\u6578\u5b57\uff0c\u6578\u5b57\u662f\u5747\u52fb\u5206\u4f48\u7684\uff1b\u800c\u7531\u65bc\u6307\u6578\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u9ede\u6578 float \u7684\u6578\u503c\u8d8a\u5927\uff0c\u76f8\u9130\u5169\u500b\u6578\u5b57\u4e4b\u9593\u7684\u5dee\u503c\u5c31\u6703\u8da8\u5411\u8d8a\u5927\u3002

\u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6578\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u7fa9\uff0c\u7528\u65bc\u8868\u793a\u96f6\u3001\u7121\u7aae\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

\u8868 3-2 \u00a0 \u6307\u6578\u4f4d\u542b\u7fa9

\u6307\u6578\u4f4d E \u5206\u6578\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6578\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8a08\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u898f\u6578 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u898f\u6578 \u6b63\u898f\u6578 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6b21\u6b63\u898f\u6578\u986f\u8457\u63d0\u5347\u4e86\u6d6e\u9ede\u6578\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u898f\u6578\u70ba \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u898f\u6578\u70ba \\(2^{-126} \\times 2^{-23}\\) \u3002

\u96d9\u7cbe\u5ea6 double \u4e5f\u63a1\u7528\u985e\u4f3c\u65bc float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d05\u8ff0\u3002

"},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u5f9e\u908f\u8f2f\u7d50\u69cb\u548c\u7269\u7406\u7d50\u69cb\u5169\u500b\u89d2\u5ea6\u9032\u884c\u5206\u985e\u3002\u908f\u8f2f\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\uff0c\u800c\u7269\u7406\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\u3002
  • \u5e38\u898b\u7684\u908f\u8f2f\u7d50\u69cb\u5305\u62ec\u7dda\u6027\u3001\u6a39\u72c0\u548c\u7db2\u72c0\u7b49\u3002\u901a\u5e38\u6211\u5011\u6839\u64da\u908f\u8f2f\u7d50\u69cb\u5c07\u8cc7\u6599\u7d50\u69cb\u5206\u70ba\u7dda\u6027\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\uff09\u548c\u975e\u7dda\u6027\uff08\u6a39\u3001\u5716\u3001\u5806\u7a4d\uff09\u5169\u7a2e\u3002\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002
  • \u7576\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u88ab\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u3002\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u64c1\u6709\u5c0d\u61c9\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u7a0b\u5f0f\u900f\u904e\u9019\u4e9b\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a2a\u554f\u8cc7\u6599\u3002
  • \u7269\u7406\u7d50\u69cb\u4e3b\u8981\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u7531\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u5169\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002
  • \u8a08\u7b97\u6a5f\u4e2d\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u5305\u62ec\u6574\u6578 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u9ede\u6578 float\u3001double \uff0c\u5b57\u5143 char \u548c\u5e03\u6797 bool \u3002\u5b83\u5011\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u4f54\u7528\u7a7a\u9593\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
  • \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7de8\u78bc\u6578\u5b57\u7684\u4e09\u7a2e\u65b9\u6cd5\uff0c\u5b83\u5011\u4e4b\u9593\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\u3002\u6574\u6578\u7684\u539f\u78bc\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u865f\u4f4d\uff0c\u5176\u9918\u4f4d\u662f\u6578\u5b57\u7684\u503c\u3002
  • \u6574\u6578\u5728\u8a08\u7b97\u6a5f\u4e2d\u662f\u4ee5\u4e8c\u88dc\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\u3002\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e0b\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u5c0d\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\u4e00\u8996\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u70ba\u6e1b\u6cd5\u64cd\u4f5c\u55ae\u7368\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\uff0c\u4e26\u4e14\u4e0d\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u7684\u554f\u984c\u3002
  • \u6d6e\u9ede\u6578\u7684\u7de8\u78bc\u7531 1 \u4f4d\u7b26\u865f\u4f4d\u30018 \u4f4d\u6307\u6578\u4f4d\u548c 23 \u4f4d\u5206\u6578\u4f4d\u69cb\u6210\u3002\u7531\u65bc\u5b58\u5728\u6307\u6578\u4f4d\uff0c\u56e0\u6b64\u6d6e\u9ede\u6578\u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc\u6574\u6578\uff0c\u4ee3\u50f9\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002
  • ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5171\u6536\u9304 127 \u500b\u5b57\u5143\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u9304\u5169\u842c\u591a\u500b\u6f22\u5b57\u3002Unicode \u81f4\u529b\u65bc\u63d0\u4f9b\u4e00\u500b\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u6536\u9304\u4e16\u754c\u4e0a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u5f9e\u800c\u89e3\u6c7a\u7531\u65bc\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5c0e\u81f4\u7684\u4e82\u78bc\u554f\u984c\u3002
  • UTF-8 \u662f\u6700\u53d7\u6b61\u8fce\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u7a2e\u8b8a\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u64f4\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5132\u5b58\u7a7a\u9593\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\u3002\u5728\u7de8\u78bc\u4e2d\u6587\u6642\uff0cUTF-16 \u4f54\u7528\u7684\u7a7a\u9593\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7a0b\u5f0f\u8a9e\u8a00\u9810\u8a2d\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002
"},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1f

\u96dc\u6e4a\u8868\u5e95\u5c64\u662f\u9663\u5217\uff0c\u800c\u70ba\u4e86\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\uff0c\u6211\u5011\u53ef\u80fd\u6703\u4f7f\u7528\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\uff08\u5f8c\u7e8c\u201c\u96dc\u6e4a\u885d\u7a81\u201d\u7ae0\u7bc0\u6703\u8b1b\uff09\uff1a\u9663\u5217\u4e2d\u6bcf\u500b\u6876\u6307\u5411\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u8d85\u904e\u4e00\u5b9a\u95be\u503c\u6642\uff0c\u53c8\u53ef\u80fd\u88ab\u8f49\u5316\u70ba\u6a39\uff08\u901a\u5e38\u70ba\u7d05\u9ed1\u6a39\uff09\u3002

\u5f9e\u5132\u5b58\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u96dc\u6e4a\u8868\u7684\u5e95\u5c64\u662f\u9663\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u500b\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u6216\u4e00\u68f5\u6a39\u3002\u56e0\u6b64\uff0c\u96dc\u6e4a\u8868\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\uff09\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u6a39\uff09\u3002

Q\uff1achar \u578b\u5225\u7684\u9577\u5ea6\u662f 1 \u4f4d\u5143\u7d44\u55ce\uff1f

char \u578b\u5225\u7684\u9577\u5ea6\u7531\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u7528\u7684\u7de8\u78bc\u65b9\u6cd5\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u63a1\u7528 UTF-16 \u7de8\u78bc\uff08\u5132\u5b58 Unicode \u78bc\u9ede\uff09\uff0c\u56e0\u6b64 char \u578b\u5225\u7684\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u3002

Q\uff1a\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d \u662f\u5426\u6709\u6b67\u7fa9\uff1f\u5806\u758a\u4e5f\u53ef\u4ee5\u9032\u884c\u51fa\u5806\u758a\u548c\u5165\u5806\u758a\u7b49\u64cd\u4f5c\uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52d5\u614b\u201d\u7684\u3002

\u5806\u758a\u78ba\u5be6\u53ef\u4ee5\u5be6\u73fe\u52d5\u614b\u7684\u8cc7\u6599\u64cd\u4f5c\uff0c\u4f46\u8cc7\u6599\u7d50\u69cb\u4ecd\u7136\u662f\u201c\u975c\u614b\u201d\uff08\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff09\u7684\u3002\u5118\u7ba1\u57fa\u65bc\u9663\u5217\u7684\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u52d5\u614b\u5730\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u5011\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u8cc7\u6599\u91cf\u8d85\u51fa\u4e86\u9810\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u66f4\u5927\u7684\u9663\u5217\uff0c\u4e26\u5c07\u820a\u9663\u5217\u7684\u5167\u5bb9\u8907\u88fd\u5230\u65b0\u9663\u5217\u4e2d\u3002

Q\uff1a\u5728\u69cb\u5efa\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u6642\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u70ba\u4ec0\u9ebc\u5b83\u5011\u662f\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u5462\uff1f

\u5728\u9ad8\u968e\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u7121\u9808\u4eba\u5de5\u6307\u5b9a\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u9019\u500b\u5de5\u4f5c\u7531\u985e\u5225\u5167\u90e8\u81ea\u52d5\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u70ba 10\u3002\u53e6\u5916\uff0c\u64f4\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52d5\u5be6\u73fe\u7684\u3002\u8a73\u898b\u5f8c\u7e8c\u7684\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u3002

Q\uff1a\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\uff0c\u90a3\u9ebc\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u61c9\u8a72\u662f\u9006\u904b\u7b97\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff0c\u800c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u4e5f\u4e00\u6a23\u53ef\u4ee5\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff0c\u9019\u662f\u70ba\u4ec0\u9ebc\u5462\uff1f

A\uff1a\u9019\u662f\u56e0\u70ba\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u76f8\u4e92\u8f49\u63db\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u201c\u88dc\u6578\u201d\u7684\u904e\u7a0b\u3002\u6211\u5011\u5148\u7d66\u51fa\u88dc\u6578\u7684\u5b9a\u7fa9\uff1a\u5047\u8a2d \\(a + b = c\\) \uff0c\u90a3\u9ebc\u6211\u5011\u7a31 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u88dc\u6578\uff0c\u53cd\u4e4b\u4e5f\u7a31 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u88dc\u6578\u3002

\u7d66\u5b9a\u4e00\u500b \\(n = 4\\) \u4f4d\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578 \\(0010\\) \uff0c\u5982\u679c\u5c07\u9019\u500b\u6578\u5b57\u770b\u4f5c\u539f\u78bc\uff08\u4e0d\u8003\u616e\u7b26\u865f\u4f4d\uff09\uff0c\u90a3\u9ebc\u5b83\u7684\u4e8c\u88dc\u6578\u9700\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff1a

\\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

\u6211\u5011\u6703\u767c\u73fe\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8aaa\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u662f\u539f\u78bc \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u3002\u9019\u610f\u5473\u8457\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\u7684\u904e\u7a0b\u3002

\u90a3\u9ebc\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u5011\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

\\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

\u63db\u53e5\u8a71\u8aaa\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e92\u70ba\u5c0d\u65b9\u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\uff0c\u56e0\u6b64\u201c\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u201d\u548c\u201c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u5f8c\u52a0 1 \uff09\u5be6\u73fe\u3002

\u7576\u7136\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u7528\u9006\u904b\u7b97\u4f86\u6c42\u4e8c\u88dc\u6578 \\(1110\\) \u7684\u539f\u78bc\uff0c\u5373\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff1a

\\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

\u7e3d\u7d50\u4f86\u770b\uff0c\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u548c\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\u9019\u5169\u7a2e\u904b\u7b97\u90fd\u662f\u5728\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\uff0c\u5b83\u5011\u662f\u7b49\u50f9\u7684\u3002

\u672c\u8cea\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u88dc\u6578\uff08\u56e0\u70ba\u6046\u6709 \u539f\u78bc + \u4e00\u88dc\u6578 = 1111\uff09\uff1b\u800c\u5728\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u4e8c\u88dc\u6578\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u88dc\u6578\u3002

\u4e0a\u8ff0 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u63a8\u5ee3\u81f3\u4efb\u610f\u4f4d\u6578\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u3002

"},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

Abstract

\u96e3\u984c\u88ab\u9010\u5c64\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u8b8a\u5f97\u66f4\u70ba\u7c21\u55ae\u3002

\u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u500b\u91cd\u8981\u7684\u4e8b\u5be6\uff1a\u5f9e\u7c21\u55ae\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u8907\u96dc\u3002

"},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5
  • 12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565
  • 12.3 \u00a0 \u69cb\u5efa\u6a39\u554f\u984c
  • 12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c
  • 12.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565","text":"

\u6211\u5011\u5df2\u7d93\u5b78\u904e\uff0c\u641c\u5c0b\u6f14\u7b97\u6cd5\u5206\u70ba\u5169\u5927\u985e\u3002

  • \u66b4\u529b\u641c\u5c0b\uff1a\u5b83\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
  • \u81ea\u9069\u61c9\u641c\u5c0b\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u8cc7\u6599\u7d44\u7e54\u5f62\u5f0f\u6216\u5148\u9a57\u8cc7\u8a0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u548c\u6a39\u3002

  • \u4e8c\u5206\u641c\u5c0b\u7684\u6bcf\u4e00\u6b65\u90fd\u5c07\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\u5206\u89e3\u70ba\u4e00\u500b\u5c0f\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\uff0c\u9019\u500b\u904e\u7a0b\u4e00\u76f4\u6301\u7e8c\u5230\u9663\u5217\u70ba\u7a7a\u6216\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
  • \u6a39\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u5806\u7a4d\u7b49\u8cc7\u6599\u7d50\u69cb\u4e2d\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7686\u70ba \\(O(\\log n)\\) \u3002

\u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

  • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u641c\u5c0b\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u9032\u884c\u67e5\u8a62\uff09\u5206\u89e3\u70ba\u5b50\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u9032\u884c\u67e5\u8a62\uff09\uff0c\u9019\u662f\u900f\u904e\u6bd4\u8f03\u4e2d\u9593\u5143\u7d20\u548c\u76ee\u6a19\u5143\u7d20\u4f86\u5be6\u73fe\u7684\u3002
  • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u8655\u7406\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u554f\u984c\u7684\u5f71\u97ff\u3002
  • \u5b50\u554f\u984c\u7684\u89e3\u7121\u9808\u5408\u4f75\uff1a\u4e8c\u5206\u641c\u5c0b\u65e8\u5728\u67e5\u8a62\u4e00\u500b\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u3002\u7576\u5b50\u554f\u984c\u5f97\u5230\u89e3\u6c7a\u6642\uff0c\u539f\u554f\u984c\u4e5f\u6703\u540c\u6642\u5f97\u5230\u89e3\u6c7a\u3002

\u5206\u6cbb\u80fd\u5920\u63d0\u5347\u641c\u5c0b\u6548\u7387\uff0c\u672c\u8cea\u4e0a\u662f\u56e0\u70ba\u66b4\u529b\u641c\u5c0b\u6bcf\u8f2a\u53ea\u80fd\u6392\u9664\u4e00\u500b\u9078\u9805\uff0c\u800c\u5206\u6cbb\u641c\u5c0b\u6bcf\u8f2a\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9078\u9805\u3002

"},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u65bc\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b","text":"

\u5728\u4e4b\u524d\u7684\u7ae0\u7bc0\u4e2d\uff0c\u4e8c\u5206\u641c\u5c0b\u662f\u57fa\u65bc\u905e\u63a8\uff08\u8fed\u4ee3\uff09\u5be6\u73fe\u7684\u3002\u73fe\u5728\u6211\u5011\u57fa\u65bc\u5206\u6cbb\uff08\u905e\u8ff4\uff09\u4f86\u5be6\u73fe\u5b83\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8acb\u67e5\u8a62\u5143\u7d20 target \u3002

\u5f9e\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u5011\u5c07\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u8a18\u70ba \\(f(i, j)\\) \u3002

\u4ee5\u539f\u554f\u984c \\(f(0, n-1)\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u900f\u904e\u4ee5\u4e0b\u6b65\u9a5f\u9032\u884c\u4e8c\u5206\u641c\u5c0b\u3002

  1. \u8a08\u7b97\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u7684\u4e2d\u9ede \\(m\\) \uff0c\u6839\u64da\u5b83\u6392\u9664\u4e00\u534a\u641c\u5c0b\u5340\u9593\u3002
  2. \u905e\u8ff4\u6c42\u89e3\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\u7684\u5b50\u554f\u984c\uff0c\u53ef\u80fd\u70ba \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
  3. \u8ff4\u5708\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u5340\u9593\u70ba\u7a7a\u6642\u8fd4\u56de\u3002

\u5716 12-4 \u5c55\u793a\u4e86\u5728\u9663\u5217\u4e2d\u4e8c\u5206\u641c\u5c0b\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u904e\u7a0b\u3002

\u5716 12-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u904e\u7a0b

\u5728\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \u4f86\u6c42\u89e3\u554f\u984c \\(f(i, j)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j)\"\"\"\n    # \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
binary_search_recur.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.java
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.cs
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
binary_search_recur.go
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u6c92\u6709\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8a08\u7b97\u7d22\u5f15\u4e2d\u9ede\n    m := i + ((j - i) >> 1)\n    //\u5224\u65b7\u4e2d\u9ede\u8207\u76ee\u6a19\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u53f3\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u5de6\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
binary_search_recur.swift
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
binary_search_recur.js
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.ts
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.dart
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u554f\u984c f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.rs
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.c
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
binary_search_recur.kt
/* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
binary_search_recur.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
binary_search_recur.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \uff0c\u8acb\u5f9e\u4e2d\u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u8fd4\u56de\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5047\u8a2d\u4e8c\u5143\u6a39\u4e2d\u6c92\u6709\u503c\u91cd\u8907\u7684\u7bc0\u9ede\uff08\u5982\u5716 12-5 \u6240\u793a\uff09\u3002

\u5716 12-5 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65b7\u662f\u5426\u70ba\u5206\u6cbb\u554f\u984c","text":"

\u539f\u554f\u984c\u5b9a\u7fa9\u70ba\u5f9e preorder \u548c inorder \u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u662f\u4e00\u500b\u5178\u578b\u7684\u5206\u6cbb\u554f\u984c\u3002

  • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u5f9e\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\u3001\u69cb\u5efa\u53f3\u5b50\u6a39\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u7bc0\u9ede\u3002\u800c\u5c0d\u65bc\u6bcf\u68f5\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u8907\u7528\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u5c07\u5176\u5283\u5206\u70ba\u66f4\u5c0f\u7684\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c\uff08\u7a7a\u5b50\u6a39\uff09\u6642\u7d42\u6b62\u3002
  • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u4ea4\u96c6\u3002\u5728\u69cb\u5efa\u5de6\u5b50\u6a39\u6642\uff0c\u6211\u5011\u53ea\u9700\u95dc\u6ce8\u4e2d\u5e8f\u8d70\u8a2a\u548c\u524d\u5e8f\u8d70\u8a2a\u4e2d\u8207\u5de6\u5b50\u6a39\u5c0d\u61c9\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6a39\u540c\u7406\u3002
  • \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5b83\u5011\u9023\u7d50\u5230\u6839\u7bc0\u9ede\u4e0a\uff0c\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5283\u5206\u5b50\u6a39","text":"

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u9019\u9053\u984c\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u4f86\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u900f\u904e\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u4f86\u5283\u5206\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u5462\uff1f

\u6839\u64da\u5b9a\u7fa9\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

  • \u524d\u5e8f\u8d70\u8a2a\uff1a[ \u6839\u7bc0\u9ede | \u5de6\u5b50\u6a39 | \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 3 | 9 | 2 1 7 ] \u3002
  • \u4e2d\u5e8f\u8d70\u8a2a\uff1a[ \u5de6\u5b50\u6a39 | \u6839\u7bc0\u9ede \uff5c \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 9 | 3 | 1 2 7 ] \u3002

\u4ee5\u4e0a\u5716\u8cc7\u6599\u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5716 12-6 \u6240\u793a\u7684\u6b65\u9a5f\u5f97\u5230\u5283\u5206\u7d50\u679c\u3002

  1. \u524d\u5e8f\u8d70\u8a2a\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u7bc0\u9ede\u7684\u503c\u3002
  2. \u67e5\u8a62\u6839\u7bc0\u9ede 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8a72\u7d22\u5f15\u53ef\u5c07 inorder \u5283\u5206\u70ba [ 9 | 3 \uff5c 1 2 7 ] \u3002
  3. \u6839\u64da inorder \u7684\u5283\u5206\u7d50\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u5206\u5225\u70ba 1 \u548c 3 \uff0c\u5f9e\u800c\u53ef\u5c07 preorder \u5283\u5206\u70ba [ 3 | 9 | 2 1 7 ] \u3002

\u5716 12-6 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5283\u5206\u5b50\u6a39

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u65bc\u8b8a\u6578\u63cf\u8ff0\u5b50\u6a39\u5340\u9593","text":"

\u6839\u64da\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u6211\u5011\u5df2\u7d93\u5f97\u5230\u6839\u7bc0\u9ede\u3001\u5de6\u5b50\u6a39\u3001\u53f3\u5b50\u6a39\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002\u800c\u70ba\u4e86\u63cf\u8ff0\u9019\u4e9b\u7d22\u5f15\u5340\u9593\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u3002

  • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(i\\) \u3002
  • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(m\\) \u3002
  • \u5c07\u7576\u524d\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u8a18\u70ba \\([l, r]\\) \u3002

\u5982\u8868 12-1 \u6240\u793a\uff0c\u900f\u904e\u4ee5\u4e0a\u8b8a\u6578\u5373\u53ef\u8868\u793a\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002

\u8868 12-1 \u00a0 \u6839\u7bc0\u9ede\u548c\u5b50\u6a39\u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u7684\u7d22\u5f15

\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593 \u7576\u524d\u6a39 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6a39 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6a39 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

\u8acb\u6ce8\u610f\uff0c\u53f3\u5b50\u6a39\u6839\u7bc0\u9ede\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u7fa9\u662f\u201c\u5de6\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u201d\uff0c\u5efa\u8b70\u7d50\u5408\u5716 12-7 \u7406\u89e3\u3002

\u5716 12-7 \u00a0 \u6839\u7bc0\u9ede\u548c\u5de6\u53f3\u5b50\u6a39\u7684\u7d22\u5f15\u5340\u9593\u8868\u793a

"},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u70ba\u4e86\u63d0\u5347\u67e5\u8a62 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u5011\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 hmap \u4f86\u5132\u5b58\u9663\u5217 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root = TreeNode(preorder[i])\n    # \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m = inorder_map[preorder[i]]\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\"\"\"\n    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
build_tree.cpp
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
build_tree.java
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.cs
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
build_tree.go
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m := inorderMap[preorder[i]]\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
build_tree.swift
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
build_tree.js
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.ts
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
build_tree.dart
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u7bc0\u9ede\n  return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
build_tree.rs
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    Some(root)\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
build_tree.c
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
build_tree.kt
/* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
build_tree.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
build_tree.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 12-8 \u5c55\u793a\u4e86\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5404\u500b\u7bc0\u9ede\u662f\u5728\u5411\u4e0b\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u689d\u908a\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

<1><2><3><4><5><6><7><8><9>

\u5716 12-8 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b

\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u5167\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u7684\u5283\u5206\u7d50\u679c\u5982\u5716 12-9 \u6240\u793a\u3002

\u5716 12-9 \u00a0 \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u7684\u5283\u5206\u7d50\u679c

\u8a2d\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u500b\u7bc0\u9ede\uff08\u57f7\u884c\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u96dc\u6e4a\u8868\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5","text":"

\u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u7a31\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u7a2e\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u5169\u500b\u6b65\u9a5f\u3002

  1. \u5206\uff08\u5283\u5206\u968e\u6bb5\uff09\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u6216\u591a\u500b\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c\u6642\u7d42\u6b62\u3002
  2. \u6cbb\uff08\u5408\u4f75\u968e\u6bb5\uff09\uff1a\u5f9e\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u554f\u984c\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

\u5982\u5716 12-1 \u6240\u793a\uff0c\u201c\u5408\u4f75\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\u4e4b\u4e00\u3002

  1. \u5206\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u5230\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u554f\u984c\uff09\u3002
  2. \u6cbb\uff1a\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u6709\u5e8f\u7684\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002

\u5716 12-1 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65b7\u5206\u6cbb\u554f\u984c","text":"

\u4e00\u500b\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u6c7a\uff0c\u901a\u5e38\u53ef\u4ee5\u53c3\u8003\u4ee5\u4e0b\u5e7e\u500b\u5224\u65b7\u4f9d\u64da\u3002

  1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u554f\u984c\u53ef\u4ee5\u5206\u89e3\u6210\u898f\u6a21\u66f4\u5c0f\u3001\u985e\u4f3c\u7684\u5b50\u554f\u984c\uff0c\u4ee5\u53ca\u80fd\u5920\u4ee5\u76f8\u540c\u65b9\u5f0f\u905e\u8ff4\u5730\u9032\u884c\u5283\u5206\u3002
  2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5b50\u554f\u984c\u4e4b\u9593\u6c92\u6709\u91cd\u758a\uff0c\u4e92\u4e0d\u4f9d\u8cf4\uff0c\u53ef\u4ee5\u7368\u7acb\u89e3\u6c7a\u3002
  3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u539f\u554f\u984c\u7684\u89e3\u900f\u904e\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\u5f97\u4f86\u3002

\u986f\u7136\uff0c\u5408\u4f75\u6392\u5e8f\u6eff\u8db3\u4ee5\u4e0a\u4e09\u500b\u5224\u65b7\u4f9d\u64da\u3002

  1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u905e\u8ff4\u5730\u5c07\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\u3002
  2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u53ef\u4ee5\u7368\u7acb\u5730\u9032\u884c\u6392\u5e8f\uff08\u5b50\u554f\u984c\u53ef\u4ee5\u7368\u7acb\u9032\u884c\u6c42\u89e3\uff09\u3002
  3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u5169\u500b\u6709\u5e8f\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002
"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u900f\u904e\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u5f80\u5f80\u9084\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u76f8\u8f03\u65bc\u9078\u64c7\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u70ba\u5b83\u5011\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

\u90a3\u9ebc\uff0c\u6211\u5011\u4e0d\u7981\u767c\u554f\uff1a\u70ba\u4ec0\u9ebc\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c64\u908f\u8f2f\u662f\u4ec0\u9ebc\uff1f\u63db\u53e5\u8a71\u8aaa\uff0c\u5c07\u5927\u554f\u984c\u5206\u89e3\u70ba\u591a\u500b\u5b50\u554f\u984c\u3001\u89e3\u6c7a\u5b50\u554f\u984c\u3001\u5c07\u5b50\u554f\u984c\u7684\u89e3\u5408\u4f75\u70ba\u539f\u554f\u984c\u7684\u89e3\uff0c\u9019\u5e7e\u6b65\u7684\u6548\u7387\u70ba\u4ec0\u9ebc\u6bd4\u76f4\u63a5\u89e3\u6c7a\u539f\u554f\u984c\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u9019\u500b\u554f\u984c\u53ef\u4ee5\u5f9e\u64cd\u4f5c\u6578\u91cf\u548c\u5e73\u884c\u8a08\u7b97\u5169\u65b9\u9762\u4f86\u8a0e\u8ad6\u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6578\u91cf\u6700\u4f73\u5316","text":"

\u4ee5\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u70ba\u4f8b\uff0c\u5176\u8655\u7406\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u9700\u8981 \\(O(n^2)\\) \u6642\u9593\u3002\u5047\u8a2d\u6211\u5011\u6309\u7167\u5716 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u5247\u5283\u5206\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6bcf\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O((n / 2)^2)\\) \u6642\u9593\uff0c\u5408\u4f75\u5169\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

\\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

\u5716 12-2 \u00a0 \u5283\u5206\u9663\u5217\u524d\u5f8c\u7684\u6ce1\u6cab\u6392\u5e8f

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8a08\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u908a\u548c\u53f3\u908a\u5206\u5225\u70ba\u5283\u5206\u524d\u548c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u7e3d\u6578\uff1a

\\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

\u9019\u610f\u5473\u8457\u7576 \\(n > 4\\) \u6642\uff0c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u6578\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u61c9\u8a72\u66f4\u9ad8\u3002\u8acb\u6ce8\u610f\uff0c\u5283\u5206\u5f8c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u968e \\(O(n^2)\\) \uff0c\u53ea\u662f\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\u4e86\u3002

\u9032\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u5011\u628a\u5b50\u9663\u5217\u4e0d\u65b7\u5730\u518d\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u505c\u6b62\u5283\u5206\u5462\uff1f\u9019\u7a2e\u601d\u8def\u5be6\u969b\u4e0a\u5c31\u662f\u201c\u5408\u4f75\u6392\u5e8f\u201d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u5011\u591a\u8a2d\u5b9a\u5e7e\u500b\u5283\u5206\u9ede\uff0c\u5c07\u539f\u9663\u5217\u5e73\u5747\u5283\u5206\u70ba \\(k\\) \u500b\u5b50\u9663\u5217\u5462\uff1f\u9019\u7a2e\u60c5\u6cc1\u8207\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u985e\u4f3c\uff0c\u5b83\u975e\u5e38\u9069\u5408\u6392\u5e8f\u6d77\u91cf\u8cc7\u6599\uff0c\u7406\u8ad6\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230 \\(O(n + k)\\) \u3002

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e73\u884c\u8a08\u7b97\u6700\u4f73\u5316","text":"

\u6211\u5011\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u4e26\u884c\u89e3\u6c7a\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u9084\u6709\u5229\u65bc\u4f5c\u696d\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002

\u4e26\u884c\u6700\u4f73\u5316\u5728\u591a\u6838\u6216\u591a\u8655\u7406\u5668\u7684\u74b0\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u70ba\u7cfb\u7d71\u53ef\u4ee5\u540c\u6642\u8655\u7406\u591a\u500b\u5b50\u554f\u984c\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8a08\u7b97\u8cc7\u6e90\uff0c\u5f9e\u800c\u986f\u8457\u6e1b\u5c11\u7e3d\u9ad4\u7684\u57f7\u884c\u6642\u9593\u3002

\u6bd4\u5982\u5728\u5716 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u5011\u5c07\u6d77\u91cf\u7684\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u5247\u53ef\u5c07\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52d9\u5206\u6563\u5230\u5404\u500b\u8a08\u7b97\u55ae\u5143\uff0c\u5b8c\u6210\u5f8c\u518d\u5408\u4f75\u7d50\u679c\u3002

\u5716 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e73\u884c\u8a08\u7b97

"},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u898b\u61c9\u7528","text":"

\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u4f86\u89e3\u6c7a\u8a31\u591a\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\u3002

  • \u5c0b\u627e\u6700\u8fd1\u9ede\u5c0d\uff1a\u8a72\u6f14\u7b97\u6cd5\u9996\u5148\u5c07\u9ede\u96c6\u5206\u6210\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u5206\u5225\u627e\u51fa\u5169\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u9ede\u5c0d\uff0c\u6700\u5f8c\u627e\u51fa\u8de8\u8d8a\u5169\u90e8\u5206\u7684\u6700\u8fd1\u9ede\u5c0d\u3002
  • \u5927\u6574\u6578\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u6574\u6578\u4e58\u6cd5\u5206\u89e3\u70ba\u5e7e\u500b\u8f03\u5c0f\u7684\u6574\u6578\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u77e9\u9663\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u77e9\u9663\u4e58\u6cd5\u5206\u89e3\u70ba\u591a\u500b\u5c0f\u77e9\u9663\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
  • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u6cb3\u5167\u5854\u554f\u984c\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u89e3\u6c7a\uff0c\u9019\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u61c9\u7528\u3002
  • \u6c42\u89e3\u9006\u5e8f\u5c0d\uff1a\u5728\u4e00\u500b\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6578\u5b57\u5927\u65bc\u5f8c\u9762\u7684\u6578\u5b57\uff0c\u90a3\u9ebc\u9019\u5169\u500b\u6578\u5b57\u69cb\u6210\u4e00\u500b\u9006\u5e8f\u5c0d\u3002\u6c42\u89e3\u9006\u5e8f\u5c0d\u554f\u984c\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u85c9\u52a9\u5408\u4f75\u6392\u5e8f\u9032\u884c\u6c42\u89e3\u3002

\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u8a2d\u8a08\u4e2d\u61c9\u7528\u5f97\u975e\u5e38\u5ee3\u6cdb\u3002

  • \u4e8c\u5206\u641c\u5c0b\uff1a\u4e8c\u5206\u641c\u5c0b\u662f\u5c07\u6709\u5e8f\u9663\u5217\u5f9e\u4e2d\u9ede\u7d22\u5f15\u8655\u5206\u70ba\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u6839\u64da\u76ee\u6a19\u503c\u8207\u4e2d\u9593\u5143\u7d20\u503c\u6bd4\u8f03\u7d50\u679c\uff0c\u6c7a\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u5340\u9593\uff0c\u4e26\u5728\u5269\u9918\u5340\u9593\u57f7\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
  • \u5408\u4f75\u6392\u5e8f\uff1a\u672c\u7bc0\u958b\u982d\u5df2\u4ecb\u7d39\uff0c\u4e0d\u518d\u8d05\u8ff0\u3002
  • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9078\u53d6\u4e00\u500b\u57fa\u6e96\u503c\uff0c\u7136\u5f8c\u628a\u9663\u5217\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u4e00\u500b\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5927\uff0c\u518d\u5c0d\u9019\u5169\u90e8\u5206\u9032\u884c\u76f8\u540c\u7684\u5283\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e0b\u4e00\u500b\u5143\u7d20\u3002
  • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c07\u8cc7\u6599\u5206\u6563\u5230\u591a\u500b\u6876\uff0c\u7136\u5f8c\u5c0d\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u5404\u500b\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u5f9e\u800c\u5f97\u5230\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002
  • \u6a39\uff1a\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u7d05\u9ed1\u6a39\u3001B \u6a39\u3001B+ \u6a39\u7b49\uff0c\u5b83\u5011\u7684\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u8996\u70ba\u5206\u6cbb\u7b56\u7565\u7684\u61c9\u7528\u3002
  • \u5806\u7a4d\uff1a\u5806\u7a4d\u662f\u4e00\u7a2e\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u5176\u5404\u7a2e\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u522a\u9664\u548c\u5806\u7a4d\u5316\uff0c\u5be6\u969b\u4e0a\u90fd\u96b1\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
  • \u96dc\u6e4a\u8868\uff1a\u96d6\u7136\u96dc\u6e4a\u8868\u4e26\u4e0d\u76f4\u63a5\u61c9\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u96dc\u6e4a\u885d\u7a81\u89e3\u6c7a\u65b9\u6848\u9593\u63a5\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u93c8\u5f0f\u4f4d\u5740\u4e2d\u7684\u9577\u93c8\u7d50\u4e32\u5217\u6703\u88ab\u8f49\u5316\u70ba\u7d05\u9ed1\u6a39\uff0c\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002

\u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u7a2e\u201c\u6f64\u7269\u7d30\u7121\u8072\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\uff0c\u96b1\u542b\u5728\u5404\u7a2e\u6f14\u7b97\u6cd5\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u4e2d\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c","text":"

\u5728\u5408\u4f75\u6392\u5e8f\u548c\u69cb\u5efa\u4e8c\u5143\u6a39\u4e2d\uff0c\u6211\u5011\u90fd\u662f\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u898f\u6a21\u70ba\u539f\u554f\u984c\u4e00\u534a\u7684\u5b50\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u6cb3\u5167\u5854\u554f\u984c\uff0c\u6211\u5011\u63a1\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

Question

\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8a18\u70ba A\u3001B \u548c C \u3002\u8d77\u59cb\u72c0\u614b\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u8457 \\(n\\) \u500b\u5713\u76e4\uff0c\u5b83\u5011\u5f9e\u4e0a\u5230\u4e0b\u6309\u7167\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u3002\u6211\u5011\u7684\u4efb\u52d9\u662f\u8981\u628a\u9019 \\(n\\) \u500b\u5713\u76e4\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u4e26\u4fdd\u6301\u5b83\u5011\u7684\u539f\u6709\u9806\u5e8f\u4e0d\u8b8a\uff08\u5982\u5716 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52d5\u5713\u76e4\u7684\u904e\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u898f\u5247\u3002

  1. \u5713\u76e4\u53ea\u80fd\u5f9e\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u62ff\u51fa\uff0c\u5f9e\u53e6\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u653e\u5165\u3002
  2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\u3002
  3. \u5c0f\u5713\u76e4\u5fc5\u9808\u6642\u523b\u4f4d\u65bc\u5927\u5713\u76e4\u4e4b\u4e0a\u3002

\u5716 12-10 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u793a\u4f8b

\u6211\u5011\u5c07\u898f\u6a21\u70ba \\(i\\) \u7684\u6cb3\u5167\u5854\u554f\u984c\u8a18\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c07 \\(3\\) \u500b\u5713\u76e4\u5f9e A \u79fb\u52d5\u81f3 C \u7684\u6cb3\u5167\u5854\u554f\u984c\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u616e\u57fa\u672c\u60c5\u6cc1","text":"

\u5982\u5716 12-11 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(1)\\) \uff0c\u5373\u7576\u53ea\u6709\u4e00\u500b\u5713\u76e4\u6642\uff0c\u6211\u5011\u5c07\u5b83\u76f4\u63a5\u5f9e A \u79fb\u52d5\u81f3 C \u5373\u53ef\u3002

<1><2>

\u5716 12-11 \u00a0 \u898f\u6a21\u70ba 1 \u7684\u554f\u984c\u7684\u89e3

\u5982\u5716 12-12 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(2)\\) \uff0c\u5373\u7576\u6709\u5169\u500b\u5713\u76e4\u6642\uff0c\u7531\u65bc\u8981\u6642\u523b\u6eff\u8db3\u5c0f\u5713\u76e4\u5728\u5927\u5713\u76e4\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u85c9\u52a9 B \u4f86\u5b8c\u6210\u79fb\u52d5\u3002

  1. \u5148\u5c07\u4e0a\u9762\u7684\u5c0f\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
  2. \u518d\u5c07\u5927\u5713\u76e4\u5f9e A \u79fb\u81f3 C \u3002
  3. \u6700\u5f8c\u5c07\u5c0f\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u5716 12-12 \u00a0 \u898f\u6a21\u70ba 2 \u7684\u554f\u984c\u7684\u89e3

\u89e3\u6c7a\u554f\u984c \\(f(2)\\) \u7684\u904e\u7a0b\u53ef\u7e3d\u7d50\u70ba\uff1a\u5c07\u5169\u500b\u5713\u76e4\u85c9\u52a9 B \u5f9e A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u7a31\u70ba\u76ee\u6a19\u67f1\u3001B \u7a31\u70ba\u7de9\u885d\u67f1\u3002

"},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u554f\u984c\u5206\u89e3","text":"

\u5c0d\u65bc\u554f\u984c \\(f(3)\\) \uff0c\u5373\u7576\u6709\u4e09\u500b\u5713\u76e4\u6642\uff0c\u60c5\u6cc1\u8b8a\u5f97\u7a0d\u5fae\u8907\u96dc\u4e86\u4e00\u4e9b\u3002

\u56e0\u70ba\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u5011\u53ef\u5f9e\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c07 A \u9802\u90e8\u7684\u5169\u500b\u5713\u76e4\u770b\u4f5c\u4e00\u500b\u6574\u9ad4\uff0c\u57f7\u884c\u5716 12-13 \u6240\u793a\u7684\u6b65\u9a5f\u3002\u9019\u6a23\u4e09\u500b\u5713\u76e4\u5c31\u88ab\u9806\u5229\u5730\u5f9e A \u79fb\u81f3 C \u4e86\u3002

  1. \u4ee4 B \u70ba\u76ee\u6a19\u67f1\u3001C \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
  2. \u5c07 A \u4e2d\u5269\u9918\u7684\u4e00\u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u52d5\u81f3 C \u3002
  3. \u4ee4 C \u70ba\u76ee\u6a19\u67f1\u3001A \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
<1><2><3><4>

\u5716 12-13 \u00a0 \u898f\u6a21\u70ba 3 \u7684\u554f\u984c\u7684\u89e3

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u5c07\u554f\u984c \\(f(3)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(2)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u4e4b\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002\u9019\u8aaa\u660e\u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u4f75\u3002

\u81f3\u6b64\uff0c\u6211\u5011\u53ef\u7e3d\u7d50\u51fa\u5716 12-14 \u6240\u793a\u7684\u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c07\u539f\u554f\u984c \\(f(n)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \uff0c\u4e26\u6309\u7167\u4ee5\u4e0b\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u3002

  1. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 C \u5f9e A \u79fb\u81f3 B \u3002
  2. \u5c07\u5269\u9918 \\(1\\) \u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u81f3 C \u3002
  3. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 A \u5f9e B \u79fb\u81f3 C \u3002

\u5c0d\u65bc\u9019\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u900f\u904e\u76f8\u540c\u7684\u65b9\u5f0f\u9032\u884c\u905e\u8ff4\u5283\u5206\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52d5\u64cd\u4f5c\u5373\u53ef\u3002

\u5716 12-14 \u00a0 \u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565

"},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c07\u67f1 src \u9802\u90e8\u7684 \\(i\\) \u500b\u5713\u76e4\u85c9\u52a9\u7de9\u885d\u67f1 buf \u79fb\u52d5\u81f3\u76ee\u6a19\u67f1 tar \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52d5\u4e00\u500b\u5713\u76e4\"\"\"\n    # \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan = src.pop()\n    # \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c\"\"\"\n    n = len(A)\n    # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
hanota.cpp
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src.back();\n    src.pop_back();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.java
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.cs
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
hanota.go
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src, tar *list.List) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan := src.Back()\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9802\u90e8\u5713\u76e4\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
hanota.swift
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.popLast()!\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u4e32\u5217\u5c3e\u90e8\u662f\u67f1\u5b50\u9802\u90e8\n    // \u5c07 src \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
hanota.js
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src, tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.ts
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src: number[], tar: number[]): void {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.dart
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<int> src, List<int> tar) {\n  // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n  int pan = src.removeLast();\n  // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
hanota.rs
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.remove(src.len() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
hanota.c
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
hanota.kt
/* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    val pan = src.removeAt(src.size - 1)\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
hanota.rb
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
hanota.zig
[class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 12-15 \u6240\u793a\uff0c\u6cb3\u5167\u5854\u554f\u984c\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5c0d\u61c9\u4e00\u500b\u958b\u555f\u7684 dfs() \u51fd\u5f0f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u5716 12-15 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u7684\u905e\u8ff4\u6a39

Quote

\u6cb3\u5167\u5854\u554f\u984c\u6e90\u81ea\u4e00\u500b\u53e4\u8001\u7684\u50b3\u8aaa\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u500b\u5bfa\u5edf\u88e1\uff0c\u50e7\u4fb6\u5011\u6709\u4e09\u6839\u9ad8\u5927\u7684\u947d\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u500b\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5713\u76e4\u3002\u50e7\u4fb6\u5011\u4e0d\u65b7\u5730\u79fb\u52d5\u5713\u76e4\uff0c\u4ed6\u5011\u76f8\u4fe1\u5728\u6700\u5f8c\u4e00\u500b\u5713\u76e4\u88ab\u6b63\u78ba\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u9019\u500b\u4e16\u754c\u5c31\u6703\u7d50\u675f\u3002

\u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fb6\u5011\u6bcf\u79d2\u9418\u79fb\u52d5\u4e00\u6b21\uff0c\u7e3d\u5171\u9700\u8981\u5927\u7d04 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7d04 \\(5850\\) \u5104\u5e74\uff0c\u9060\u9060\u8d85\u904e\u4e86\u73fe\u5728\u5c0d\u5b87\u5b99\u5e74\u9f61\u7684\u4f30\u8a08\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u9019\u500b\u50b3\u8aaa\u662f\u771f\u7684\uff0c\u6211\u5011\u61c9\u8a72\u4e0d\u9700\u8981\u64d4\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u4f86\u3002

"},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7d50","text":"
  • \u5206\u6cbb\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u8a2d\u8a08\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5283\u5206\uff09\u548c\u6cbb\uff08\u5408\u4f75\uff09\u5169\u500b\u968e\u6bb5\uff0c\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002
  • \u5224\u65b7\u662f\u5426\u662f\u5206\u6cbb\u6f14\u7b97\u6cd5\u554f\u984c\u7684\u4f9d\u64da\u5305\u62ec\uff1a\u554f\u984c\u80fd\u5426\u5206\u89e3\u3001\u5b50\u554f\u984c\u662f\u5426\u7368\u7acb\u3001\u5b50\u554f\u984c\u80fd\u5426\u5408\u4f75\u3002
  • \u5408\u4f75\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\uff0c\u5176\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5283\u5206\u70ba\u7b49\u9577\u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u958b\u59cb\u9010\u5c64\u5408\u4f75\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002
  • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u6e1b\u5c11\u4e86\u64cd\u4f5c\u6578\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5f8c\u6709\u5229\u65bc\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002
  • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u6c7a\u8a31\u591a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u4e5f\u5ee3\u6cdb\u61c9\u7528\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u8655\u8655\u53ef\u898b\u5176\u8eab\u5f71\u3002
  • \u76f8\u8f03\u65bc\u66b4\u529b\u641c\u5c0b\uff0c\u81ea\u9069\u61c9\u641c\u5c0b\u6548\u7387\u66f4\u9ad8\u3002\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\u3002
  • \u4e8c\u5206\u641c\u5c0b\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u500b\u5178\u578b\u61c9\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u7684\u6b65\u9a5f\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b\u3002
  • \u5728\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u554f\u984c\u4e2d\uff0c\u69cb\u5efa\u6a39\uff08\u539f\u554f\u984c\uff09\u53ef\u4ee5\u5283\u5206\u70ba\u69cb\u5efa\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5283\u5206\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u7684\u7d22\u5f15\u5340\u9593\u4f86\u5be6\u73fe\u3002
  • \u5728\u6cb3\u5167\u5854\u554f\u984c\u4e2d\uff0c\u4e00\u500b\u898f\u6a21\u70ba \\(n\\) \u7684\u554f\u984c\u53ef\u4ee5\u5283\u5206\u70ba\u5169\u500b\u898f\u6a21\u70ba \\(n-1\\) \u7684\u5b50\u554f\u984c\u548c\u4e00\u500b\u898f\u6a21\u70ba \\(1\\) \u7684\u5b50\u554f\u984c\u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002
"},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52d5\u614b\u898f\u5283","text":"

Abstract

\u5c0f\u6eaa\u532f\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u532f\u5165\u5927\u6d77\u3002

\u52d5\u614b\u898f\u5283\u5c07\u5c0f\u554f\u984c\u7684\u89e3\u5f59\u96c6\u6210\u5927\u554f\u984c\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9818\u6211\u5011\u8d70\u5411\u89e3\u6c7a\u554f\u984c\u7684\u5f7c\u5cb8\u3002

"},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283
  • 14.2 \u00a0 DP \u554f\u984c\u7279\u6027
  • 14.3 \u00a0 DP \u89e3\u984c\u601d\u8def
  • 14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c
  • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c
  • 14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c
  • 14.7 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52d5\u614b\u898f\u5283\u554f\u984c\u7279\u6027","text":"

\u5728\u4e0a\u4e00\u7bc0\u4e2d\uff0c\u6211\u5011\u5b78\u7fd2\u4e86\u52d5\u614b\u898f\u5283\u662f\u5982\u4f55\u900f\u904e\u5b50\u554f\u984c\u5206\u89e3\u4f86\u6c42\u89e3\u539f\u554f\u984c\u7684\u3002\u5be6\u969b\u4e0a\uff0c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u7684\u5074\u91cd\u9ede\u4e0d\u540c\u3002

  • \u5206\u6cbb\u6f14\u7b97\u6cd5\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u591a\u500b\u76f8\u4e92\u7368\u7acb\u7684\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u554f\u984c\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\uff0c\u6700\u7d42\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
  • \u52d5\u614b\u898f\u5283\u4e5f\u5c0d\u554f\u984c\u9032\u884c\u905e\u8ff4\u5206\u89e3\uff0c\u4f46\u8207\u5206\u6cbb\u6f14\u7b97\u6cd5\u7684\u4e3b\u8981\u5340\u5225\u662f\uff0c\u52d5\u614b\u898f\u5283\u4e2d\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u4f9d\u8cf4\u7684\uff0c\u5728\u5206\u89e3\u904e\u7a0b\u4e2d\u6703\u51fa\u73fe\u8a31\u591a\u91cd\u758a\u5b50\u554f\u984c\u3002
  • \u56de\u6eaf\u6f14\u7b97\u6cd5\u5728\u5617\u8a66\u548c\u56de\u9000\u4e2d\u7aae\u8209\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u4e26\u900f\u904e\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\u3002\u539f\u554f\u984c\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\u69cb\u6210\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6bcf\u500b\u6c7a\u7b56\u6b65\u9a5f\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u500b\u5b50\u554f\u984c\u3002

\u5be6\u969b\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u5e38\u7528\u4f86\u6c42\u89e3\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5b83\u5011\u4e0d\u50c5\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u9084\u5177\u6709\u53e6\u5916\u5169\u5927\u7279\u6027\uff1a\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb","text":"

\u6211\u5011\u5c0d\u722c\u6a13\u68af\u554f\u984c\u7a0d\u4f5c\u6539\u52d5\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9069\u5408\u5c55\u793a\u6700\u512a\u5b50\u7d50\u69cb\u6982\u5ff5\u3002

\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9

\u7d66\u5b9a\u4e00\u500b\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u6bcf\u4e00\u968e\u6a13\u68af\u4e0a\u90fd\u8cbc\u6709\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u4f60\u5728\u8a72\u81fa\u968e\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\u3002\u7d66\u5b9a\u4e00\u500b\u975e\u8ca0\u6574\u6578\u9663\u5217 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u500b\u81fa\u968e\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\\(cost[0]\\) \u70ba\u5730\u9762\uff08\u8d77\u59cb\u9ede\uff09\u3002\u8acb\u8a08\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u50f9\u624d\u80fd\u5230\u9054\u9802\u90e8\uff1f

\u5982\u5716 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u968e\u7684\u4ee3\u50f9\u5206\u5225\u70ba \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5247\u5f9e\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u968e\u7684\u6700\u5c0f\u4ee3\u50f9\u70ba \\(2\\) \u3002

\u5716 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u6700\u5c0f\u4ee3\u50f9

\u8a2d \\(dp[i]\\) \u70ba\u722c\u5230\u7b2c \\(i\\) \u968e\u7d2f\u8a08\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\u7531\u65bc\u7b2c \\(i\\) \u968e\u53ea\u53ef\u80fd\u5f9e \\(i - 1\\) \u968e\u6216 \\(i - 2\\) \u968e\u8d70\u4f86\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u65bc \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u70ba\u4e86\u5118\u53ef\u80fd\u6e1b\u5c11\u4ee3\u50f9\uff0c\u6211\u5011\u61c9\u8a72\u9078\u64c7\u5169\u8005\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\uff1a

\\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

\u9019\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u7684\u542b\u7fa9\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u662f\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\u7684\u3002

\u672c\u984c\u986f\u7136\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6211\u5011\u5f9e\u5169\u500b\u5b50\u554f\u984c\u6700\u512a\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9078\u51fa\u8f03\u512a\u7684\u90a3\u4e00\u500b\uff0c\u4e26\u7528\u5b83\u69cb\u5efa\u51fa\u539f\u554f\u984c \\(dp[i]\\) \u7684\u6700\u512a\u89e3\u3002

\u90a3\u9ebc\uff0c\u4e0a\u4e00\u7bc0\u7684\u722c\u6a13\u68af\u984c\u76ee\u6709\u6c92\u6709\u6700\u512a\u5b50\u7d50\u69cb\u5462\uff1f\u5b83\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u500b\u8a08\u6578\u554f\u984c\uff0c\u4f46\u5982\u679c\u63db\u4e00\u7a2e\u554f\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6578\u91cf\u201d\u3002\u6211\u5011\u610f\u5916\u5730\u767c\u73fe\uff0c\u96d6\u7136\u984c\u76ee\u4fee\u6539\u524d\u5f8c\u662f\u7b49\u50f9\u7684\uff0c\u4f46\u6700\u512a\u5b50\u7d50\u69cb\u6d6e\u73fe\u51fa\u4f86\u4e86\uff1a\u7b2c \\(n\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u7b49\u65bc\u7b2c \\(n-1\\) \u968e\u548c\u7b2c \\(n-2\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8aaa\uff0c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u89e3\u91cb\u65b9\u5f0f\u6bd4\u8f03\u9748\u6d3b\uff0c\u5728\u4e0d\u540c\u554f\u984c\u4e2d\u6703\u6709\u4e0d\u540c\u7684\u542b\u7fa9\u3002

\u6839\u64da\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72c0\u614b \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f97\u5230\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\u3002

\u5716 14-7 \u00a0 \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u672c\u984c\u4e5f\u53ef\u4ee5\u9032\u884c\u7a7a\u9593\u6700\u4f73\u5316\uff0c\u5c07\u4e00\u7dad\u58d3\u7e2e\u81f3\u96f6\u7dad\uff0c\u4f7f\u5f97\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
min_cost_climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.java
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.go
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.js
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
min_cost_climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
min_cost_climbing_stairs_dp.c
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
min_cost_climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
min_cost_climbing_stairs_dp.rb
[class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
min_cost_climbing_stairs_dp.zig
// \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u7121\u5f8c\u6548\u6027","text":"

\u7121\u5f8c\u6548\u6027\u662f\u52d5\u614b\u898f\u5283\u80fd\u5920\u6709\u6548\u89e3\u6c7a\u554f\u984c\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u7fa9\u70ba\uff1a\u7d66\u5b9a\u4e00\u500b\u78ba\u5b9a\u7684\u72c0\u614b\uff0c\u5b83\u7684\u672a\u4f86\u767c\u5c55\u53ea\u8207\u7576\u524d\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002

\u4ee5\u722c\u6a13\u68af\u554f\u984c\u70ba\u4f8b\uff0c\u7d66\u5b9a\u72c0\u614b \\(i\\) \uff0c\u5b83\u6703\u767c\u5c55\u51fa\u72c0\u614b \\(i+1\\) \u548c\u72c0\u614b \\(i+2\\) \uff0c\u5206\u5225\u5c0d\u61c9\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u9019\u5169\u7a2e\u9078\u64c7\u6642\uff0c\u6211\u5011\u7121\u9808\u8003\u616e\u72c0\u614b \\(i\\) \u4e4b\u524d\u7684\u72c0\u614b\uff0c\u5b83\u5011\u5c0d\u72c0\u614b \\(i\\) \u7684\u672a\u4f86\u6c92\u6709\u5f71\u97ff\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u7d66\u722c\u6a13\u68af\u554f\u984c\u65b0\u589e\u4e00\u500b\u7d04\u675f\uff0c\u60c5\u6cc1\u5c31\u4e0d\u4e00\u6a23\u4e86\u3002

\u5e36\u7d04\u675f\u722c\u6a13\u68af

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u4f46\u4e0d\u80fd\u9023\u7e8c\u5169\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5982\u5716 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u968e\u50c5\u5269 \\(2\\) \u7a2e\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u9023\u7e8c\u4e09\u6b21\u8df3 \\(1\\) \u968e\u7684\u65b9\u6848\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\uff0c\u56e0\u6b64\u88ab\u6368\u68c4\u3002

\u5716 14-8 \u00a0 \u5e36\u7d04\u675f\u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

\u5728\u8a72\u554f\u984c\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\uff0c\u90a3\u9ebc\u4e0b\u4e00\u8f2a\u5c31\u5fc5\u9808\u8df3 \\(2\\) \u968e\u3002\u9019\u610f\u5473\u8457\uff0c\u4e0b\u4e00\u6b65\u9078\u64c7\u4e0d\u80fd\u7531\u7576\u524d\u72c0\u614b\uff08\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u7368\u7acb\u6c7a\u5b9a\uff0c\u9084\u548c\u524d\u4e00\u500b\u72c0\u614b\uff08\u4e0a\u4e00\u8f2a\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u6709\u95dc\u3002

\u4e0d\u96e3\u767c\u73fe\uff0c\u6b64\u554f\u984c\u5df2\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u70ba \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8a31\u591a\u201c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\u201d\u65b9\u6848\uff0c\u800c\u70ba\u4e86\u6eff\u8db3\u7d04\u675f\uff0c\u6211\u5011\u5c31\u4e0d\u80fd\u5c07 \\(dp[i-1]\\) \u76f4\u63a5\u8a08\u5165 \\(dp[i]\\) \u4e2d\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u9700\u8981\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff1a\u72c0\u614b \\([i, j]\\) \u8868\u793a\u8655\u5728\u7b2c \\(i\\) \u968e\u4e26\u4e14\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(j\\) \u968e\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72c0\u614b\u5b9a\u7fa9\u6709\u6548\u5730\u5340\u5206\u4e86\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u9084\u662f \\(2\\) \u968e\uff0c\u6211\u5011\u53ef\u4ee5\u64da\u6b64\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5f9e\u4f55\u800c\u4f86\u7684\u3002

  • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ea\u80fd\u9078\u64c7\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u5f9e \\(dp[i-1, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002
  • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(2\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ef\u9078\u64c7\u8df3 \\(1\\) \u968e\u6216\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u5f9e \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002

\u5982\u5716 14-9 \u6240\u793a\uff0c\u5728\u8a72\u5b9a\u7fa9\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u65b9\u6848\u6578\u3002\u6b64\u6642\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

\u5716 14-9 \u00a0 \u8003\u616e\u7d04\u675f\u4e0b\u7684\u905e\u63a8\u95dc\u4fc2

\u6700\u7d42\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u5169\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
climbing_stairs_constraint_dp.cpp
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.java
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.cs
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
climbing_stairs_constraint_dp.go
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.swift
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.js
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.ts
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.dart
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
climbing_stairs_constraint_dp.rs
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.c
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
climbing_stairs_constraint_dp.kt
/* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
climbing_stairs_constraint_dp.rb
[class]{}-[func]{climbing_stairs_constraint_dp}\n
climbing_stairs_constraint_dp.zig
// \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u65bc\u50c5\u9700\u591a\u8003\u616e\u524d\u9762\u4e00\u500b\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u900f\u904e\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff0c\u4f7f\u5f97\u554f\u984c\u91cd\u65b0\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u554f\u984c\u5177\u6709\u975e\u5e38\u56b4\u91cd\u7684\u201c\u6709\u5f8c\u6548\u6027\u201d\u3002

\u722c\u6a13\u68af\u8207\u969c\u7919\u751f\u6210

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\u3002\u898f\u5b9a\u7576\u722c\u5230\u7b2c \\(i\\) \u968e\u6642\uff0c\u7cfb\u7d71\u81ea\u52d5\u6703\u5728\u7b2c \\(2i\\) \u968e\u4e0a\u653e\u4e0a\u969c\u7919\u7269\uff0c\u4e4b\u5f8c\u6240\u6709\u8f2a\u90fd\u4e0d\u5141\u8a31\u8df3\u5230\u7b2c \\(2i\\) \u968e\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u5169\u8f2a\u5206\u5225\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u968e\u4e0a\uff0c\u5247\u4e4b\u5f8c\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u968e\u4e0a\u3002\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5728\u9019\u500b\u554f\u984c\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8e8d\u4f9d\u8cf4\u904e\u53bb\u6240\u6709\u7684\u72c0\u614b\uff0c\u56e0\u70ba\u6bcf\u4e00\u6b21\u8df3\u8e8d\u90fd\u6703\u5728\u66f4\u9ad8\u7684\u968e\u68af\u4e0a\u8a2d\u5b9a\u969c\u7919\uff0c\u4e26\u5f71\u97ff\u672a\u4f86\u7684\u8df3\u8e8d\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u52d5\u614b\u898f\u5283\u5f80\u5f80\u96e3\u4ee5\u89e3\u6c7a\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u8907\u96dc\u7684\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff08\u4f8b\u5982\u65c5\u884c\u5546\u554f\u984c\uff09\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u555f\u767c\u5f0f\u641c\u5c0b\u3001\u907a\u50b3\u6f14\u7b97\u6cd5\u3001\u5f37\u5316\u5b78\u7fd2\u7b49\uff0c\u5f9e\u800c\u5728\u6709\u9650\u6642\u9593\u5167\u5f97\u5230\u53ef\u7528\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52d5\u614b\u898f\u5283\u89e3\u984c\u601d\u8def","text":"

\u4e0a\u5169\u7bc0\u4ecb\u7d39\u4e86\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4e3b\u8981\u7279\u5fb5\uff0c\u63a5\u4e0b\u4f86\u6211\u5011\u4e00\u8d77\u63a2\u7a76\u5169\u500b\u66f4\u52a0\u5be6\u7528\u7684\u554f\u984c\u3002

  1. \u5982\u4f55\u5224\u65b7\u4e00\u500b\u554f\u984c\u662f\u4e0d\u662f\u52d5\u614b\u898f\u5283\u554f\u984c\uff1f
  2. \u6c42\u89e3\u52d5\u614b\u898f\u5283\u554f\u984c\u8a72\u5f9e\u4f55\u8655\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9a5f\u662f\u4ec0\u9ebc\uff1f
"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u554f\u984c\u5224\u65b7","text":"

\u7e3d\u7684\u4f86\u8aaa\uff0c\u5982\u679c\u4e00\u500b\u554f\u984c\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u90a3\u9ebc\u5b83\u901a\u5e38\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u5011\u5f88\u96e3\u5f9e\u554f\u984c\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u9019\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u653e\u5bec\u689d\u4ef6\uff0c\u5148\u89c0\u5bdf\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7aae\u8209\uff09\u89e3\u6c7a\u3002

\u9069\u5408\u7528\u56de\u6eaf\u89e3\u6c7a\u7684\u554f\u984c\u901a\u5e38\u6eff\u8db3\u201c\u6c7a\u7b56\u6a39\u6a21\u578b\u201d\uff0c\u9019\u7a2e\u554f\u984c\u53ef\u4ee5\u4f7f\u7528\u6a39\u5f62\u7d50\u69cb\u4f86\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\uff0c\u6bcf\u4e00\u689d\u8def\u5f91\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\u3002

\u63db\u53e5\u8a71\u8aaa\uff0c\u5982\u679c\u554f\u984c\u5305\u542b\u660e\u78ba\u7684\u6c7a\u7b56\u6982\u5ff5\uff0c\u4e26\u4e14\u89e3\u662f\u900f\u904e\u4e00\u7cfb\u5217\u6c7a\u7b56\u7522\u751f\u7684\uff0c\u90a3\u9ebc\u5b83\u5c31\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u4f86\u89e3\u6c7a\u3002

\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u554f\u984c\u9084\u6709\u4e00\u4e9b\u5224\u65b7\u7684\u201c\u52a0\u5206\u9805\u201d\u3002

  • \u554f\u984c\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u6700\u4f73\u5316\u63cf\u8ff0\u3002
  • \u554f\u984c\u7684\u72c0\u614b\u80fd\u5920\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u3001\u591a\u7dad\u77e9\u9663\u6216\u6a39\u4f86\u8868\u793a\uff0c\u4e26\u4e14\u4e00\u500b\u72c0\u614b\u8207\u5176\u5468\u570d\u7684\u72c0\u614b\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\u3002

\u76f8\u61c9\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u6e1b\u5206\u9805\u201d\u3002

  • \u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u512a\u89e3\u3002
  • \u554f\u984c\u63cf\u8ff0\u4e2d\u6709\u660e\u986f\u7684\u6392\u5217\u7d44\u5408\u7684\u7279\u5fb5\uff0c\u9700\u8981\u8fd4\u56de\u5177\u9ad4\u7684\u591a\u500b\u65b9\u6848\u3002

\u5982\u679c\u4e00\u500b\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u4e26\u5177\u6709\u8f03\u70ba\u660e\u986f\u7684\u201c\u52a0\u5206\u9805\u201d\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5047\u8a2d\u5b83\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\uff0c\u4e26\u5728\u6c42\u89e3\u904e\u7a0b\u4e2d\u9a57\u8b49\u5b83\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u554f\u984c\u6c42\u89e3\u6b65\u9a5f","text":"

\u52d5\u614b\u898f\u5283\u7684\u89e3\u984c\u6d41\u7a0b\u6703\u56e0\u554f\u984c\u7684\u6027\u8cea\u548c\u96e3\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9a5f\uff1a\u63cf\u8ff0\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5c0e\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u7b49\u3002

\u70ba\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u984c\u6b65\u9a5f\uff0c\u6211\u5011\u4f7f\u7528\u4e00\u500b\u7d93\u5178\u554f\u984c\u201c\u6700\u5c0f\u8def\u5f91\u548c\u201d\u4f86\u8209\u4f8b\u3002

Question

\u7d66\u5b9a\u4e00\u500b \\(n \\times m\\) \u7684\u4e8c\u7dad\u7db2\u683c grid \uff0c\u7db2\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5305\u542b\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u8a72\u55ae\u5143\u683c\u7684\u4ee3\u50f9\u3002\u6a5f\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\u70ba\u8d77\u59cb\u9ede\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52d5\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u9054\u53f3\u4e0b\u89d2\u55ae\u5143\u683c\u3002\u8acb\u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f91\u548c\u3002

\u5716 14-10 \u5c55\u793a\u4e86\u4e00\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u7db2\u683c\u7684\u6700\u5c0f\u8def\u5f91\u548c\u70ba \\(13\\) \u3002

\u5716 14-10 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u793a\u4f8b\u8cc7\u6599

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u672c\u984c\u7684\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u5c31\u662f\u5f9e\u7576\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8a2d\u7576\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\([i, j]\\) \uff0c\u5247\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u5f8c\uff0c\u7d22\u5f15\u8b8a\u70ba \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72c0\u614b\u61c9\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u5169\u500b\u8b8a\u6578\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u5f9e\u8d77\u59cb\u9ede \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\uff0c\u89e3\u8a18\u70ba \\(dp[i, j]\\) \u3002

\u81f3\u6b64\uff0c\u6211\u5011\u5c31\u5f97\u5230\u4e86\u5716 14-11 \u6240\u793a\u7684\u4e8c\u7dad \\(dp\\) \u77e9\u9663\uff0c\u5176\u5c3a\u5bf8\u8207\u8f38\u5165\u7db2\u683c \\(grid\\) \u76f8\u540c\u3002

\u5716 14-11 \u00a0 \u72c0\u614b\u5b9a\u7fa9\u8207 dp \u8868

Note

\u52d5\u614b\u898f\u5283\u548c\u56de\u6eaf\u904e\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u70ba\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\uff0c\u800c\u72c0\u614b\u7531\u6240\u6709\u6c7a\u7b56\u8b8a\u6578\u69cb\u6210\u3002\u5b83\u61c9\u7576\u5305\u542b\u63cf\u8ff0\u89e3\u984c\u9032\u5ea6\u7684\u6240\u6709\u8b8a\u6578\uff0c\u5176\u5305\u542b\u4e86\u8db3\u5920\u7684\u8cc7\u8a0a\uff0c\u80fd\u5920\u7528\u4f86\u63a8\u5c0e\u51fa\u4e0b\u4e00\u500b\u72c0\u614b\u3002

\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\uff0c\u6211\u5011\u6703\u5b9a\u7fa9\u4e00\u500b \\(dp\\) \u8868\u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u72c0\u614b\u7684\u6bcf\u500b\u7368\u7acb\u8b8a\u6578\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\u3002\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72c0\u614b\u548c\u5b50\u554f\u984c\u7684\u89e3\u4e4b\u9593\u7684\u5c0d\u6620\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u5c0d\u65bc\u72c0\u614b \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u5f9e\u4e0a\u908a\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u908a\u683c\u5b50 \\([i, j-1]\\) \u8f49\u79fb\u800c\u4f86\u3002\u56e0\u6b64\u6700\u512a\u5b50\u7d50\u69cb\u70ba\uff1a\u5230\u9054 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u8207 \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\u6c7a\u5b9a\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u5716 14-12 \u6240\u793a\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

\u5716 14-12 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb\u8207\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

Note

\u6839\u64da\u5b9a\u7fa9\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u554f\u984c\u548c\u5b50\u554f\u984c\u7684\u95dc\u4fc2\uff0c\u627e\u51fa\u900f\u904e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u4f86\u69cb\u9020\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u512a\u5b50\u7d50\u69cb\u3002

\u4e00\u65e6\u6211\u5011\u627e\u5230\u4e86\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u5728\u672c\u984c\u4e2d\uff0c\u8655\u5728\u9996\u884c\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u5de6\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u8655\u5728\u9996\u5217\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u4e0a\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u908a\u754c\u689d\u4ef6\u3002

\u5982\u5716 14-13 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u6211\u5011\u4f7f\u7528\u8ff4\u5708\u4f86\u8d70\u8a2a\u77e9\u9663\uff0c\u5916\u8ff4\u5708\u8d70\u8a2a\u5404\u884c\uff0c\u5167\u8ff4\u5708\u8d70\u8a2a\u5404\u5217\u3002

\u5716 14-13 \u00a0 \u908a\u754c\u689d\u4ef6\u8207\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

Note

\u908a\u754c\u689d\u4ef6\u5728\u52d5\u614b\u898f\u5283\u4e2d\u7528\u65bc\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u5c0b\u4e2d\u7528\u65bc\u526a\u679d\u3002

\u72c0\u614b\u8f49\u79fb\u9806\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8b49\u5728\u8a08\u7b97\u7576\u524d\u554f\u984c\u7684\u89e3\u6642\uff0c\u6240\u6709\u5b83\u4f9d\u8cf4\u7684\u66f4\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u90fd\u5df2\u7d93\u88ab\u6b63\u78ba\u5730\u8a08\u7b97\u51fa\u4f86\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u5df2\u7d93\u53ef\u4ee5\u76f4\u63a5\u5beb\u51fa\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\u3002\u7136\u800c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u5c0b \\(\\rightarrow\\) \u8a18\u61b6\u5316\u641c\u5c0b \\(\\rightarrow\\) \u52d5\u614b\u898f\u5283\u201d\u7684\u9806\u5e8f\u5be6\u73fe\u66f4\u52a0\u7b26\u5408\u601d\u7dad\u7fd2\u6163\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u5f9e\u72c0\u614b \\([i, j]\\) \u958b\u59cb\u641c\u5c0b\uff0c\u4e0d\u65b7\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u72c0\u614b \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u905e\u8ff4\u51fd\u5f0f\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, j]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5f9e \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c \\(dp[i, j]\\) \u3002
  • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576 \\(i = 0\\) \u4e14 \\(j = 0\\) \u6642\uff0c\u8fd4\u56de\u4ee3\u50f9 \\(grid[0, 0]\\) \u3002
  • \u526a\u679d\uff1a\u7576 \\(i < 0\\) \u6642\u6216 \\(j < 0\\) \u6642\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u6642\u8fd4\u56de\u4ee3\u50f9 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.Min(left, up) + grid[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  return min(left, up) + grid[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-14 \u7d66\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u70ba\u6839\u7bc0\u9ede\u7684\u905e\u8ff4\u6a39\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5176\u6578\u91cf\u6703\u96a8\u8457\u7db2\u683c grid \u7684\u5c3a\u5bf8\u8b8a\u5927\u800c\u6025\u5287\u589e\u591a\u3002

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u758a\u5b50\u554f\u984c\u7684\u539f\u56e0\u70ba\uff1a\u5b58\u5728\u591a\u689d\u8def\u5f91\u53ef\u4ee5\u5f9e\u5de6\u4e0a\u89d2\u5230\u9054\u67d0\u4e00\u55ae\u5143\u683c\u3002

\u5716 14-14 \u00a0 \u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

\u6bcf\u500b\u72c0\u614b\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u5169\u7a2e\u9078\u64c7\uff0c\u5f9e\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u7e3d\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^{m + n})\\) \u3002\u8acb\u6ce8\u610f\uff0c\u9019\u7a2e\u8a08\u7b97\u65b9\u5f0f\u672a\u8003\u616e\u81e8\u8fd1\u7db2\u683c\u908a\u754c\u7684\u60c5\u6cc1\uff0c\u7576\u5230\u9054\u7db2\u8def\u908a\u754c\u6642\u53ea\u5269\u4e0b\u4e00\u7a2e\u9078\u64c7\uff0c\u56e0\u6b64\u5be6\u969b\u7684\u8def\u5f91\u6578\u91cf\u6703\u5c11\u4e00\u4e9b\u3002

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u6211\u5011\u5f15\u5165\u4e00\u500b\u548c\u7db2\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8a18\u61b6\u4e32\u5217 mem \uff0c\u7528\u65bc\u8a18\u9304\u5404\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5c07\u91cd\u758a\u5b50\u554f\u984c\u9032\u884c\u526a\u679d\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dfs_mem}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8a18\u61b6\u5316\u5f8c\uff0c\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u72c0\u614b\u7e3d\u6578\uff0c\u5373\u7db2\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

\u5716 14-15 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\u52d5\u614b\u898f\u5283\u89e3\u6cd5\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f91\u548c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\uff0c\u5176\u8d70\u8a2a\u4e86\u6574\u500b\u7db2\u683c\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

\u9663\u5217 dp \u5927\u5c0f\u70ba \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u5716 14-16 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u53ea\u8207\u5176\u5de6\u908a\u548c\u4e0a\u908a\u7684\u683c\u5b50\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u53ea\u7528\u4e00\u500b\u55ae\u884c\u9663\u5217\u4f86\u5be6\u73fe \\(dp\\) \u8868\u3002

\u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u9663\u5217 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72c0\u614b\uff0c\u6240\u4ee5\u6211\u5011\u7121\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72c0\u614b\uff0c\u800c\u662f\u5728\u8d70\u8a2a\u6bcf\u884c\u6642\u66f4\u65b0\u5b83\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
min_path_sum.cpp
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.java
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.cs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.go
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
min_path_sum.swift
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ..< n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.js
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.ts
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
min_path_sum.dart
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
min_path_sum.rs
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
min_path_sum.c
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
min_path_sum.kt
/* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..<n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
min_path_sum.rb
[class]{}-[func]{min_path_sum_dp_comp}\n
min_path_sum.zig
// \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c","text":"

\u7de8\u8f2f\u8ddd\u96e2\uff0c\u4e5f\u7a31 Levenshtein \u8ddd\u96e2\uff0c\u6307\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u4e92\u76f8\u8f49\u63db\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6578\uff0c\u901a\u5e38\u7528\u65bc\u5728\u8cc7\u8a0a\u6aa2\u7d22\u548c\u81ea\u7136\u8a9e\u8a00\u8655\u7406\u4e2d\u5ea6\u91cf\u5169\u500b\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

Question

\u8f38\u5165\u5169\u500b\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c07 \\(s\\) \u8f49\u63db\u70ba \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

\u4f60\u53ef\u4ee5\u5728\u4e00\u500b\u5b57\u4e32\u4e2d\u9032\u884c\u4e09\u7a2e\u7de8\u8f2f\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u500b\u5b57\u5143\u3001\u522a\u9664\u4e00\u500b\u5b57\u5143\u3001\u5c07\u5b57\u5143\u66ff\u63db\u70ba\u4efb\u610f\u4e00\u500b\u5b57\u5143\u3002

\u5982\u5716 14-27 \u6240\u793a\uff0c\u5c07 kitten \u8f49\u63db\u70ba sitting \u9700\u8981\u7de8\u8f2f 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u8207 1 \u6b21\u65b0\u589e\u64cd\u4f5c\uff1b\u5c07 hello \u8f49\u63db\u70ba algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u548c 1 \u6b21\u522a\u9664\u64cd\u4f5c\u3002

\u5716 14-27 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u793a\u4f8b\u8cc7\u6599

\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u6c7a\u7b56\u6a39\u6a21\u578b\u4f86\u89e3\u91cb\u3002\u5b57\u4e32\u5c0d\u61c9\u6a39\u7bc0\u9ede\uff0c\u4e00\u8f2a\u6c7a\u7b56\uff08\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\uff09\u5c0d\u61c9\u6a39\u7684\u4e00\u689d\u908a\u3002

\u5982\u5716 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u500b\u7bc0\u9ede\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8a31\u591a\u689d\u908a\uff0c\u6bcf\u689d\u908a\u5c0d\u61c9\u4e00\u7a2e\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u5f9e hello \u8f49\u63db\u5230 algo \u6709\u8a31\u591a\u7a2e\u53ef\u80fd\u7684\u8def\u5f91\u3002

\u5f9e\u6c7a\u7b56\u6a39\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u7bc0\u9ede hello \u548c\u7bc0\u9ede algo \u4e4b\u9593\u7684\u6700\u77ed\u8def\u5f91\u3002

\u5716 14-28 \u00a0 \u57fa\u65bc\u6c7a\u7b56\u6a39\u6a21\u578b\u8868\u793a\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u662f\u5c0d\u5b57\u4e32 \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\u3002

\u6211\u5011\u5e0c\u671b\u5728\u7de8\u8f2f\u64cd\u4f5c\u7684\u904e\u7a0b\u4e2d\uff0c\u554f\u984c\u7684\u898f\u6a21\u9010\u6f38\u7e2e\u5c0f\uff0c\u9019\u6a23\u624d\u80fd\u69cb\u5efa\u5b50\u554f\u984c\u3002\u8a2d\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \uff0c\u6211\u5011\u5148\u8003\u616e\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u5011\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u76f4\u63a5\u8003\u616e \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
  • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u5011\u9700\u8981\u5c0d \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\uff08\u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\uff09\uff0c\u4f7f\u5f97\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143\u76f8\u540c\uff0c\u5f9e\u800c\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u8003\u616e\u898f\u6a21\u66f4\u5c0f\u7684\u554f\u984c\u3002

\u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u5728\u5b57\u4e32 \\(s\\) \u4e2d\u9032\u884c\u7684\u6bcf\u4e00\u8f2a\u6c7a\u7b56\uff08\u7de8\u8f2f\u64cd\u4f5c\uff09\uff0c\u90fd\u6703\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u9918\u7684\u5f85\u5339\u914d\u5b57\u5143\u767c\u751f\u8b8a\u5316\u3002\u56e0\u6b64\uff0c\u72c0\u614b\u70ba\u7576\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u616e\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u500b\u5b57\u5143\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\uff1a\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

\u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u500b\u5c3a\u5bf8\u70ba \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u8003\u616e\u5b50\u554f\u984c \\(dp[i, j]\\) \uff0c\u5176\u5c0d\u61c9\u7684\u5169\u500b\u5b57\u4e32\u7684\u5c3e\u90e8\u5b57\u5143\u70ba \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u64da\u4e0d\u540c\u7de8\u8f2f\u64cd\u4f5c\u5206\u70ba\u5716 14-29 \u6240\u793a\u7684\u4e09\u7a2e\u60c5\u6cc1\u3002

  1. \u5728 \\(s[i-1]\\) \u4e4b\u5f8c\u65b0\u589e \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i, j-1]\\) \u3002
  2. \u522a\u9664 \\(s[i-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j]\\) \u3002
  3. \u5c07 \\(s[i-1]\\) \u66ff\u63db\u70ba \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j-1]\\) \u3002

\u5716 14-29 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u72c0\u614b\u8f49\u79fb

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u512a\u5b50\u7d50\u69cb\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7de8\u8f2f\u6b65\u6578 \\(1\\) \u3002\u5c0d\u61c9\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

\u8acb\u6ce8\u610f\uff0c\u7576 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\uff0c\u9019\u7a2e\u60c5\u6cc1\u4e0b\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, j] = dp[i-1, j-1] \\]

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u5169\u5b57\u4e32\u90fd\u70ba\u7a7a\u6642\uff0c\u7de8\u8f2f\u6b65\u6578\u70ba \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u7576 \\(s\\) \u70ba\u7a7a\u4f46 \\(t\\) \u4e0d\u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(t\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u7576 \\(s\\) \u4e0d\u70ba\u7a7a\u4f46 \\(t\\) \u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(s\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

\u89c0\u5bdf\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8cf4\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
edit_distance.cpp
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.java
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.cs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
edit_distance.go
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.swift
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.js
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.ts
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
edit_distance.dart
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
edit_distance.rs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
edit_distance.c
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
edit_distance.kt
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp}\n
edit_distance.zig
// \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-30 \u6240\u793a\uff0c\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\u8207\u80cc\u5305\u554f\u984c\u975e\u5e38\u985e\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5beb\u4e00\u500b\u4e8c\u7dad\u7db2\u683c\u7684\u904e\u7a0b\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u5716 14-30 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f49\u79fb\u800c\u4f86\u7684\uff0c\u800c\u6b63\u5e8f\u8d70\u8a2a\u6703\u4e1f\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u8d70\u8a2a\u7121\u6cd5\u63d0\u524d\u69cb\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u5169\u7a2e\u8d70\u8a2a\u9806\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 leftup \u4f86\u66ab\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u5f9e\u800c\u53ea\u9700\u8003\u616e\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u6642\u7684\u60c5\u6cc1\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u8d70\u8a2a\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n + 1):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    return dp[m]\n
edit_distance.cpp
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.java
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.cs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.go
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i := 1; i <= n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.swift
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ... n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.js
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.ts
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
edit_distance.dart
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
edit_distance.rs
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..=n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
edit_distance.c
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
edit_distance.kt
/* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
edit_distance.rb
[class]{}-[func]{edit_distance_dp_comp}\n
edit_distance.zig
// \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n + 1) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283","text":"

\u52d5\u614b\u898f\u5283\uff08dynamic programming\uff09\u662f\u4e00\u500b\u91cd\u8981\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\uff0c\u5b83\u5c07\u4e00\u500b\u554f\u984c\u5206\u89e3\u70ba\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u907f\u514d\u91cd\u8907\u8a08\u7b97\uff0c\u5f9e\u800c\u5927\u5e45\u63d0\u5347\u6642\u9593\u6548\u7387\u3002

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5f9e\u4e00\u500b\u7d93\u5178\u4f8b\u984c\u5165\u624b\uff0c\u5148\u7d66\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c0\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u518d\u9010\u6b65\u5c0e\u51fa\u66f4\u9ad8\u6548\u7684\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

\u722c\u6a13\u68af

\u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

\u5982\u5716 14-1 \u6240\u793a\uff0c\u5c0d\u65bc\u4e00\u500b \\(3\\) \u968e\u6a13\u68af\uff0c\u5171\u6709 \\(3\\) \u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\u3002

\u5716 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u900f\u904e\u56de\u6eaf\u4f86\u7aae\u8209\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u5c07\u722c\u6a13\u68af\u60f3\u8c61\u70ba\u4e00\u500b\u591a\u8f2a\u9078\u64c7\u7684\u904e\u7a0b\uff1a\u5f9e\u5730\u9762\u51fa\u767c\uff0c\u6bcf\u8f2a\u9078\u64c7\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u6bcf\u7576\u5230\u9054\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u65b9\u6848\u6578\u91cf\u52a0 \\(1\\) \uff0c\u7576\u8d8a\u904e\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u5176\u526a\u679d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    state = 0  # \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
climbing_stairs_backtrack.cpp
/* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;                // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.java
/* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.cs
/* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
climbing_stairs_backtrack.go
/* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state+choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    choices := []int{1, 2}\n    // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.swift
/* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
climbing_stairs_backtrack.js
/* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.ts
/* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
climbing_stairs_backtrack.dart
/* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n    if (state + choice > n) continue;\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n  int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
climbing_stairs_backtrack.rs
/* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
climbing_stairs_backtrack.c
/* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;           // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
climbing_stairs_backtrack.kt
/* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    val state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
climbing_stairs_backtrack.rb
[class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
climbing_stairs_backtrack.zig
// \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u6a13\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    var state: i32 = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u4e26\u4e0d\u986f\u5f0f\u5730\u5c0d\u554f\u984c\u9032\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c07\u6c42\u89e3\u554f\u984c\u770b\u4f5c\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\uff0c\u900f\u904e\u8a66\u63a2\u548c\u526a\u679d\uff0c\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

\u6211\u5011\u53ef\u4ee5\u5617\u8a66\u5f9e\u554f\u984c\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u9019\u9053\u984c\u3002\u8a2d\u722c\u5230\u7b2c \\(i\\) \u968e\u5171\u6709 \\(dp[i]\\) \u7a2e\u65b9\u6848\uff0c\u90a3\u9ebc \\(dp[i]\\) \u5c31\u662f\u539f\u554f\u984c\uff0c\u5176\u5b50\u554f\u984c\u5305\u62ec\uff1a

\\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

\u7531\u65bc\u6bcf\u8f2a\u53ea\u80fd\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u56e0\u6b64\u7576\u6211\u5011\u7ad9\u5728\u7b2c \\(i\\) \u968e\u6a13\u68af\u4e0a\u6642\uff0c\u4e0a\u4e00\u8f2a\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u4e0a\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ea\u80fd\u5f9e\u7b2c \\(i -1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u9081\u5411\u7b2c \\(i\\) \u968e\u3002

\u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u63a8\u8ad6\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u968e\u7684\u65b9\u6848\u6578\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u968e\u7684\u65b9\u6848\u6578\u5c31\u7b49\u65bc\u722c\u5230\u7b2c \\(i\\) \u968e\u7684\u65b9\u6848\u6578\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

\\[ dp[i] = dp[i-1] + dp[i-2] \\]

\u9019\u610f\u5473\u8457\u5728\u722c\u6a13\u68af\u554f\u984c\u4e2d\uff0c\u5404\u500b\u5b50\u554f\u984c\u4e4b\u9593\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\uff0c\u539f\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u554f\u984c\u7684\u89e3\u69cb\u5efa\u5f97\u4f86\u3002\u5716 14-2 \u5c55\u793a\u4e86\u8a72\u905e\u63a8\u95dc\u4fc2\u3002

\u5716 14-2 \u00a0 \u65b9\u6848\u6578\u91cf\u905e\u63a8\u95dc\u4fc2

\u6211\u5011\u53ef\u4ee5\u6839\u64da\u905e\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u5c0b\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u905e\u8ff4\u5730\u5c07\u4e00\u500b\u8f03\u5927\u554f\u984c\u62c6\u89e3\u70ba\u5169\u500b\u8f03\u5c0f\u554f\u984c\u7684\u548c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c \\(dp[1]\\) \u548c \\(dp[2]\\) \u6642\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u968e\u5206\u5225\u6709 \\(1\\)\u3001\\(2\\) \u7a2e\u65b9\u6848\u3002

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5b83\u548c\u6a19\u6e96\u56de\u6eaf\u7a0b\u5f0f\u78bc\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u4f46\u66f4\u52a0\u7c21\u6f54\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
def dfs(i: int) -> int:\n    \"\"\"\u641c\u5c0b\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u641c\u5c0b\"\"\"\n    return dfs(n)\n
climbing_stairs_dfs.cpp
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.java
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.cs
/* \u641c\u5c0b */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
climbing_stairs_dfs.go
/* \u641c\u5c0b */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.swift
/* \u641c\u5c0b */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
climbing_stairs_dfs.js
/* \u641c\u5c0b */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.ts
/* \u641c\u5c0b */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
climbing_stairs_dfs.dart
/* \u641c\u5c0b */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
climbing_stairs_dfs.rs
/* \u641c\u5c0b */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
climbing_stairs_dfs.c
/* \u641c\u5c0b */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
climbing_stairs_dfs.kt
/* \u641c\u5c0b */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u641c\u5c0b */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
climbing_stairs_dfs.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
climbing_stairs_dfs.zig
// \u641c\u5c0b\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u641c\u5c0b\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u5c0b\u5f62\u6210\u7684\u905e\u8ff4\u6a39\u3002\u5c0d\u65bc\u554f\u984c \\(dp[n]\\) \uff0c\u5176\u905e\u8ff4\u6a39\u7684\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002\u6307\u6578\u968e\u5c6c\u65bc\u7206\u70b8\u5f0f\u589e\u9577\uff0c\u5982\u679c\u6211\u5011\u8f38\u5165\u4e00\u500b\u6bd4\u8f03\u5927\u7684 \\(n\\) \uff0c\u5247\u6703\u9677\u5165\u6f2b\u9577\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

\u5716 14-3 \u00a0 \u722c\u6a13\u68af\u5c0d\u61c9\u905e\u8ff4\u6a39

\u89c0\u5bdf\u5716 14-3 \uff0c\u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u201c\u91cd\u758a\u5b50\u554f\u984c\u201d\u5c0e\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u70ba \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u70ba \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u5169\u8005\u90fd\u5305\u542b\u5b50\u554f\u984c \\(dp[7]\\) \u3002

\u4ee5\u6b64\u985e\u63a8\uff0c\u5b50\u554f\u984c\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5b50\u5b50\u5b6b\u5b6b\u7121\u7aae\u76e1\u4e5f\u3002\u7d55\u5927\u90e8\u5206\u8a08\u7b97\u8cc7\u6e90\u90fd\u6d6a\u8cbb\u5728\u9019\u4e9b\u91cd\u758a\u7684\u5b50\u554f\u984c\u4e0a\u3002

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u70ba\u4e86\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u5011\u5e0c\u671b\u6240\u6709\u7684\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u9663\u5217 mem \u4f86\u8a18\u9304\u6bcf\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5c07\u91cd\u758a\u5b50\u554f\u984c\u526a\u679d\u3002

  1. \u7576\u9996\u6b21\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u5c07\u5176\u8a18\u9304\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u5f8c\u4f7f\u7528\u3002
  2. \u7576\u518d\u6b21\u9700\u8981\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u4fbf\u53ef\u76f4\u63a5\u5f9e mem[i] \u4e2d\u7372\u53d6\u7d50\u679c\uff0c\u5f9e\u800c\u907f\u514d\u91cd\u8907\u8a08\u7b97\u8a72\u5b50\u554f\u984c\u3002

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
climbing_stairs_dfs_mem.cpp
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.java
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.cs
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
climbing_stairs_dfs_mem.go
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
climbing_stairs_dfs_mem.swift
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
climbing_stairs_dfs_mem.js
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.ts
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.dart
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8a18\u9304 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
climbing_stairs_dfs_mem.rs
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
climbing_stairs_dfs_mem.c
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
climbing_stairs_dfs_mem.kt
/* \u8a18\u61b6\u5316\u641c\u5c0b */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
climbing_stairs_dfs_mem.rb
[class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
climbing_stairs_dfs_mem.zig
// \u8a18\u61b6\u5316\u641c\u5c0b\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u5716 14-4 \uff0c\u7d93\u904e\u8a18\u61b6\u5316\u8655\u7406\u5f8c\uff0c\u6240\u6709\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u9019\u662f\u4e00\u500b\u5de8\u5927\u7684\u98db\u8e8d\u3002

\u5716 14-4 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u5c0d\u61c9\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u201c\u5f9e\u9802\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u5011\u5f9e\u539f\u554f\u984c\uff08\u6839\u7bc0\u9ede\uff09\u958b\u59cb\uff0c\u905e\u8ff4\u5730\u5c07\u8f03\u5927\u5b50\u554f\u984c\u5206\u89e3\u70ba\u8f03\u5c0f\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u554f\u984c\uff08\u8449\u7bc0\u9ede\uff09\u3002\u4e4b\u5f8c\uff0c\u900f\u904e\u56de\u6eaf\u9010\u5c64\u6536\u96c6\u5b50\u554f\u984c\u7684\u89e3\uff0c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

\u8207\u4e4b\u76f8\u53cd\uff0c\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u7684\u65b9\u6cd5\uff1a\u5f9e\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u958b\u59cb\uff0c\u8fed\u4ee3\u5730\u69cb\u5efa\u66f4\u5927\u5b50\u554f\u984c\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002

\u7531\u65bc\u52d5\u614b\u898f\u5283\u4e0d\u5305\u542b\u56de\u6eaf\u904e\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u8ff4\u5708\u8fed\u4ee3\u5be6\u73fe\uff0c\u7121\u9808\u4f7f\u7528\u905e\u8ff4\u3002\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u521d\u59cb\u5316\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u8207\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u9663\u5217 mem \u76f8\u540c\u7684\u8a18\u9304\u4f5c\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.java
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.go
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.js
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
climbing_stairs_dp.c
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp}\n
climbing_stairs_dp.zig
// \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-5 \u6a21\u64ec\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\u3002

\u5716 14-5 \u00a0 \u722c\u6a13\u68af\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u8207\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u52d5\u614b\u898f\u5283\u4e5f\u4f7f\u7528\u201c\u72c0\u614b\u201d\u6982\u5ff5\u4f86\u8868\u793a\u554f\u984c\u6c42\u89e3\u7684\u7279\u5b9a\u968e\u6bb5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\u4ee5\u53ca\u76f8\u61c9\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u6a13\u68af\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578 \\(i\\) \u3002

\u6839\u64da\u4ee5\u4e0a\u5167\u5bb9\uff0c\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u52d5\u614b\u898f\u5283\u7684\u5e38\u7528\u8853\u8a9e\u3002

  • \u5c07\u9663\u5217 dp \u7a31\u70ba dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72c0\u614b \\(i\\) \u5c0d\u61c9\u5b50\u554f\u984c\u7684\u89e3\u3002
  • \u5c07\u6700\u5c0f\u5b50\u554f\u984c\u5c0d\u61c9\u7684\u72c0\u614b\uff08\u7b2c \\(1\\) \u968e\u548c\u7b2c \\(2\\) \u968e\u6a13\u68af\uff09\u7a31\u70ba\u521d\u59cb\u72c0\u614b\u3002
  • \u5c07\u905e\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u7a31\u70ba\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002
"},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u7531\u65bc \\(dp[i]\\) \u53ea\u8207 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u7121\u9808\u4f7f\u7528\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u800c\u53ea\u9700\u5169\u500b\u8b8a\u6578\u6efe\u52d5\u524d\u9032\u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
climbing_stairs_dp.cpp
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.java
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.cs
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.go
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
climbing_stairs_dp.swift
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
climbing_stairs_dp.js
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.ts
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.dart
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
climbing_stairs_dp.rs
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
climbing_stairs_dp.c
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
climbing_stairs_dp.kt
/* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
climbing_stairs_dp.rb
[class]{}-[func]{climbing_stairs_dp_comp}\n
climbing_stairs_dp.zig
// \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7531\u65bc\u7701\u53bb\u4e86\u9663\u5217 dp \u4f54\u7528\u7684\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

\u5728\u52d5\u614b\u898f\u5283\u554f\u984c\u4e2d\uff0c\u7576\u524d\u72c0\u614b\u5f80\u5f80\u50c5\u8207\u524d\u9762\u6709\u9650\u500b\u72c0\u614b\u6709\u95dc\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72c0\u614b\uff0c\u900f\u904e\u201c\u964d\u7dad\u201d\u4f86\u7bc0\u7701\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u9019\u7a2e\u7a7a\u9593\u6700\u4f73\u5316\u6280\u5de7\u88ab\u7a31\u70ba\u201c\u6efe\u52d5\u8b8a\u6578\u201d\u6216\u201c\u6efe\u52d5\u9663\u5217\u201d\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c","text":"

\u80cc\u5305\u554f\u984c\u662f\u4e00\u500b\u975e\u5e38\u597d\u7684\u52d5\u614b\u898f\u5283\u5165\u9580\u984c\u76ee\uff0c\u662f\u52d5\u614b\u898f\u5283\u4e2d\u6700\u5e38\u898b\u7684\u554f\u984c\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u554f\u984c\u3001\u5b8c\u5168\u80cc\u5305\u554f\u984c\u3001\u591a\u91cd\u80cc\u5305\u554f\u984c\u7b49\u3002

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u4f86\u6c42\u89e3\u6700\u5e38\u898b\u7684 0-1 \u80cc\u5305\u554f\u984c\u3002

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002

\u89c0\u5bdf\u5716 14-17 \uff0c\u7531\u65bc\u7269\u54c1\u7de8\u865f \\(i\\) \u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\uff0c\u9663\u5217\u7d22\u5f15\u5f9e \\(0\\) \u958b\u59cb\u8a08\u6578\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5c0d\u61c9\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u50f9\u503c \\(val[i-1]\\) \u3002

\u5716 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u8cc7\u6599

\u6211\u5011\u53ef\u4ee5\u5c07 0-1 \u80cc\u5305\u554f\u984c\u770b\u4f5c\u4e00\u500b\u7531 \\(n\\) \u8f2a\u6c7a\u7b56\u7d44\u6210\u7684\u904e\u7a0b\uff0c\u5c0d\u65bc\u6bcf\u500b\u7269\u9ad4\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u5169\u7a2e\u6c7a\u7b56\uff0c\u56e0\u6b64\u8a72\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\u3002

\u8a72\u554f\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u201d\uff0c\u56e0\u6b64\u8f03\u5927\u6a5f\u7387\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u5c0d\u65bc\u6bcf\u500b\u7269\u54c1\u4f86\u8aaa\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72c0\u614b\u5b9a\u7fa9\uff1a\u7576\u524d\u7269\u54c1\u7de8\u865f \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8a18\u70ba \\([i, c]\\) \u3002

\u72c0\u614b \\([i, c]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\uff0c\u8a18\u70ba \\(dp[i, c]\\) \u3002

\u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u500b\u5c3a\u5bf8\u70ba \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u7576\u6211\u5011\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u6c7a\u7b56\u5f8c\uff0c\u5269\u9918\u7684\u662f\u524d \\(i-1\\) \u500b\u7269\u54c1\u6c7a\u7b56\u7684\u5b50\u554f\u984c\uff0c\u53ef\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c11 \\(wgt[i-1]\\) \uff0c\u50f9\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c-wgt[i-1]]\\) \u3002

\u4e0a\u8ff0\u5206\u6790\u5411\u6211\u5011\u63ed\u793a\u4e86\u672c\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6700\u5927\u50f9\u503c \\(dp[i, c]\\) \u7b49\u65bc\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\u3002\u7531\u6b64\u53ef\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u9918\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u7121\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u70ba \\(0\\) \u6642\u6700\u5927\u50f9\u503c\u70ba \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

\u7576\u524d\u72c0\u614b \\([i, c]\\) \u5f9e\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c-wgt[i-1]]\\) \u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

\u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u6309\u9806\u5e8f\u5be6\u73fe\u66b4\u529b\u641c\u5c0b\u3001\u8a18\u61b6\u5316\u641c\u5c0b\u3001\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

"},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

\u641c\u5c0b\u7a0b\u5f0f\u78bc\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

  • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, c]\\) \u3002
  • \u8fd4\u56de\u503c\uff1a\u5b50\u554f\u984c\u7684\u89e3 \\(dp[i, c]\\) \u3002
  • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576\u7269\u54c1\u7de8\u865f\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u9918\u5bb9\u91cf\u70ba \\(0\\) \u6642\uff0c\u7d42\u6b62\u905e\u8ff4\u4e26\u8fd4\u56de\u50f9\u503c \\(0\\) \u3002
  • \u526a\u679d\uff1a\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes);\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.Max(no, yes);\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return int(math.Max(float64(no), float64(yes)))\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  return max(no, yes);\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    std::cmp::max(no, yes)\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return myMax(no, yes);\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return @max(no, yes);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-18 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u7269\u54c1\u90fd\u6703\u7522\u751f\u4e0d\u9078\u548c\u9078\u5169\u689d\u641c\u5c0b\u5206\u652f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002

\u89c0\u5bdf\u905e\u8ff4\u6a39\uff0c\u5bb9\u6613\u767c\u73fe\u5176\u4e2d\u5b58\u5728\u91cd\u758a\u5b50\u554f\u984c\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u7576\u7269\u54c1\u8f03\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f03\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f03\u591a\u6642\uff0c\u91cd\u758a\u5b50\u554f\u984c\u7684\u6578\u91cf\u5c07\u6703\u5927\u5e45\u589e\u591a\u3002

\u5716 14-18 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

\u70ba\u4e86\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\uff0c\u6211\u5011\u85c9\u52a9\u8a18\u61b6\u4e32\u5217 mem \u4f86\u8a18\u9304\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5c0d\u61c9 \\(dp[i, c]\\) \u3002

\u5f15\u5165\u8a18\u61b6\u5316\u4e4b\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u5b50\u554f\u984c\u6578\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dfs_mem}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-19 \u5c55\u793a\u4e86\u5728\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u88ab\u526a\u6389\u7684\u641c\u5c0b\u5206\u652f\u3002

\u5716 14-19 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

"},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

\u52d5\u614b\u898f\u5283\u5be6\u8cea\u4e0a\u5c31\u662f\u5728\u72c0\u614b\u8f49\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u904e\u7a0b\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 14-20 \u6240\u793a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u7531\u9663\u5217 dp \u5927\u5c0f\u6c7a\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14>

\u5716 14-20 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u90fd\u53ea\u8207\u5176\u4e0a\u4e00\u884c\u7684\u72c0\u614b\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5169\u500b\u9663\u5217\u6efe\u52d5\u524d\u9032\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

\u9032\u4e00\u6b65\u601d\u8003\uff0c\u6211\u5011\u80fd\u5426\u50c5\u7528\u4e00\u500b\u9663\u5217\u5be6\u73fe\u7a7a\u9593\u6700\u4f73\u5316\u5462\uff1f\u89c0\u5bdf\u53ef\u77e5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f49\u79fb\u904e\u4f86\u7684\u3002\u5047\u8a2d\u53ea\u6709\u4e00\u500b\u9663\u5217\uff0c\u7576\u958b\u59cb\u8d70\u8a2a\u7b2c \\(i\\) \u884c\u6642\uff0c\u8a72\u9663\u5217\u5132\u5b58\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72c0\u614b\u3002

  • \u5982\u679c\u63a1\u53d6\u6b63\u5e8f\u8d70\u8a2a\uff0c\u90a3\u9ebc\u8d70\u8a2a\u5230 \\(dp[i, j]\\) \u6642\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7d93\u88ab\u8986\u84cb\uff0c\u6b64\u6642\u5c31\u7121\u6cd5\u5f97\u5230\u6b63\u78ba\u7684\u72c0\u614b\u8f49\u79fb\u7d50\u679c\u3002
  • \u5982\u679c\u63a1\u53d6\u5012\u5e8f\u8d70\u8a2a\uff0c\u5247\u4e0d\u6703\u767c\u751f\u8986\u84cb\u554f\u984c\uff0c\u72c0\u614b\u8f49\u79fb\u53ef\u4ee5\u6b63\u78ba\u9032\u884c\u3002

\u5716 14-21 \u5c55\u793a\u4e86\u5728\u55ae\u500b\u9663\u5217\u4e0b\u5f9e\u7b2c \\(i = 1\\) \u884c\u8f49\u63db\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u904e\u7a0b\u3002\u8acb\u601d\u8003\u6b63\u5e8f\u8d70\u8a2a\u548c\u5012\u5e8f\u8d70\u8a2a\u7684\u5340\u5225\u3002

<1><2><3><4><5><6>

\u5716 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad \\(i\\) \u76f4\u63a5\u522a\u9664\uff0c\u4e26\u4e14\u628a\u5167\u8ff4\u5708\u66f4\u6539\u70ba\u5012\u5e8f\u8d70\u8a2a\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u8d70\u8a2a\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
knapsack.cpp
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.java
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.cs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.go
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.swift
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.js
/* 0-1 \u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.ts
/* 0-1 \u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
knapsack.dart
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u8d70\u8a2a\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
knapsack.rs
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
knapsack.c
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
knapsack.kt
/* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
knapsack.rb
[class]{}-[func]{knapsack_dp_comp}\n
knapsack.zig
// 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u8d70\u8a2a\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7d50","text":"
  • \u52d5\u614b\u898f\u5283\u5c0d\u554f\u984c\u9032\u884c\u5206\u89e3\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u898f\u907f\u91cd\u8907\u8a08\u7b97\uff0c\u63d0\u9ad8\u8a08\u7b97\u6548\u7387\u3002
  • \u4e0d\u8003\u616e\u6642\u9593\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52d5\u614b\u898f\u5283\u554f\u984c\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u5c0b\uff09\u9032\u884c\u6c42\u89e3\uff0c\u4f46\u905e\u8ff4\u6a39\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u6548\u7387\u6975\u4f4e\u3002\u900f\u904e\u5f15\u5165\u8a18\u61b6\u5316\u4e32\u5217\uff0c\u53ef\u4ee5\u5132\u5b58\u6240\u6709\u8a08\u7b97\u904e\u7684\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5f9e\u800c\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002
  • \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u905e\u8ff4\u5f0f\u89e3\u6cd5\uff0c\u800c\u8207\u4e4b\u5c0d\u61c9\u7684\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u5f9e\u5e95\u81f3\u9802\u7684\u905e\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5beb\u8868\u683c\u201d\u4e00\u6a23\u3002\u7531\u65bc\u7576\u524d\u72c0\u614b\u50c5\u4f9d\u8cf4\u67d0\u4e9b\u5340\u57df\u6027\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\uff0c\u5f9e\u800c\u964d\u4f4e\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
  • \u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8cea\u3002
  • \u52d5\u614b\u898f\u5283\u554f\u984c\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002
  • \u5982\u679c\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u53ef\u4ee5\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\uff0c\u5247\u5b83\u5c31\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\u3002
  • \u7121\u5f8c\u6548\u6027\u6307\u5c0d\u65bc\u4e00\u500b\u72c0\u614b\uff0c\u5176\u672a\u4f86\u767c\u5c55\u53ea\u8207\u8a72\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u4e0d\u5177\u6709\u7121\u5f8c\u6548\u6027\uff0c\u7121\u6cd5\u4f7f\u7528\u52d5\u614b\u898f\u5283\u5feb\u901f\u6c42\u89e3\u3002

\u80cc\u5305\u554f\u984c

  • \u80cc\u5305\u554f\u984c\u662f\u6700\u5178\u578b\u7684\u52d5\u614b\u898f\u5283\u554f\u984c\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u8b8a\u7a2e\u3002
  • 0-1 \u80cc\u5305\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\u3002\u6839\u64da\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u5169\u7a2e\u6c7a\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\uff0c\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u8d70\u8a2a\u4e32\u5217\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72c0\u614b\u88ab\u8986\u84cb\u3002
  • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u6bcf\u7a2e\u7269\u54c1\u7684\u9078\u53d6\u6578\u91cf\u7121\u9650\u5236\uff0c\u56e0\u6b64\u9078\u64c7\u653e\u5165\u7269\u54c1\u7684\u72c0\u614b\u8f49\u79fb\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\u3002\u7531\u65bc\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\u61c9\u7576\u6b63\u5e8f\u8d70\u8a2a\u3002
  • \u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u500b\u8b8a\u7a2e\u3002\u5b83\u5f9e\u6c42\u201c\u6700\u5927\u201d\u50f9\u503c\u8b8a\u70ba\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e63\u6578\u91cf\uff0c\u56e0\u6b64\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u61c9\u6539\u70ba \\(\\min()\\) \u3002\u5f9e\u8ffd\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u4f86\u8868\u793a\u201c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u201d\u7684\u7121\u6548\u89e3\u3002
  • \u96f6\u9322\u514c\u63db\u554f\u984c II \u5f9e\u6c42\u201c\u6700\u5c11\u786c\u5e63\u6578\u91cf\u201d\u6539\u70ba\u6c42\u201c\u786c\u5e63\u7d44\u5408\u6578\u91cf\u201d\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u76f8\u61c9\u5730\u5f9e \\(\\min()\\) \u6539\u70ba\u6c42\u548c\u904b\u7b97\u5b50\u3002

\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

  • \u7de8\u8f2f\u8ddd\u96e2\uff08Levenshtein \u8ddd\u96e2\uff09\u7528\u65bc\u8861\u91cf\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u7fa9\u70ba\u5f9e\u4e00\u500b\u5b57\u4e32\u5230\u53e6\u4e00\u500b\u5b57\u4e32\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u7de8\u8f2f\u64cd\u4f5c\u5305\u62ec\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\u3002
  • \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002\u7576 \\(s[i] \\ne t[j]\\) \u6642\uff0c\u5177\u6709\u4e09\u7a2e\u6c7a\u7b56\uff1a\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\uff0c\u5b83\u5011\u90fd\u6709\u76f8\u61c9\u7684\u5269\u9918\u5b50\u554f\u984c\u3002\u64da\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u8207\u69cb\u5efa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u800c\u7576 \\(s[i] = t[j]\\) \u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\u3002
  • \u5728\u7de8\u8f2f\u8ddd\u96e2\u4e2d\uff0c\u72c0\u614b\u4f9d\u8cf4\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u6b63\u5e8f\u6216\u5012\u5e8f\u8d70\u8a2a\u90fd\u7121\u6cd5\u6b63\u78ba\u5730\u9032\u884c\u72c0\u614b\u8f49\u79fb\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u8b8a\u6578\u66ab\u5b58\u5de6\u4e0a\u65b9\u72c0\u614b\uff0c\u5f9e\u800c\u8f49\u5316\u5230\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7b49\u50f9\u7684\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002
"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u6c42\u89e3\u53e6\u4e00\u500b\u5e38\u898b\u7684\u80cc\u5305\u554f\u984c\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u77ad\u89e3\u5b83\u7684\u4e00\u7a2e\u7279\u4f8b\uff1a\u96f6\u9322\u514c\u63db\u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 14-22 \u6240\u793a\u3002

\u5716 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u5b8c\u5168\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\uff0c\u5340\u5225\u50c5\u5728\u65bc\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9078\u64c7\u6b21\u6578\u3002

  • \u5728 0-1 \u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u53ea\u6709\u4e00\u500b\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u53ea\u80fd\u5f9e\u524d \\(i-1\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002
  • \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u7684\u6578\u91cf\u662f\u7121\u9650\u7684\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5f9e\u524d \\(i\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002

\u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u898f\u5b9a\u4e0b\uff0c\u72c0\u614b \\([i, c]\\) \u7684\u8b8a\u5316\u5206\u70ba\u5169\u7a2e\u60c5\u6cc1\u3002

  • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u8f49\u79fb\u81f3 \\([i-1, c]\\) \u3002
  • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\uff0c\u8f49\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

\u5f9e\u800c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u8b8a\u70ba\uff1a

\\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5c0d\u6bd4\u5169\u9053\u984c\u76ee\u7684\u7a0b\u5f0f\u78bc\uff0c\u72c0\u614b\u8f49\u79fb\u4e2d\u6709\u4e00\u8655\u5f9e \\(i-1\\) \u8b8a\u70ba \\(i\\) \uff0c\u5176\u9918\u5b8c\u5168\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7531\u65bc\u7576\u524d\u72c0\u614b\u662f\u5f9e\u5de6\u908a\u548c\u4e0a\u908a\u7684\u72c0\u614b\u8f49\u79fb\u800c\u4f86\u7684\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u61c9\u8a72\u5c0d \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002

\u9019\u500b\u8d70\u8a2a\u9806\u5e8f\u8207 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8acb\u85c9\u52a9\u5716 14-23 \u4f86\u7406\u89e3\u5169\u8005\u7684\u5340\u5225\u3002

<1><2><3><4><5><6>

\u5716 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

\u7a0b\u5f0f\u78bc\u5be6\u73fe\u6bd4\u8f03\u7c21\u55ae\uff0c\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad\u522a\u9664\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
unbounded_knapsack.cpp
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.java
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.cs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.go
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.swift
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.js
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.ts
/* \u5b8c\u5168\u80cc\u5305\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
unbounded_knapsack.dart
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
unbounded_knapsack.rs
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
unbounded_knapsack.c
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
unbounded_knapsack.kt
/* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
unbounded_knapsack.rb
[class]{}-[func]{unbounded_knapsack_dp_comp}\n
unbounded_knapsack.zig
// \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c","text":"

\u80cc\u5305\u554f\u984c\u662f\u4e00\u5927\u985e\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4ee3\u8868\uff0c\u5176\u64c1\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 14-24 \u6240\u793a\u3002

\u5716 14-24 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u96f6\u9322\u514c\u63db\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u7a2e\u7279\u6b8a\u60c5\u6cc1\uff0c\u5169\u8005\u5177\u6709\u4ee5\u4e0b\u95dc\u806f\u8207\u4e0d\u540c\u9ede\u3002

  • \u5169\u9053\u984c\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\uff0c\u201c\u7269\u54c1\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5c0d\u61c9\u201c\u76ee\u6a19\u91d1\u984d\u201d\u3002
  • \u6700\u4f73\u5316\u76ee\u6a19\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u50f9\u503c\uff0c\u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e63\u6578\u91cf\u3002
  • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u9322\u514c\u63db\u662f\u6c42\u201c\u6070\u597d\u201d\u6e4a\u5230\u76ee\u6a19\u91d1\u984d\u7684\u89e3\u3002

\u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

\u72c0\u614b \\([i, a]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\uff0c\u8a18\u70ba \\(dp[i, a]\\) \u3002

\u4e8c\u7dad \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt+1)\\) \u3002

\u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

\u672c\u984c\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u5169\u9ede\u5dee\u7570\u3002

  • \u672c\u984c\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c07\u904b\u7b97\u5b50 \\(\\max()\\) \u66f4\u6539\u70ba \\(\\min()\\) \u3002
  • \u6700\u4f73\u5316\u4e3b\u9ad4\u662f\u786c\u5e63\u6578\u91cf\u800c\u975e\u5546\u54c1\u50f9\u503c\uff0c\u56e0\u6b64\u5728\u9078\u4e2d\u786c\u5e63\u6642\u57f7\u884c \\(+1\\) \u5373\u53ef\u3002
\\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

\u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

\u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u6e4a\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u70ba \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u5373\u662f\u7121\u6548\u89e3\u3002\u70ba\u4f7f\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u5f0f\u80fd\u5920\u8b58\u5225\u4e26\u904e\u6ffe\u7121\u6548\u89e3\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528 \\(+ \\infty\\) \u4f86\u8868\u793a\u5b83\u5011\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(+ \\infty\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e26\u672a\u63d0\u4f9b \\(+ \\infty\\) \u8b8a\u6578\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u4f86\u4ee3\u66ff\u3002\u800c\u9019\u53c8\u6703\u5c0e\u81f4\u5927\u6578\u8d8a\u754c\uff1a\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u767c\u751f\u6ea2\u4f4d\u3002

\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u6578\u5b57 \\(amt + 1\\) \u4f86\u8868\u793a\u7121\u6548\u89e3\uff0c\u56e0\u70ba\u6e4a\u51fa \\(amt\\) \u7684\u786c\u5e63\u6578\u91cf\u6700\u591a\u70ba \\(amt\\) \u3002\u6700\u5f8c\u8fd4\u56de\u524d\uff0c\u5224\u65b7 \\(dp[n, amt]\\) \u662f\u5426\u7b49\u65bc \\(amt + 1\\) \uff0c\u82e5\u662f\u5247\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.java
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
coin_change.go
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
coin_change.js
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp}\n
coin_change.zig
// \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 14-25 \u5c55\u793a\u4e86\u96f6\u9322\u514c\u63db\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\u3002

<1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

\u5716 14-25 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u96f6\u9322\u514c\u63db\u7684\u7a7a\u9593\u6700\u4f73\u5316\u7684\u8655\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e00\u81f4\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
coin_change.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.java
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.go
/* \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
coin_change.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
coin_change.js
/* \u96f6\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
coin_change.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
coin_change.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
coin_change.c
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
coin_change.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
coin_change.rb
[class]{}-[func]{coin_change_dp_comp}\n
coin_change.zig
// \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II","text":"

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u786c\u5e63\u7d44\u5408\u6578\u91cf\u3002\u793a\u4f8b\u5982\u5716 14-26 \u6240\u793a\u3002

\u5716 14-26 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II \u7684\u793a\u4f8b\u8cc7\u6599

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

\u76f8\u6bd4\u65bc\u4e0a\u4e00\u984c\uff0c\u672c\u984c\u76ee\u6a19\u662f\u6c42\u7d44\u5408\u6578\u91cf\uff0c\u56e0\u6b64\u5b50\u554f\u984c\u8b8a\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u7d44\u5408\u6578\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7dad\u77e9\u9663\u3002

\u7576\u524d\u72c0\u614b\u7684\u7d44\u5408\u6578\u91cf\u7b49\u65bc\u4e0d\u9078\u7576\u524d\u786c\u5e63\u8207\u9078\u7576\u524d\u786c\u5e63\u9019\u5169\u7a2e\u6c7a\u7b56\u7684\u7d44\u5408\u6578\u91cf\u4e4b\u548c\u3002\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

\\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

\u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u7121\u9808\u9078\u64c7\u4efb\u4f55\u786c\u5e63\u5373\u53ef\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u61c9\u5c07\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u70ba \\(1\\) \u3002\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
coin_change_ii.cpp
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.java
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.cs
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
coin_change_ii.go
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.swift
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.js
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.ts
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
coin_change_ii.dart
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
coin_change_ii.rs
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
coin_change_ii.c
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp}\n
coin_change_ii.zig
// \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

\u7a7a\u9593\u6700\u4f73\u5316\u8655\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u522a\u9664\u786c\u5e63\u7dad\u5ea6\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
coin_change_ii.cpp
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.java
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.cs
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.go
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.swift
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.js
/* \u96f6\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.ts
/* \u96f6\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
coin_change_ii.dart
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
coin_change_ii.rs
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
coin_change_ii.c
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
coin_change_ii.kt
/* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
coin_change_ii.rb
[class]{}-[func]{coin_change_ii_dp_comp}\n
coin_change_ii.zig
// \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u5716","text":"

Abstract

\u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u5011\u5c31\u50cf\u662f\u4e00\u500b\u500b\u7bc0\u9ede\uff0c\u88ab\u7121\u6578\u770b\u4e0d\u898b\u7684\u908a\u76f8\u9023\u3002

\u6bcf\u4e00\u6b21\u7684\u76f8\u8b58\u8207\u76f8\u96e2\uff0c\u90fd\u5728\u9019\u5f35\u5de8\u5927\u7684\u7db2\u8def\u5716\u4e2d\u7559\u4e0b\u7368\u7279\u7684\u5370\u8a18\u3002

"},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 9.1 \u00a0 \u5716
  • 9.2 \u00a0 \u5716\u57fa\u790e\u64cd\u4f5c
  • 9.3 \u00a0 \u5716\u7684\u8d70\u8a2a
  • 9.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u5716","text":"

\u5716\uff08graph\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u7531\u9802\u9ede\uff08vertex\uff09\u548c\u908a\uff08edge\uff09\u7d44\u6210\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u5716 \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede \\(V\\) \u548c\u4e00\u7d44\u908a \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u500b\u5305\u542b 5 \u500b\u9802\u9ede\u548c 7 \u689d\u908a\u7684\u5716\u3002

\\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

\u5982\u679c\u5c07\u9802\u9ede\u770b\u4f5c\u7bc0\u9ede\uff0c\u5c07\u908a\u770b\u4f5c\u9023\u7dda\u5404\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5716\u770b\u4f5c\u4e00\u7a2e\u5f9e\u93c8\u7d50\u4e32\u5217\u62d3\u5c55\u800c\u4f86\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5982\u5716 9-1 \u6240\u793a\uff0c\u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002

\u5716 9-1 \u00a0 \u93c8\u7d50\u4e32\u5217\u3001\u6a39\u3001\u5716\u4e4b\u9593\u7684\u95dc\u4fc2

"},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u5716\u7684\u5e38\u898b\u578b\u5225\u8207\u8853\u8a9e","text":"

\u6839\u64da\u908a\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u70ba\u7121\u5411\u5716\uff08undirected graph\uff09\u548c\u6709\u5411\u5716\uff08directed graph\uff09\uff0c\u5982\u5716 9-2 \u6240\u793a\u3002

  • \u5728\u7121\u5411\u5716\u4e2d\uff0c\u908a\u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7684\u201c\u96d9\u5411\u201d\u9023\u7dda\u95dc\u4fc2\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u95dc\u4fc2\u201d\u3002
  • \u5728\u6709\u5411\u5716\u4e2d\uff0c\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u5169\u500b\u65b9\u5411\u7684\u908a\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u95dc\u6ce8\u201d\u8207\u201c\u88ab\u95dc\u6ce8\u201d\u95dc\u4fc2\u3002

\u5716 9-2 \u00a0 \u6709\u5411\u5716\u8207\u7121\u5411\u5716

\u6839\u64da\u6240\u6709\u9802\u9ede\u662f\u5426\u9023\u901a\uff0c\u53ef\u5206\u70ba\u9023\u901a\u5716\uff08connected graph\uff09\u548c\u975e\u9023\u901a\u5716\uff08disconnected graph\uff09\uff0c\u5982\u5716 9-3 \u6240\u793a\u3002

  • \u5c0d\u65bc\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u53ef\u4ee5\u5230\u9054\u5176\u9918\u4efb\u610f\u9802\u9ede\u3002
  • \u5c0d\u65bc\u975e\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002

\u5716 9-3 \u00a0 \u9023\u901a\u5716\u8207\u975e\u9023\u901a\u5716

\u6211\u5011\u9084\u53ef\u4ee5\u70ba\u908a\u65b0\u589e\u201c\u6b0a\u91cd\u201d\u8b8a\u6578\uff0c\u5f9e\u800c\u5f97\u5230\u5982\u5716 9-4 \u6240\u793a\u7684\u6709\u6b0a\u5716\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u69ae\u8000\u300b\u7b49\u624b\u904a\u4e2d\uff0c\u7cfb\u7d71\u6703\u6839\u64da\u5171\u540c\u904a\u6232\u6642\u9593\u4f86\u8a08\u7b97\u73a9\u5bb6\u4e4b\u9593\u7684\u201c\u89aa\u5bc6\u5ea6\u201d\uff0c\u9019\u7a2e\u89aa\u5bc6\u5ea6\u7db2\u8def\u5c31\u53ef\u4ee5\u7528\u6709\u6b0a\u5716\u4f86\u8868\u793a\u3002

\u5716 9-4 \u00a0 \u6709\u6b0a\u5716\u8207\u7121\u6b0a\u5716

\u5716\u8cc7\u6599\u7d50\u69cb\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u8853\u8a9e\u3002

  • \u9130\u63a5\uff08adjacency\uff09\uff1a\u7576\u5169\u9802\u9ede\u4e4b\u9593\u5b58\u5728\u908a\u76f8\u9023\u6642\uff0c\u7a31\u9019\u5169\u9802\u9ede\u201c\u9130\u63a5\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u9802\u9ede 1 \u7684\u9130\u63a5\u9802\u9ede\u70ba\u9802\u9ede 2\u30013\u30015\u3002
  • \u8def\u5f91\uff08path\uff09\uff1a\u5f9e\u9802\u9ede A \u5230\u9802\u9ede B \u7d93\u904e\u7684\u908a\u69cb\u6210\u7684\u5e8f\u5217\u88ab\u7a31\u70ba\u5f9e A \u5230 B \u7684\u201c\u8def\u5f91\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u908a\u5e8f\u5217 1-5-2-4 \u662f\u9802\u9ede 1 \u5230\u9802\u9ede 4 \u7684\u4e00\u689d\u8def\u5f91\u3002
  • \u5ea6\uff08degree\uff09\uff1a\u4e00\u500b\u9802\u9ede\u64c1\u6709\u7684\u908a\u6578\u3002\u5c0d\u65bc\u6709\u5411\u5716\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u6307\u5411\u8a72\u9802\u9ede\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u5f9e\u8a72\u9802\u9ede\u6307\u51fa\u3002
"},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u5716\u7684\u8868\u793a","text":"

\u5716\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u7121\u5411\u5716\u9032\u884c\u8209\u4f8b\u3002

"},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u9130\u63a5\u77e9\u9663","text":"

\u8a2d\u5716\u7684\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u9130\u63a5\u77e9\u9663\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u662f\u5426\u5b58\u5728\u908a\u3002

\u5982\u5716 9-5 \u6240\u793a\uff0c\u8a2d\u9130\u63a5\u77e9\u9663\u70ba \\(M\\)\u3001\u9802\u9ede\u4e32\u5217\u70ba \\(V\\) \uff0c\u90a3\u9ebc\u77e9\u9663\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9802\u9ede \\(V[i]\\) \u5230\u9802\u9ede \\(V[j]\\) \u4e4b\u9593\u5b58\u5728\u908a\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7121\u908a\u3002

\u5716 9-5 \u00a0 \u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a

\u9130\u63a5\u77e9\u9663\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u56e0\u6b64\u9130\u63a5\u77e9\u9663\u4e3b\u5c0d\u89d2\u7dda\u5143\u7d20\u6c92\u6709\u610f\u7fa9\u3002
  • \u5c0d\u65bc\u7121\u5411\u5716\uff0c\u5169\u500b\u65b9\u5411\u7684\u908a\u7b49\u50f9\uff0c\u6b64\u6642\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\u3002
  • \u5c07\u9130\u63a5\u77e9\u9663\u7684\u5143\u7d20\u5f9e \\(1\\) \u548c \\(0\\) \u66ff\u63db\u70ba\u6b0a\u91cd\uff0c\u5247\u53ef\u8868\u793a\u6709\u6b0a\u5716\u3002

\u4f7f\u7528\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u8a2a\u554f\u77e9\u9663\u5143\u7d20\u4ee5\u7372\u53d6\u908a\uff0c\u56e0\u6b64\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9663\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u8a18\u61b6\u9ad4\u4f54\u7528\u8f03\u591a\u3002

"},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u9130\u63a5\u8868","text":"

\u9130\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u8868\u793a\u9802\u9ede\u3002\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff08\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u9802\u9ede\uff09\u3002\u5716 9-6 \u5c55\u793a\u4e86\u4e00\u500b\u4f7f\u7528\u9130\u63a5\u8868\u5132\u5b58\u7684\u5716\u7684\u793a\u4f8b\u3002

\u5716 9-6 \u00a0 \u5716\u7684\u9130\u63a5\u8868\u8868\u793a

\u9130\u63a5\u8868\u50c5\u5132\u5b58\u5be6\u969b\u5b58\u5728\u7684\u908a\uff0c\u800c\u908a\u7684\u7e3d\u6578\u901a\u5e38\u9060\u5c0f\u65bc \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002\u7136\u800c\uff0c\u5728\u9130\u63a5\u8868\u4e2d\u9700\u8981\u900f\u904e\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u5176\u6642\u9593\u6548\u7387\u4e0d\u5982\u9130\u63a5\u77e9\u9663\u3002

\u89c0\u5bdf\u5716 9-6 \uff0c\u9130\u63a5\u8868\u7d50\u69cb\u8207\u96dc\u6e4a\u8868\u4e2d\u7684\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u5011\u4e5f\u53ef\u4ee5\u63a1\u7528\u985e\u4f3c\u7684\u65b9\u6cd5\u4f86\u6700\u4f73\u5316\u6548\u7387\u3002\u6bd4\u5982\u7576\u93c8\u7d50\u4e32\u5217\u8f03\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u6548\u7387\u5f9e \\(O(n)\\) \u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u9084\u53ef\u4ee5\u628a\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

"},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u5716\u7684\u5e38\u898b\u61c9\u7528","text":"

\u5982\u8868 9-1 \u6240\u793a\uff0c\u8a31\u591a\u73fe\u5be6\u7cfb\u7d71\u53ef\u4ee5\u7528\u5716\u4f86\u5efa\u6a21\uff0c\u76f8\u61c9\u7684\u554f\u984c\u4e5f\u53ef\u4ee5\u7d04\u5316\u70ba\u5716\u8a08\u7b97\u554f\u984c\u3002

\u8868 9-1 \u00a0 \u73fe\u5be6\u751f\u6d3b\u4e2d\u5e38\u898b\u7684\u5716

\u9802\u9ede \u908a \u5716\u8a08\u7b97\u554f\u984c \u793e\u4ea4\u7db2\u8def \u4f7f\u7528\u8005 \u597d\u53cb\u95dc\u4fc2 \u6f5b\u5728\u597d\u53cb\u63a8\u85a6 \u5730\u9435\u7dda\u8def \u7ad9\u9ede \u7ad9\u9ede\u9593\u7684\u9023\u901a\u6027 \u6700\u77ed\u8def\u7dda\u63a8\u85a6 \u592a\u967d\u7cfb \u661f\u9ad4 \u661f\u9ad4\u9593\u7684\u842c\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8ecc\u9053\u8a08\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u5716\u7684\u57fa\u790e\u64cd\u4f5c","text":"

\u5716\u7684\u57fa\u790e\u64cd\u4f5c\u53ef\u5206\u70ba\u5c0d\u201c\u908a\u201d\u7684\u64cd\u4f5c\u548c\u5c0d\u201c\u9802\u9ede\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u5169\u7a2e\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5be6\u73fe\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

"},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u7684\u5be6\u73fe","text":"

\u7d66\u5b9a\u4e00\u500b\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \u7684\u7121\u5411\u5716\uff0c\u5247\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u5f0f\u5982\u5716 9-7 \u6240\u793a\u3002

  • \u65b0\u589e\u6216\u522a\u9664\u908a\uff1a\u76f4\u63a5\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u800c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u9700\u8981\u540c\u6642\u66f4\u65b0\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u7684\u5c3e\u90e8\u65b0\u589e\u4e00\u884c\u4e00\u5217\uff0c\u4e26\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u522a\u9664\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u4e00\u884c\u4e00\u5217\u3002\u7576\u522a\u9664\u9996\u884c\u9996\u5217\u6642\u9054\u5230\u6700\u5dee\u60c5\u6cc1\uff0c\u9700\u8981\u5c07 \\((n-1)^2\\) \u500b\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52d5\u201d\uff0c\u5f9e\u800c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u521d\u59cb\u5316\uff1a\u50b3\u5165 \\(n\\) \u500b\u9802\u9ede\uff0c\u521d\u59cb\u5316\u9577\u5ea6\u70ba \\(n\\) \u7684\u9802\u9ede\u4e32\u5217 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u9130\u63a5\u77e9\u9663 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
\u521d\u59cb\u5316\u9130\u63a5\u77e9\u9663\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

\u5716 9-7 \u00a0 \u9130\u63a5\u77e9\u9663\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

\u4ee5\u4e0b\u662f\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
class GraphAdjMat:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u65b0\u589e\u9802\u9ede\n        for val in vertices:\n            self.add_vertex(val)\n        # \u65b0\u589e\u908a\n        # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        n = self.size()\n        # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u522a\u9664\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u5217\u5370\u9130\u63a5\u77e9\u9663\"\"\"\n        print(\"\u9802\u9ede\u4e32\u5217 =\", self.vertices)\n        print(\"\u9130\u63a5\u77e9\u9663 =\")\n        print_matrix(self.adj_mat)\n
graph_adjacency_matrix.cpp
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    void print() {\n        cout << \"\u9802\u9ede\u4e32\u5217 = \";\n        printVector(vertices);\n        cout << \"\u9130\u63a5\u77e9\u9663 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
graph_adjacency_matrix.java
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void print() {\n        System.out.print(\"\u9802\u9ede\u4e32\u5217 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.cs
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void Print() {\n        Console.Write(\"\u9802\u9ede\u4e32\u5217 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
graph_adjacency_matrix.go
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjMat struct {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vertices []int\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u65b0\u589e\u9802\u9ede\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u5716\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9802\u9ede\u4e32\u5217 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u9130\u63a5\u77e9\u9663 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
graph_adjacency_matrix.swift
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.append(val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    func print() {\n        Swift.print(\"\u9802\u9ede\u4e32\u5217 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u9130\u63a5\u77e9\u9663 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
graph_adjacency_matrix.js
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print() {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.ts
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices: number[]; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print(): void {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
graph_adjacency_matrix.dart
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9802\u9ede\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u65b0\u589e\u9802\u9ede\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    vertices.add(val);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    vertices.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u65b0\u589e\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u522a\u9664\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n  void printAdjMat() {\n    print(\"\u9802\u9ede\u4e32\u5217 = $vertices\");\n    print(\"\u9130\u63a5\u77e9\u9663 = \");\n    printMatrix(adjMat);\n  }\n}\n
graph_adjacency_matrix.rs
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjMat {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    pub fn print(&self) {\n        println!(\"\u9802\u9ede\u4e32\u5217 = {:?}\", self.vertices);\n        println!(\"\u9130\u63a5\u77e9\u9663 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
graph_adjacency_matrix.c
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u5efa\u69cb\u5b50 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u5716\u7684\u9802\u9ede\u6578\u91cf\u5df2\u9054\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u65b0\u589e\u7b2c n \u500b\u9802\u9ede\uff0c\u4e26\u5c07\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9802\u9ede\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u908a\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u908a\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9802\u9ede\u4e32\u5217 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u9130\u63a5\u77e9\u9663 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
graph_adjacency_matrix.kt
/* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u9802\u9ede\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    fun print() {\n        print(\"\u9802\u9ede\u4e32\u5217 = \")\n        println(vertices)\n        println(\"\u9130\u63a5\u77e9\u9663 =\")\n        printMatrix(adjMat)\n    }\n}\n
graph_adjacency_matrix.rb
### \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u5efa\u69cb\u5b50 ###\n    # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @vertices = []\n    # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u65b0\u589e\u9802\u9ede\n    vertices.each { |val| add_vertex(val) }\n    # \u65b0\u589e\u908a\n    # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    @vertices << val\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    @vertices.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(i, j)\n    # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(i, j)\n    # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u77e9\u9663 ###\n  def __print__\n    puts \"\u9802\u9ede\u4e32\u5217 = #{@vertices}\"\n    puts '\u9130\u63a5\u77e9\u9663 ='\n    print_matrix(@adj_mat)\n  end\nend\n
graph_adjacency_matrix.zig
[class]{GraphAdjMat}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u65bc\u9130\u63a5\u8868\u7684\u5be6\u73fe","text":"

\u8a2d\u7121\u5411\u5716\u7684\u9802\u9ede\u7e3d\u6578\u70ba \\(n\\)\u3001\u908a\u7e3d\u6578\u70ba \\(m\\) \uff0c\u5247\u53ef\u6839\u64da\u5716 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5be6\u73fe\u5404\u7a2e\u64cd\u4f5c\u3002

  • \u65b0\u589e\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u7684\u672b\u5c3e\u65b0\u589e\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u70ba\u662f\u7121\u5411\u5716\uff0c\u6240\u4ee5\u9700\u8981\u540c\u6642\u65b0\u589e\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u522a\u9664\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u4e26\u522a\u9664\u6307\u5b9a\u908a\uff0c\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\u3002\u5728\u7121\u5411\u5716\u4e2d\uff0c\u9700\u8981\u540c\u6642\u522a\u9664\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
  • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u4e26\u5c07\u65b0\u589e\u9802\u9ede\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
  • \u522a\u9664\u9802\u9ede\uff1a\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u522a\u9664\u5305\u542b\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
  • \u521d\u59cb\u5316\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u5efa\u7acb \\(n\\) \u500b\u9802\u9ede\u548c \\(2m\\) \u689d\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
\u521d\u59cb\u5316\u9130\u63a5\u8868\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

\u5716 9-8 \u00a0 \u9130\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

\u4ee5\u4e0b\u662f\u9130\u63a5\u8868\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u6bd4\u5716 9-8 \uff0c\u5be6\u969b\u7a0b\u5f0f\u78bc\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

  • \u70ba\u4e86\u65b9\u4fbf\u65b0\u589e\u8207\u522a\u9664\u9802\u9ede\uff0c\u4ee5\u53ca\u7c21\u5316\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f86\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\u3002
  • \u4f7f\u7528\u96dc\u6e4a\u8868\u4f86\u5132\u5b58\u9130\u63a5\u8868\uff0ckey \u70ba\u9802\u9ede\u4f8b\u9805\uff0cvalue \u70ba\u8a72\u9802\u9ede\u7684\u9130\u63a5\u9802\u9ede\u4e32\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002

\u53e6\u5916\uff0c\u6211\u5011\u5728\u9130\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u985e\u5225\u4f86\u8868\u793a\u9802\u9ede\uff0c\u9019\u6a23\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u8207\u9130\u63a5\u77e9\u9663\u4e00\u6a23\uff0c\u7528\u4e32\u5217\u7d22\u5f15\u4f86\u5340\u5206\u4e0d\u540c\u9802\u9ede\uff0c\u90a3\u9ebc\u5047\u8a2d\u8981\u522a\u9664\u7d22\u5f15\u70ba \\(i\\) \u7684\u9802\u9ede\uff0c\u5247\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u5c07\u6240\u6709\u5927\u65bc \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u6e1b \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u500b\u9802\u9ede\u90fd\u662f\u552f\u4e00\u7684 Vertex \u4f8b\u9805\uff0c\u522a\u9664\u67d0\u4e00\u9802\u9ede\u4e4b\u5f8c\u5c31\u7121\u9808\u6539\u52d5\u5176\u4ed6\u9802\u9ede\u4e86\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
class GraphAdjList:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u65b0\u589e\u908a vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u522a\u9664\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u522a\u9664\u908a vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.pop(vet)\n        # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u9130\u63a5\u8868\"\"\"\n        print(\"\u9130\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
graph_adjacency_list.cpp
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  public:\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u522a\u9664\u6307\u5b9a\u7bc0\u9ede */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u522a\u9664\u908a vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.erase(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    void print() {\n        cout << \"\u9130\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
graph_adjacency_list.java
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u9130\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
graph_adjacency_list.cs
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.Add(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.Remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u9130\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
graph_adjacency_list.go
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjList struct {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList map[Vertex][]Vertex\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u65b0\u589e\u908a */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u65b0\u589e\u908a vet1 - vet2, \u65b0\u589e\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u522a\u9664\u908a */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    delete(g.adjList, vet)\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u5217\u5370\u9130\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u9130\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
graph_adjacency_list.swift
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u5efa\u69cb\u5b50 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u65b0\u589e\u908a */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = []\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.removeValue(forKey: vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u9130\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
graph_adjacency_list.js
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print() {\n        console.log('\u9130\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.ts
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print(): void {\n        console.log('\u9130\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
graph_adjacency_list.dart
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u65b0\u589e\u908a */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u65b0\u589e\u908a vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u522a\u9664\u908a */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    adjList[vet] = [];\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    adjList.remove(vet);\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u9130\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
graph_adjacency_list.rs
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.remove(&vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u9130\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
graph_adjacency_list.c
/* \u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9802\u9ede\n    struct AdjListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n} AdjListNode;\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u65b0\u589e\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u982d\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u522a\u9664\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u641c\u7d22 vet \u5c0d\u61c9\u7bc0\u9ede\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c07 vet \u5c0d\u61c9\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\n    pre->next = cur->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(cur);\n}\n\n/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u7bc0\u9ede\u9663\u5217\n    int size;                     // \u7bc0\u9ede\u6578\u91cf\n} GraphAdjList;\n\n/* \u5efa\u69cb\u5b50 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u65b0\u589e\u908a */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u65b0\u589e\u908a vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u522a\u9664\u908a */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u522a\u9664\u908a vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    graph->heads[graph->size++] = head;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c07\u8a72\u9802\u9ede\u4e4b\u5f8c\u7684\u9802\u9ede\u5411\u524d\u79fb\u52d5\uff0c\u4ee5\u586b\u88dc\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
graph_adjacency_list.kt
/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u65b0\u589e\u908a */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    fun print() {\n        println(\"\u9130\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
graph_adjacency_list.rb
### \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(edges)\n    # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    @adj_list = {}\n    # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u522a\u9664\u908a vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    @adj_list[vet] = []\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    @adj_list.delete(vet)\n    # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u8868 ###\n  def __print__\n    puts '\u9130\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
graph_adjacency_list.zig
[class]{GraphAdjList}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5c0d\u6bd4","text":"

\u8a2d\u5716\u4e2d\u5171\u6709 \\(n\\) \u500b\u9802\u9ede\u548c \\(m\\) \u689d\u908a\uff0c\u8868 9-2 \u5c0d\u6bd4\u4e86\u9130\u63a5\u77e9\u9663\u548c\u9130\u63a5\u8868\u7684\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u3002

\u8868 9-2 \u00a0 \u9130\u63a5\u77e9\u9663\u8207\u9130\u63a5\u8868\u5c0d\u6bd4

\u9130\u63a5\u77e9\u9663 \u9130\u63a5\u8868\uff08\u93c8\u7d50\u4e32\u5217\uff09 \u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09 \u5224\u65b7\u662f\u5426\u9130\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u908a \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u908a \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u9802\u9ede \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u9802\u9ede \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u8a18\u61b6\u9ad4\u7a7a\u9593\u4f54\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

\u89c0\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09\u7684\u6642\u9593\u6548\u7387\u8207\u7a7a\u9593\u6548\u7387\u6700\u512a\u3002\u4f46\u5be6\u969b\u4e0a\uff0c\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u64cd\u4f5c\u908a\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u9663\u5217\u8a2a\u554f\u6216\u8ce6\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7d9c\u5408\u4f86\u770b\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u7684\u539f\u5247\uff0c\u800c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u7684\u539f\u5247\u3002

"},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u5716\u7684\u8d70\u8a2a","text":"

\u6a39\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5c0d\u591a\u201d\u7684\u95dc\u4fc2\uff0c\u800c\u5716\u5247\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5c0d\u591a\u201d\u95dc\u4fc2\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u6a39\u770b\u4f5c\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\u3002\u986f\u7136\uff0c\u6a39\u7684\u8d70\u8a2a\u64cd\u4f5c\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u64cd\u4f5c\u7684\u4e00\u7a2e\u7279\u4f8b\u3002

\u5716\u548c\u6a39\u90fd\u9700\u8981\u61c9\u7528\u641c\u7d22\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u8d70\u8a2a\u64cd\u4f5c\u3002\u5716\u7684\u8d70\u8a2a\u65b9\u5f0f\u4e5f\u53ef\u5206\u70ba\u5169\u7a2e\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u548c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

"},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u5f9e\u67d0\u500b\u7bc0\u9ede\u51fa\u767c\uff0c\u59cb\u7d42\u512a\u5148\u8a2a\u554f\u8ddd\u96e2\u6700\u8fd1\u7684\u9802\u9ede\uff0c\u4e26\u4e00\u5c64\u5c64\u5411\u5916\u64f4\u5f35\u3002\u5982\u5716 9-9 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u9996\u5148\u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e0b\u4e00\u500b\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8a2a\u554f\u5b8c\u7562\u3002

\u5716 9-9 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a

"},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

BFS \u901a\u5e38\u85c9\u52a9\u4f47\u5217\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\u3002\u4f47\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8cea\uff0c\u9019\u8207 BFS \u7684\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u601d\u60f3\u7570\u66f2\u540c\u5de5\u3002

  1. \u5c07\u8d70\u8a2a\u8d77\u59cb\u9802\u9ede startVet \u52a0\u5165\u5217\u5217\uff0c\u4e26\u958b\u555f\u8ff4\u5708\u3002
  2. \u5728\u8ff4\u5708\u7684\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\uff0c\u5f48\u51fa\u4f47\u5217\u9996\u9802\u9ede\u4e26\u8a18\u9304\u8a2a\u554f\uff0c\u7136\u5f8c\u5c07\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u52a0\u5165\u5230\u4f47\u5217\u5c3e\u90e8\u3002
  3. \u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u76f4\u5230\u6240\u6709\u9802\u9ede\u88ab\u8a2a\u554f\u5b8c\u7562\u5f8c\u7d50\u675f\u3002

\u70ba\u4e86\u9632\u6b62\u91cd\u8907\u8d70\u8a2a\u9802\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

Tip

\u96dc\u6e4a\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u53ea\u5132\u5b58 key \u800c\u4e0d\u5132\u5b58 value \u7684\u96dc\u6e4a\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u9032\u884c key \u7684\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u64da key \u7684\u552f\u4e00\u6027\uff0c\u96dc\u6e4a\u96c6\u5408\u901a\u5e38\u7528\u65bc\u8cc7\u6599\u53bb\u91cd\u7b49\u5834\u666f\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]([start_vet])\n    # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while len(que) > 0:\n        vet = que.popleft()  # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.append(adj_vet)  # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adj_vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n
graph_bfs.cpp
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited = {startVet};\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push_back(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.push(adjVet);        // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.emplace(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.java
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet);            // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.cs
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [startVet];\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.Add(vet);               // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.Add(adjVet);   // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.go
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS, \u4f7f\u7528\u5207\u7247\u6a21\u64ec\u4f47\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    for len(queue) > 0 {\n        // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        res = append(res, vet)\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.swift
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = [startVet]\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.append(adjVet) // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.insert(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.js
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.ts
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
graph_bfs.dart
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      }\n      que.add(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    }\n  }\n  // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  return res;\n}\n
graph_bfs.rs
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited.insert(adj_vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res\n}\n
graph_bfs.c
/* \u7bc0\u9ede\u4f47\u5217\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u5efa\u69cb\u5b50 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u5217\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u5217\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res[(*resSize)++] = vet;      // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited[(*visitedSize)++] = node->vertex; // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n            node = node->next;\n        }\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(queue);\n}\n
graph_bfs.kt
/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet)         // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet)   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_bfs.rb
### \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new([start_vet])\n  # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  que = [start_vet]\n  # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while que.length > 0\n    vet = que.shift # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res << vet # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      que << adj_vet # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adj_vet) # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    end\n  end\n  # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res\nend\n
graph_bfs.zig
[class]{}-[func]{graphBFS}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7a0b\u5f0f\u78bc\u76f8\u5c0d\u62bd\u8c61\uff0c\u5efa\u8b70\u5c0d\u7167\u5716 9-10 \u4f86\u52a0\u6df1\u7406\u89e3\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 9-10 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u4e0d\u552f\u4e00\u3002\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u9806\u5e8f\u8d70\u8a2a\uff0c\u800c\u591a\u500b\u76f8\u540c\u8ddd\u96e2\u7684\u9802\u9ede\u7684\u8d70\u8a2a\u9806\u5e8f\u5141\u8a31\u88ab\u4efb\u610f\u6253\u4e82\u3002\u4ee5\u5716 9-10 \u70ba\u4f8b\uff0c\u9802\u9ede \\(1\\)\u3001\\(3\\) \u7684\u8a2a\u554f\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\uff0c\u9802\u9ede \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8a2a\u554f\u9806\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u63db\u3002

"},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u5165\u5217\u4e26\u51fa\u968a\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u5728\u8d70\u8a2a\u9130\u63a5\u9802\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u96c6\u5408 visited \uff0c\u4f47\u5217 que \u4e2d\u7684\u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

"},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u518d\u56de\u982d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002\u5982\u5716 9-11 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u7576\u524d\u9802\u9ede\u7684\u67d0\u500b\u9130\u63a5\u9802\u9ede\uff0c\u76f4\u5230\u8d70\u5230\u76e1\u982d\u6642\u8fd4\u56de\uff0c\u518d\u7e7c\u7e8c\u8d70\u5230\u76e1\u982d\u4e26\u8fd4\u56de\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8d70\u8a2a\u5b8c\u6210\u3002

\u5716 9-11 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a

"},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

\u9019\u7a2e\u201c\u8d70\u5230\u76e1\u982d\u518d\u8fd4\u56de\u201d\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u5728\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4e2d\uff0c\u6211\u5011\u4e5f\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u96c6\u5408 visited \u4f86\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\uff0c\u4ee5\u907f\u514d\u91cd\u8907\u8a2a\u554f\u9802\u9ede\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f\"\"\"\n    res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
graph_dfs.cpp
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.emplace(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.java
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.cs
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.Add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede                             \n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.go
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u6703\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u9808\u8b93\u539f\u5f15\u7528\u91cd\u65b0\u8ce6\u503c\u70ba\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
graph_dfs.swift
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
graph_dfs.js
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.ts
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
graph_dfs.dart
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    }\n    // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
graph_dfs.rs
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n                         // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
graph_dfs.c
/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    res[(*resSize)++] = vet;\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
graph_dfs.kt
/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
graph_dfs.rb
### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet) # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  # \u96dc\u6e4a\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
graph_dfs.zig
[class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 9-12 \u6240\u793a\u3002

  • \u76f4\u865b\u7dda\u4ee3\u8868\u5411\u4e0b\u905e\u63a8\uff0c\u8868\u793a\u958b\u555f\u4e86\u4e00\u500b\u65b0\u7684\u905e\u8ff4\u65b9\u6cd5\u4f86\u8a2a\u554f\u65b0\u9802\u9ede\u3002
  • \u66f2\u865b\u7dda\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u905e\u8ff4\u65b9\u6cd5\u5df2\u7d93\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u958b\u555f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

\u70ba\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8b70\u5c07\u5716 9-12 \u8207\u7a0b\u5f0f\u78bc\u7d50\u5408\u8d77\u4f86\uff0c\u5728\u8166\u4e2d\u6a21\u64ec\uff08\u6216\u8005\u7528\u7b46\u756b\u4e0b\u4f86\uff09\u6574\u500b DFS \u904e\u7a0b\uff0c\u5305\u62ec\u6bcf\u500b\u905e\u8ff4\u65b9\u6cd5\u4f55\u6642\u958b\u555f\u3001\u4f55\u6642\u8fd4\u56de\u3002

<1><2><3><4><5><6><7><8><9><10><11>

\u5716 9-12 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5e8f\u5217\u7684\u9806\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7d66\u5b9a\u67d0\u9802\u9ede\uff0c\u5148\u5f80\u54ea\u500b\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u9130\u63a5\u9802\u9ede\u7684\u9806\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e82\uff0c\u90fd\u662f\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

\u4ee5\u6a39\u7684\u8d70\u8a2a\u70ba\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\uff0c\u5b83\u5011\u5c55\u793a\u4e86\u4e09\u7a2e\u8d70\u8a2a\u512a\u5148\u9806\u5e8f\uff0c\u7136\u800c\u9019\u4e09\u8005\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

"},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u88ab\u8a2a\u554f \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u96c6\u5408 visited \u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u6700\u5927\u70ba \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

"},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5716\u7531\u9802\u9ede\u548c\u908a\u7d44\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede\u548c\u4e00\u7d44\u908a\u69cb\u6210\u7684\u96c6\u5408\u3002
  • \u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002
  • \u6709\u5411\u5716\u7684\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u9023\u901a\u5716\u4e2d\u7684\u4efb\u610f\u9802\u9ede\u5747\u53ef\u9054\uff0c\u6709\u6b0a\u5716\u7684\u6bcf\u689d\u908a\u90fd\u5305\u542b\u6b0a\u91cd\u8b8a\u6578\u3002
  • \u9130\u63a5\u77e9\u9663\u5229\u7528\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u6709\u908a\u6216\u7121\u908a\u3002\u9130\u63a5\u77e9\u9663\u5728\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u9593\u4f54\u7528\u8f03\u591a\u3002
  • \u9130\u63a5\u8868\u4f7f\u7528\u591a\u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u3002\u9130\u63a5\u8868\u76f8\u5c0d\u65bc\u9130\u63a5\u77e9\u9663\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\uff0c\u4f46\u7531\u65bc\u9700\u8981\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u6642\u9593\u6548\u7387\u8f03\u4f4e\u3002
  • \u7576\u9130\u63a5\u8868\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u5176\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u6216\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002
  • \u5f9e\u6f14\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff0c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002
  • \u5716\u53ef\u7528\u65bc\u5efa\u6a21\u5404\u985e\u73fe\u5be6\u7cfb\u7d71\uff0c\u5982\u793e\u4ea4\u7db2\u8def\u3001\u5730\u9435\u7dda\u8def\u7b49\u3002
  • \u6a39\u662f\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\uff0c\u6a39\u7684\u8d70\u8a2a\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u7684\u4e00\u7a2e\u7279\u4f8b\u3002
  • \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u3001\u5c64\u5c64\u64f4\u5f35\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u901a\u5e38\u85c9\u52a9\u4f47\u5217\u5be6\u73fe\u3002
  • \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u6642\u518d\u56de\u6eaf\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
"},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8def\u5f91\u7684\u5b9a\u7fa9\u662f\u9802\u9ede\u5e8f\u5217\u9084\u662f\u908a\u5e8f\u5217\uff1f

\u7dad\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8a9e\u8a00\u7248\u672c\u7684\u5b9a\u7fa9\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u908a\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

\u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f91\u88ab\u8996\u70ba\u4e00\u500b\u908a\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u3002\u9019\u662f\u56e0\u70ba\u5169\u500b\u9802\u9ede\u4e4b\u9593\u53ef\u80fd\u5b58\u5728\u591a\u689d\u908a\u9023\u7dda\uff0c\u6b64\u6642\u6bcf\u689d\u908a\u90fd\u5c0d\u61c9\u4e00\u689d\u8def\u5f91\u3002

Q\uff1a\u975e\u9023\u901a\u5716\u4e2d\u662f\u5426\u6703\u6709\u7121\u6cd5\u8d70\u8a2a\u5230\u7684\u9ede\uff1f

\u5728\u975e\u9023\u901a\u5716\u4e2d\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002\u8d70\u8a2a\u975e\u9023\u901a\u5716\u9700\u8981\u8a2d\u5b9a\u591a\u500b\u8d77\u9ede\uff0c\u4ee5\u8d70\u8a2a\u5230\u5716\u7684\u6240\u6709\u9023\u901a\u5206\u91cf\u3002

Q\uff1a\u5728\u9130\u63a5\u8868\u4e2d\uff0c\u201c\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u6240\u6709\u9802\u9ede\u201d\u7684\u9802\u9ede\u9806\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

\u53ef\u4ee5\u662f\u4efb\u610f\u9806\u5e8f\u3002\u4f46\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u898f\u5247\u4f86\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9802\u9ede\u65b0\u589e\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9802\u9ede\u503c\u5927\u5c0f\u7684\u9806\u5e8f\u7b49\uff0c\u9019\u6a23\u6709\u52a9\u65bc\u5feb\u901f\u67e5\u8a62\u201c\u5e36\u6709\u67d0\u7a2e\u6975\u503c\u201d\u7684\u9802\u9ede\u3002

"},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8caa\u5a6a","text":"

Abstract

\u5411\u65e5\u8475\u671d\u8457\u592a\u967d\u8f49\u52d5\uff0c\u6642\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u9577\u7684\u6700\u5927\u53ef\u80fd\u3002

\u8caa\u5a6a\u7b56\u7565\u5728\u4e00\u8f2a\u8f2a\u7684\u7c21\u55ae\u9078\u64c7\u4e2d\uff0c\u9010\u6b65\u5c0e\u5411\u6700\u4f73\u7b54\u6848\u3002

"},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5
  • 15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c
  • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c
  • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c
  • 15.5 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c","text":"

Question

\u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u50f9\u503c\u6839\u64da\u9078\u64c7\u7684\u91cd\u91cf\u6bd4\u4f8b\u8a08\u7b97\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 15-3 \u6240\u793a\u3002

\u5716 15-3 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

\u5206\u6578\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u6574\u9ad4\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72c0\u614b\u5305\u542b\u7576\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6a19\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u50f9\u503c\u3002

\u4e0d\u540c\u9ede\u5728\u65bc\uff0c\u672c\u984c\u5141\u8a31\u53ea\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u5716 15-4 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u7269\u54c1\u4efb\u610f\u5730\u9032\u884c\u5207\u5206\uff0c\u4e26\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u4f86\u8a08\u7b97\u76f8\u61c9\u50f9\u503c\u3002

  1. \u5c0d\u65bc\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c\u70ba \\(val[i-1] / wgt[i-1]\\) \uff0c\u7c21\u7a31\u55ae\u4f4d\u50f9\u503c\u3002
  2. \u5047\u8a2d\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u70ba \\(w\\) \uff0c\u5247\u80cc\u5305\u589e\u52a0\u7684\u50f9\u503c\u70ba \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

\u5716 15-4 \u00a0 \u7269\u54c1\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c

"},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u6700\u5927\u5316\u80cc\u5305\u5167\u7269\u54c1\u7e3d\u50f9\u503c\uff0c\u672c\u8cea\u4e0a\u662f\u6700\u5927\u5316\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u50f9\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u5716 15-5 \u6240\u793a\u7684\u8caa\u5a6a\u7b56\u7565\u3002

  1. \u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\u3002
  2. \u8d70\u8a2a\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f2a\u8caa\u5a6a\u5730\u9078\u64c7\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
  3. \u82e5\u5269\u9918\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u4f7f\u7528\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6eff\u80cc\u5305\u3002

\u5716 15-5 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565

"},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u6211\u5011\u5efa\u7acb\u4e86\u4e00\u500b\u7269\u54c1\u985e\u5225 Item \uff0c\u4ee5\u4fbf\u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u9032\u884c\u6392\u5e8f\u3002\u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u7576\u80cc\u5305\u5df2\u6eff\u6642\u8df3\u51fa\u4e26\u8fd4\u56de\u89e3\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u50f9\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a\"\"\"\n    # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n    return res\n
fractional_knapsack.cpp
/* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.java
/* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.cs
/* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.go
/* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.swift
/* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u50f9\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.js
/* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u50f9\u503c\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.ts
/* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u50f9\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    return res;\n}\n
fractional_knapsack.dart
/* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u50f9\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n      break;\n    }\n  }\n  return res;\n}\n
fractional_knapsack.rs
/* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u50f9\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    res\n}\n
fractional_knapsack.c
/* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u50f9\u503c\n} Item;\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
fractional_knapsack.kt
/* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u50f9\u503c\n)\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
fractional_knapsack.rb
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
fractional_knapsack.zig
[class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u9700\u8981\u8d70\u8a2a\u6574\u500b\u7269\u54c1\u4e32\u5217\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u7269\u54c1\u6578\u91cf\u3002

\u7531\u65bc\u521d\u59cb\u5316\u4e86\u4e00\u500b Item \u7269\u4ef6\u4e32\u5217\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

"},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u63a1\u7528\u53cd\u8b49\u6cd5\u3002\u5047\u8a2d\u7269\u54c1 \\(x\\) \u662f\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u6f14\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u50f9\u503c\u70ba res \uff0c\u4f46\u8a72\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u73fe\u5728\u5f9e\u80cc\u5305\u4e2d\u62ff\u51fa\u55ae\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u4e26\u66ff\u63db\u70ba\u55ae\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u65bc\u7269\u54c1 \\(x\\) \u7684\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u63db\u5f8c\u7684\u7e3d\u50f9\u503c\u4e00\u5b9a\u5927\u65bc res \u3002\u9019\u8207 res \u662f\u6700\u512a\u89e3\u77db\u76fe\uff0c\u8aaa\u660e\u6700\u512a\u89e3\u4e2d\u5fc5\u9808\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

\u5c0d\u65bc\u8a72\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u69cb\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u7e3d\u800c\u8a00\u4e4b\uff0c\u55ae\u4f4d\u50f9\u503c\u66f4\u5927\u7684\u7269\u54c1\u7e3d\u662f\u66f4\u512a\u9078\u64c7\uff0c\u9019\u8aaa\u660e\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

\u5982\u5716 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c07\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u55ae\u4f4d\u50f9\u503c\u5206\u5225\u770b\u4f5c\u4e00\u5f35\u4e8c\u7dad\u5716\u8868\u7684\u6a6b\u8ef8\u548c\u7e31\u8ef8\uff0c\u5247\u5206\u6578\u80cc\u5305\u554f\u984c\u53ef\u8f49\u5316\u70ba\u201c\u6c42\u5728\u6709\u9650\u6a6b\u8ef8\u5340\u9593\u4e0b\u570d\u6210\u7684\u6700\u5927\u9762\u7a4d\u201d\u3002\u9019\u500b\u985e\u6bd4\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u5f9e\u5e7e\u4f55\u89d2\u5ea6\u7406\u89e3\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

\u5716 15-6 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u5e7e\u4f55\u8868\u793a

"},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u7684\u6f14\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u554f\u984c\u7684\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\uff0c\u90fd\u9078\u64c7\u7576\u524d\u770b\u8d77\u4f86\u6700\u512a\u7684\u9078\u64c7\uff0c\u5373\u8caa\u5a6a\u5730\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7c21\u6f54\u4e14\u9ad8\u6548\uff0c\u5728\u8a31\u591a\u5be6\u969b\u554f\u984c\u4e2d\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\u3002

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u548c\u52d5\u614b\u898f\u5283\u90fd\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u3002\u5b83\u5011\u4e4b\u9593\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u8655\uff0c\u6bd4\u5982\u90fd\u4f9d\u8cf4\u6700\u512a\u5b50\u7d50\u69cb\u6027\u8cea\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

  • \u52d5\u614b\u898f\u5283\u6703\u6839\u64da\u4e4b\u524d\u968e\u6bb5\u7684\u6240\u6709\u6c7a\u7b56\u4f86\u8003\u616e\u7576\u524d\u6c7a\u7b56\uff0c\u4e26\u4f7f\u7528\u904e\u53bb\u5b50\u554f\u984c\u7684\u89e3\u4f86\u69cb\u5efa\u7576\u524d\u5b50\u554f\u984c\u7684\u89e3\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u6703\u8003\u616e\u904e\u53bb\u7684\u6c7a\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u4e0d\u65b7\u7e2e\u5c0f\u554f\u984c\u7bc4\u570d\uff0c\u76f4\u81f3\u554f\u984c\u88ab\u89e3\u6c7a\u3002

\u6211\u5011\u5148\u900f\u904e\u4f8b\u984c\u201c\u96f6\u9322\u514c\u63db\u201d\u77ad\u89e3\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u9019\u9053\u984c\u5df2\u7d93\u5728\u201c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u76f8\u4fe1\u4f60\u5c0d\u5b83\u4e26\u4e0d\u964c\u751f\u3002

Question

\u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

\u672c\u984c\u63a1\u53d6\u7684\u8caa\u5a6a\u7b56\u7565\u5982\u5716 15-1 \u6240\u793a\u3002\u7d66\u5b9a\u76ee\u6a19\u91d1\u984d\uff0c\u6211\u5011\u8caa\u5a6a\u5730\u9078\u64c7\u4e0d\u5927\u65bc\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e63\uff0c\u4e0d\u65b7\u8ff4\u5708\u8a72\u6b65\u9a5f\uff0c\u76f4\u81f3\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u70ba\u6b62\u3002

\u5716 15-1 \u00a0 \u96f6\u9322\u514c\u63db\u7684\u8caa\u5a6a\u7b56\u7565

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a\"\"\"\n    # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
coin_change_greedy.cpp
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.java
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.cs
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.go
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
coin_change_greedy.swift
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
coin_change_greedy.js
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.ts
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
coin_change_greedy.dart
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9078\u64c7 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
coin_change_greedy.rs
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
coin_change_greedy.c
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
coin_change_greedy.kt
/* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
coin_change_greedy.rb
[class]{}-[func]{coin_change_greedy}\n
coin_change_greedy.zig
[class]{}-[func]{coinChangeGreedy}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u4f60\u53ef\u80fd\u6703\u4e0d\u7531\u5730\u767c\u51fa\u611f\u5606\uff1aSo clean \uff01\u8caa\u5a6a\u6f14\u7b97\u6cd5\u50c5\u7528\u7d04\u5341\u884c\u7a0b\u5f0f\u78bc\u5c31\u89e3\u6c7a\u4e86\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u64cd\u4f5c\u76f4\u63a5\u3001\u5be6\u73fe\u7c21\u55ae\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8a18\u786c\u5e63\u6700\u5c0f\u9762\u503c\u70ba \\(\\min(coins)\\) \uff0c\u5247\u8caa\u5a6a\u9078\u64c7\u6700\u591a\u8ff4\u5708 \\(amt / \\min(coins)\\) \u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(amt / \\min(coins))\\) \u3002\u9019\u6bd4\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u500b\u6578\u91cf\u7d1a\u3002

\u7136\u800c\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u9762\u503c\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u80fd\u627e\u5230\u6700\u512a\u89e3\u3002\u5716 15-2 \u7d66\u51fa\u4e86\u5169\u500b\u793a\u4f8b\u3002

  • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8a72\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u7d66\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3\u3002
  • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8a2d \\(amt = 60\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(11\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(20 + 20 + 20\\) \uff0c\u50c5\u9700 \\(3\\) \u679a\u786c\u5e63\u3002
  • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8a2d \\(amt = 98\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(49\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(49 + 49\\) \uff0c\u50c5\u9700 \\(2\\) \u679a\u786c\u5e63\u3002

\u5716 15-2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u627e\u51fa\u6700\u512a\u89e3\u7684\u793a\u4f8b

\u4e5f\u5c31\u662f\u8aaa\uff0c\u5c0d\u65bc\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u4fdd\u8b49\u627e\u5230\u5168\u57df\u6027\u6700\u512a\u89e3\uff0c\u4e26\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\u3002

\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u9069\u7528\u60c5\u6cc1\u5206\u4ee5\u4e0b\u5169\u7a2e\u3002

  1. \u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u5f80\u5f80\u662f\u6700\u512a\u9078\u64c7\uff0c\u56e0\u70ba\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u66f4\u9ad8\u6548\u3002
  2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5c0d\u65bc\u5f88\u591a\u8907\u96dc\u554f\u984c\u4f86\u8aaa\uff0c\u5c0b\u627e\u5168\u57df\u6027\u6700\u512a\u89e3\u975e\u5e38\u56f0\u96e3\uff0c\u80fd\u4ee5\u8f03\u9ad8\u6548\u7387\u627e\u5230\u6b21\u512a\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u932f\u7684\u3002
"},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u90a3\u9ebc\u554f\u984c\u4f86\u4e86\uff0c\u4ec0\u9ebc\u6a23\u7684\u554f\u984c\u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8aaa\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1f

\u76f8\u8f03\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u4f7f\u7528\u689d\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u95dc\u6ce8\u554f\u984c\u7684\u5169\u500b\u6027\u8cea\u3002

  • \u8caa\u5a6a\u9078\u64c7\u6027\u8cea\uff1a\u53ea\u6709\u7576\u5c40\u90e8\u6700\u512a\u9078\u64c7\u59cb\u7d42\u53ef\u4ee5\u5c0e\u81f4\u5168\u57df\u6027\u6700\u512a\u89e3\u6642\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u624d\u80fd\u4fdd\u8b49\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u6700\u512a\u5b50\u7d50\u69cb\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u5305\u542b\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u3002

\u6700\u512a\u5b50\u7d50\u69cb\u5df2\u7d93\u5728\u201c\u52d5\u614b\u898f\u5283\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u9019\u88e1\u4e0d\u518d\u8d05\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u554f\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\u4e26\u4e0d\u660e\u986f\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u6c7a\u3002

\u6211\u5011\u4e3b\u8981\u63a2\u7a76\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u5224\u65b7\u65b9\u6cd5\u3002\u96d6\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f03\u7c21\u55ae\uff0c\u4f46\u5be6\u969b\u4e0a\u5c0d\u65bc\u8a31\u591a\u554f\u984c\uff0c\u8b49\u660e\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4e26\u975e\u6613\u4e8b\u3002

\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u6211\u5011\u96d6\u7136\u80fd\u5920\u5bb9\u6613\u5730\u8209\u51fa\u53cd\u4f8b\uff0c\u5c0d\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u9032\u884c\u8b49\u507d\uff0c\u4f46\u8b49\u5be6\u7684\u96e3\u5ea6\u8f03\u5927\u3002\u5982\u679c\u554f\uff1a\u6eff\u8db3\u4ec0\u9ebc\u689d\u4ef6\u7684\u786c\u5e63\u7d44\u5408\u53ef\u4ee5\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u5011\u5f80\u5f80\u53ea\u80fd\u6191\u85c9\u76f4\u89ba\u6216\u8209\u4f8b\u5b50\u4f86\u7d66\u51fa\u4e00\u500b\u6a21\u7a1c\u5169\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96e3\u4ee5\u7d66\u51fa\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\u3002

Quote

\u6709\u4e00\u7bc7\u8ad6\u6587\u7d66\u51fa\u4e86\u4e00\u500b \\(O(n^3)\\) \u6642\u9593\u8907\u96dc\u5ea6\u7684\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u5224\u65b7\u4e00\u500b\u786c\u5e63\u7d44\u5408\u80fd\u5426\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u984d\u7684\u6700\u512a\u89e3\u3002

Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

"},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u984c\u6b65\u9a5f","text":"

\u8caa\u5a6a\u554f\u984c\u7684\u89e3\u6c7a\u6d41\u7a0b\u5927\u9ad4\u53ef\u5206\u70ba\u4ee5\u4e0b\u4e09\u6b65\u3002

  1. \u554f\u984c\u5206\u6790\uff1a\u68b3\u7406\u8207\u7406\u89e3\u554f\u984c\u7279\u6027\uff0c\u5305\u62ec\u72c0\u614b\u5b9a\u7fa9\u3001\u6700\u4f73\u5316\u76ee\u6a19\u548c\u7d04\u675f\u689d\u4ef6\u7b49\u3002\u9019\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52d5\u614b\u898f\u5283\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
  2. \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\uff1a\u78ba\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8caa\u5a6a\u9078\u64c7\u3002\u9019\u500b\u7b56\u7565\u80fd\u5920\u5728\u6bcf\u4e00\u6b65\u6e1b\u5c0f\u554f\u984c\u7684\u898f\u6a21\uff0c\u4e26\u6700\u7d42\u89e3\u6c7a\u6574\u500b\u554f\u984c\u3002
  3. \u6b63\u78ba\u6027\u8b49\u660e\uff1a\u901a\u5e38\u9700\u8981\u8b49\u660e\u554f\u984c\u5177\u6709\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u9019\u500b\u6b65\u9a5f\u53ef\u80fd\u9700\u8981\u7528\u5230\u6578\u5b78\u8b49\u660e\uff0c\u4f8b\u5982\u6b78\u7d0d\u6cd5\u6216\u53cd\u8b49\u6cd5\u7b49\u3002

\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6c42\u89e3\u554f\u984c\u7684\u6838\u5fc3\u6b65\u9a5f\uff0c\u4f46\u5be6\u65bd\u8d77\u4f86\u53ef\u80fd\u4e26\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e0d\u540c\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565\u7684\u5dee\u7570\u8f03\u5927\u3002\u5c0d\u65bc\u8a31\u591a\u554f\u984c\u4f86\u8aaa\uff0c\u8caa\u5a6a\u7b56\u7565\u6bd4\u8f03\u6dfa\u986f\uff0c\u6211\u5011\u900f\u904e\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u8207\u5617\u8a66\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5c0d\u65bc\u4e00\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u96b1\u853d\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u975e\u5e38\u8003\u9a57\u500b\u4eba\u7684\u89e3\u984c\u7d93\u9a57\u8207\u6f14\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
  • \u67d0\u4e9b\u8caa\u5a6a\u7b56\u7565\u5177\u6709\u8f03\u5f37\u7684\u8ff7\u60d1\u6027\u3002\u7576\u6211\u5011\u6eff\u61f7\u4fe1\u5fc3\u8a2d\u8a08\u597d\u8caa\u5a6a\u7b56\u7565\uff0c\u5beb\u51fa\u89e3\u984c\u7a0b\u5f0f\u78bc\u4e26\u63d0\u4ea4\u57f7\u884c\uff0c\u5f88\u53ef\u80fd\u767c\u73fe\u90e8\u5206\u6e2c\u8a66\u6a23\u4f8b\u7121\u6cd5\u900f\u904e\u3002\u9019\u662f\u56e0\u70ba\u8a2d\u8a08\u7684\u8caa\u5a6a\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u78ba\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7d39\u7684\u96f6\u9322\u514c\u63db\u5c31\u662f\u4e00\u500b\u5178\u578b\u6848\u4f8b\u3002

\u70ba\u4e86\u4fdd\u8b49\u6b63\u78ba\u6027\uff0c\u6211\u5011\u61c9\u8a72\u5c0d\u8caa\u5a6a\u7b56\u7565\u9032\u884c\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8b49\u6cd5\u6216\u6578\u5b78\u6b78\u7d0d\u6cd5\u3002

\u7136\u800c\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6c92\u6709\u982d\u7dd2\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u9762\u5411\u6e2c\u8a66\u7528\u4f8b\u9032\u884c\u7a0b\u5f0f\u78bc\u9664\u932f\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u8207\u9a57\u8b49\u8caa\u5a6a\u7b56\u7565\u3002

"},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5178\u578b\u4f8b\u984c","text":"

\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5e38\u5e38\u61c9\u7528\u5728\u6eff\u8db3\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u6700\u4f73\u5316\u554f\u984c\u4e2d\uff0c\u4ee5\u4e0b\u5217\u8209\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u554f\u984c\u3002

  • \u786c\u5e63\u627e\u96f6\u554f\u984c\uff1a\u5728\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7e3d\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u5340\u9593\u6392\u7a0b\u554f\u984c\uff1a\u5047\u8a2d\u4f60\u6709\u4e00\u4e9b\u4efb\u52d9\uff0c\u6bcf\u500b\u4efb\u52d9\u5728\u4e00\u6bb5\u6642\u9593\u5167\u9032\u884c\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u5b8c\u6210\u5118\u53ef\u80fd\u591a\u7684\u4efb\u52d9\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u7d50\u675f\u6642\u9593\u6700\u65e9\u7684\u4efb\u52d9\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u5206\u6578\u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u8f09\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u9078\u64c7\u4e00\u7d44\u7269\u54c1\uff0c\u4f7f\u5f97\u7e3d\u91cd\u91cf\u4e0d\u8d85\u904e\u8f09\u91cd\u91cf\uff0c\u4e14\u7e3d\u50f9\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u50f9\u6548\u6bd4\u6700\u9ad8\uff08\u50f9\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
  • \u80a1\u7968\u8cb7\u8ce3\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u80a1\u7968\u7684\u6b77\u53f2\u50f9\u683c\uff0c\u4f60\u53ef\u4ee5\u9032\u884c\u591a\u6b21\u8cb7\u8ce3\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7d93\u6301\u6709\u80a1\u7968\uff0c\u90a3\u9ebc\u5728\u8ce3\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u8cb7\uff0c\u76ee\u6a19\u662f\u7372\u53d6\u6700\u5927\u5229\u6f64\u3002
  • \u970d\u592b\u66fc\u7de8\u78bc\uff1a\u970d\u592b\u66fc\u7de8\u78bc\u662f\u4e00\u7a2e\u7528\u65bc\u7121\u640d\u8cc7\u6599\u58d3\u7e2e\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002\u900f\u904e\u69cb\u5efa\u970d\u592b\u66fc\u6a39\uff0c\u6bcf\u6b21\u9078\u64c7\u51fa\u73fe\u983b\u7387\u6700\u4f4e\u7684\u5169\u500b\u7bc0\u9ede\u5408\u4f75\uff0c\u6700\u5f8c\u5f97\u5230\u7684\u970d\u592b\u66fc\u6a39\u7684\u5e36\u6b0a\u8def\u5f91\u9577\u5ea6\uff08\u7de8\u78bc\u9577\u5ea6\uff09\u6700\u5c0f\u3002
  • Dijkstra \u6f14\u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u7a2e\u89e3\u6c7a\u7d66\u5b9a\u6e90\u9802\u9ede\u5230\u5176\u9918\u5404\u9802\u9ede\u7684\u6700\u77ed\u8def\u5f91\u554f\u984c\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002
"},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c","text":"

Question

\u8f38\u5165\u4e00\u500b\u9663\u5217 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u4ee3\u8868\u4e00\u500b\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u5011\u4e4b\u9593\u7684\u7a7a\u9593\u53ef\u4ee5\u7d44\u6210\u4e00\u500b\u5bb9\u5668\u3002

\u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u548c\u5bec\u5ea6\u7684\u4e58\u7a4d\uff08\u9762\u7a4d\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f03\u77ed\u7684\u9694\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u500b\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002

\u8acb\u5728\u9663\u5217\u4e2d\u9078\u64c7\u5169\u500b\u9694\u677f\uff0c\u4f7f\u5f97\u7d44\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u5716 15-7 \u6240\u793a\u3002

\u5716 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

\u5bb9\u5668\u7531\u4efb\u610f\u5169\u500b\u9694\u677f\u570d\u6210\uff0c\u56e0\u6b64\u672c\u984c\u7684\u72c0\u614b\u70ba\u5169\u500b\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

\u6839\u64da\u984c\u610f\uff0c\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u4e58\u4ee5\u5bec\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002\u8a2d\u5bb9\u91cf\u70ba \\(cap[i, j]\\) \uff0c\u5247\u53ef\u5f97\u8a08\u7b97\u516c\u5f0f\uff1a

\\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

\u8a2d\u9663\u5217\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5169\u500b\u9694\u677f\u7684\u7d44\u5408\u6578\u91cf\uff08\u72c0\u614b\u7e3d\u6578\uff09\u70ba \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u500b\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u7aae\u8209\u6240\u6709\u72c0\u614b\uff0c\u5f9e\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u9019\u9053\u984c\u9084\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u5716 15-8 \u6240\u793a\uff0c\u73fe\u9078\u53d6\u4e00\u500b\u72c0\u614b \\([i, j]\\) \uff0c\u5176\u6eff\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002

\u5716 15-8 \u00a0 \u521d\u59cb\u72c0\u614b

\u5982\u5716 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u6642\u5c07\u9577\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5247\u5bb9\u91cf\u4e00\u5b9a\u8b8a\u5c0f\u3002

\u9019\u662f\u56e0\u70ba\u5728\u79fb\u52d5\u9577\u677f \\(j\\) \u5f8c\uff0c\u5bec\u5ea6 \\(j-i\\) \u80af\u5b9a\u8b8a\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u8b8a\uff08 \\(i\\) \u4ecd\u70ba\u77ed\u677f\uff09\u6216\u8b8a\u5c0f\uff08\u79fb\u52d5\u5f8c\u7684 \\(j\\) \u6210\u70ba\u77ed\u677f\uff09\u3002

\u5716 15-9 \u00a0 \u5411\u5167\u79fb\u52d5\u9577\u677f\u5f8c\u7684\u72c0\u614b

\u53cd\u5411\u601d\u8003\uff0c\u6211\u5011\u53ea\u6709\u5411\u5167\u6536\u7e2e\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u8b8a\u5927\u3002\u56e0\u70ba\u96d6\u7136\u5bec\u5ea6\u4e00\u5b9a\u8b8a\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u6703\u8b8a\u5927\uff08\u79fb\u52d5\u5f8c\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u6703\u8b8a\u9577\uff09\u3002\u4f8b\u5982\u5728\u5716 15-10 \u4e2d\uff0c\u79fb\u52d5\u77ed\u677f\u5f8c\u9762\u7a4d\u8b8a\u5927\u3002

\u5716 15-10 \u00a0 \u5411\u5167\u79fb\u52d5\u77ed\u677f\u5f8c\u7684\u72c0\u614b

\u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u984c\u7684\u8caa\u5a6a\u7b56\u7565\uff1a\u521d\u59cb\u5316\u5169\u6307\u6a19\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u5169\u7aef\uff0c\u6bcf\u8f2a\u5411\u5167\u6536\u7e2e\u77ed\u677f\u5c0d\u61c9\u7684\u6307\u6a19\uff0c\u76f4\u81f3\u5169\u6307\u6a19\u76f8\u9047\u3002

\u5716 15-11 \u5c55\u793a\u4e86\u8caa\u5a6a\u7b56\u7565\u7684\u57f7\u884c\u904e\u7a0b\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5217\u9663\u5217\u5169\u7aef\u3002
  2. \u8a08\u7b97\u7576\u524d\u72c0\u614b\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u4e26\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
  3. \u6bd4\u8f03\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u4e26\u5c07\u77ed\u677f\u5411\u5167\u79fb\u52d5\u4e00\u683c\u3002
  4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u6642\u7d50\u675f\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u8caa\u5a6a\u904e\u7a0b

"},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u7a0b\u5f0f\u78bc\u8ff4\u5708\u6700\u591a \\(n\\) \u8f2a\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

\u8b8a\u6578 \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res = 0\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
max_capacity.cpp
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.java
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.cs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.go
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res := 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.swift
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
max_capacity.js
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.ts
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
max_capacity.dart
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  int res = 0;\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
max_capacity.rs
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let mut res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
max_capacity.c
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
max_capacity.kt
/* \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
max_capacity.rb
[class]{}-[func]{max_capacity}\n
max_capacity.zig
[class]{}-[func]{maxCapacity}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u4e4b\u6240\u4ee5\u8caa\u5a6a\u6bd4\u7aae\u8209\u66f4\u5feb\uff0c\u662f\u56e0\u70ba\u6bcf\u8f2a\u7684\u8caa\u5a6a\u9078\u64c7\u90fd\u6703\u201c\u8df3\u904e\u201d\u4e00\u4e9b\u72c0\u614b\u3002

\u6bd4\u5982\u5728\u72c0\u614b \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002\u82e5\u8caa\u5a6a\u5730\u5c07\u77ed\u677f \\(i\\) \u5411\u5167\u79fb\u52d5\u4e00\u683c\uff0c\u6703\u5c0e\u81f4\u5716 15-12 \u6240\u793a\u7684\u72c0\u614b\u88ab\u201c\u8df3\u904e\u201d\u3002\u9019\u610f\u5473\u8457\u4e4b\u5f8c\u7121\u6cd5\u9a57\u8b49\u9019\u4e9b\u72c0\u614b\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

\\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

\u5716 15-12 \u00a0 \u79fb\u52d5\u77ed\u677f\u5c0e\u81f4\u88ab\u8df3\u904e\u7684\u72c0\u614b

\u89c0\u5bdf\u767c\u73fe\uff0c\u9019\u4e9b\u88ab\u8df3\u904e\u7684\u72c0\u614b\u5be6\u969b\u4e0a\u5c31\u662f\u5c07\u9577\u677f \\(j\\) \u5411\u5167\u79fb\u52d5\u7684\u6240\u6709\u72c0\u614b\u3002\u524d\u9762\u6211\u5011\u5df2\u7d93\u8b49\u660e\u5167\u79fb\u9577\u677f\u4e00\u5b9a\u6703\u5c0e\u81f4\u5bb9\u91cf\u8b8a\u5c0f\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u88ab\u8df3\u904e\u7684\u72c0\u614b\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u512a\u89e3\uff0c\u8df3\u904e\u5b83\u5011\u4e0d\u6703\u5c0e\u81f4\u932f\u904e\u6700\u512a\u89e3\u3002

\u4ee5\u4e0a\u5206\u6790\u8aaa\u660e\uff0c\u79fb\u52d5\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5c07\u5176\u5207\u5206\u70ba\u81f3\u5c11\u5169\u500b\u6b63\u6574\u6578\u7684\u548c\uff0c\u6c42\u5207\u5206\u5f8c\u6240\u6709\u6574\u6578\u7684\u4e58\u7a4d\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u5716 15-13 \u6240\u793a\u3002

\u5716 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u554f\u984c\u5b9a\u7fa9

\u5047\u8a2d\u6211\u5011\u5c07 \\(n\\) \u5207\u5206\u70ba \\(m\\) \u500b\u6574\u6578\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u500b\u56e0\u5b50\u8a18\u70ba \\(n_i\\) \uff0c\u5373

\\[ n = \\sum_{i=1}^{m}n_i \\]

\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u5f97\u6240\u6709\u6574\u6578\u56e0\u5b50\u7684\u6700\u5927\u4e58\u7a4d\uff0c\u5373

\\[ \\max(\\prod_{i=1}^{m}n_i) \\]

\u6211\u5011\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6578\u91cf \\(m\\) \u61c9\u8a72\u591a\u5927\uff0c\u6bcf\u500b \\(n_i\\) \u61c9\u8a72\u662f\u591a\u5c11\uff1f

"},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

\u6839\u64da\u7d93\u9a57\uff0c\u5169\u500b\u6574\u6578\u7684\u4e58\u7a4d\u5f80\u5f80\u6bd4\u5b83\u5011\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8a2d\u5f9e \\(n\\) \u4e2d\u5206\u51fa\u4e00\u500b\u56e0\u5b50 \\(2\\) \uff0c\u5247\u5b83\u5011\u7684\u4e58\u7a4d\u70ba \\(2(n-2)\\) \u3002\u6211\u5011\u5c07\u8a72\u4e58\u7a4d\u8207 \\(n\\) \u4f5c\u6bd4\u8f03\uff1a

\\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

\u5982\u5716 15-14 \u6240\u793a\uff0c\u7576 \\(n \\geq 4\\) \u6642\uff0c\u5207\u5206\u51fa\u4e00\u500b \\(2\\) \u5f8c\u4e58\u7a4d\u6703\u8b8a\u5927\uff0c\u9019\u8aaa\u660e\u5927\u65bc\u7b49\u65bc \\(4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u88ab\u5207\u5206\u3002

\u8caa\u5a6a\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u9ebc\u5b83\u5c31\u61c9\u8a72\u88ab\u7e7c\u7e8c\u5207\u5206\u3002\u6700\u7d42\u7684\u5207\u5206\u65b9\u6848\u53ea\u61c9\u51fa\u73fe \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u7a2e\u56e0\u5b50\u3002

\u5716 15-14 \u00a0 \u5207\u5206\u5c0e\u81f4\u4e58\u7a4d\u8b8a\u5927

\u63a5\u4e0b\u4f86\u601d\u8003\u54ea\u500b\u56e0\u5b50\u662f\u6700\u512a\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u500b\u56e0\u5b50\u4e2d\uff0c\u986f\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u70ba \\(1 \\times (n-1) < n\\) \u6046\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u6703\u5c0e\u81f4\u4e58\u7a4d\u6e1b\u5c0f\u3002

\u5982\u5716 15-15 \u6240\u793a\uff0c\u7576 \\(n = 6\\) \u6642\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u9019\u610f\u5473\u8457\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u512a\u3002

\u8caa\u5a6a\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u96bb\u61c9\u5b58\u5728\u5169\u500b \\(2\\) \u3002\u56e0\u70ba\u4e09\u500b \\(2\\) \u7e3d\u662f\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002

\u5716 15-15 \u00a0 \u6700\u512a\u5207\u5206\u56e0\u5b50

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8caa\u5a6a\u7b56\u7565\u3002

  1. \u8f38\u5165\u6574\u6578 \\(n\\) \uff0c\u5f9e\u5176\u4e0d\u65b7\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u9918\u6578\u70ba \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
  2. \u7576\u9918\u6578\u70ba \\(0\\) \u6642\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6578\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u8655\u7406\u3002
  3. \u7576\u9918\u6578\u70ba \\(2\\) \u6642\uff0c\u4e0d\u7e7c\u7e8c\u5283\u5206\uff0c\u4fdd\u7559\u3002
  4. \u7576\u9918\u6578\u70ba \\(1\\) \u6642\uff0c\u7531\u65bc \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u61c9\u5c07\u6700\u5f8c\u4e00\u500b \\(3\\) \u66ff\u63db\u70ba \\(2\\) \u3002
"},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5982\u5716 15-16 \u6240\u793a\uff0c\u6211\u5011\u7121\u9808\u900f\u904e\u8ff4\u5708\u4f86\u5207\u5206\u6574\u6578\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u904b\u7b97\u5f97\u5230 \\(3\\) \u7684\u500b\u6578 \\(a\\) \uff0c\u7528\u53d6\u6a21\u904b\u7b97\u5f97\u5230\u9918\u6578 \\(b\\) \uff0c\u6b64\u6642\u6709\uff1a

\\[ n = 3 a + b \\]

\u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc \\(n \\leq 3\\) \u7684\u908a\u754c\u60c5\u6cc1\uff0c\u5fc5\u9808\u62c6\u5206\u51fa\u4e00\u500b \\(1\\) \uff0c\u4e58\u7a4d\u70ba \\(1 \\times (n - 1)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a\"\"\"\n    # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.pow(3, a)) * 2\n    # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.pow(3, a))\n
max_product_cutting.cpp
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)pow(3, a);\n}\n
max_product_cutting.java
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int) Math.pow(3, a);\n}\n
max_product_cutting.cs
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint MaxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)Math.Pow(3, a);\n}\n
max_product_cutting.go
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n int) int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
max_product_cutting.swift
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a)\n}\n
max_product_cutting.js
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.ts
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n: number): number {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
max_product_cutting.dart
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n  // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return pow(3, a).toInt();\n}\n
max_product_cutting.rs
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
max_product_cutting.c
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a);\n}\n
max_product_cutting.kt
/* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfun maxProductCutting(n: Int): Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return 3.0.pow(a).toInt()\n}\n
max_product_cutting.rb
[class]{}-[func]{max_product_cutting}\n
max_product_cutting.zig
[class]{}-[func]{maxProductCutting}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5716 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u8a08\u7b97\u65b9\u6cd5

\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u51aa\u904b\u7b97\u7684\u5be6\u73fe\u65b9\u6cd5\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5e38\u7528\u7684\u51aa\u8a08\u7b97\u51fd\u5f0f\u6709\u4e09\u7a2e\u3002

  • \u904b\u7b97\u5b50 ** \u548c\u51fd\u5f0f pow() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log\u2061 a)\\) \u3002
  • \u51fd\u5f0f math.pow() \u5167\u90e8\u547c\u53eb C \u8a9e\u8a00\u5eab\u7684 pow() \u51fd\u5f0f\uff0c\u5176\u57f7\u884c\u6d6e\u9ede\u53d6\u51aa\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

\u8b8a\u6578 \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

"},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

\u4f7f\u7528\u53cd\u8b49\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u6cc1\u3002

  1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u5c07\u5176\u7e7c\u7e8c\u5283\u5206\u70ba \\(2(x-2)\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
  2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u500b\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u9ebc\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u4f75\u5165\u53e6\u5916\u4e00\u500b\u56e0\u5b50\u4e2d\uff0c\u4ee5\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
  3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u5169\u500b \\(2\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u500b \\(2\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u4e58\u7a4d\u66f4\u5927\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
"},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7d50","text":"
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u901a\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\u90fd\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u6703\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u500b\u53c8\u4e00\u500b\u7684\u8caa\u5a6a\u9078\u64c7\uff0c\u6bcf\u8f2a\u90fd\u5c07\u554f\u984c\u8f49\u5316\u6210\u4e00\u500b\u898f\u6a21\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u554f\u984c\u88ab\u89e3\u6c7a\u3002
  • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u5be6\u73fe\u7c21\u55ae\uff0c\u9084\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u984c\u6548\u7387\u3002\u76f8\u6bd4\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
  • \u5728\u96f6\u9322\u514c\u63db\u554f\u984c\u4e2d\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1b\u5c0d\u65bc\u53e6\u5916\u4e00\u4e9b\u786c\u5e63\u7d44\u5408\u5247\u4e0d\u7136\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
  • \u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u7684\u554f\u984c\u5177\u6709\u5169\u5927\u6027\u8cea\uff1a\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4ee3\u8868\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
  • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u8b49\u660e\u4e26\u4e0d\u7c21\u55ae\u3002\u76f8\u5c0d\u4f86\u8aaa\uff0c\u8b49\u507d\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002
  • \u6c42\u89e3\u8caa\u5a6a\u554f\u984c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\uff1a\u554f\u984c\u5206\u6790\u3001\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u3001\u6b63\u78ba\u6027\u8b49\u660e\u3002\u5176\u4e2d\uff0c\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9a5f\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u5f80\u5f80\u662f\u96e3\u9ede\u3002
  • \u5206\u6578\u80cc\u5305\u554f\u984c\u5728 0-1 \u80cc\u5305\u7684\u57fa\u790e\u4e0a\uff0c\u5141\u8a31\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u3002\u8caa\u5a6a\u7b56\u7565\u7684\u6b63\u78ba\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\u3002
  • \u6700\u5927\u5bb9\u91cf\u554f\u984c\u53ef\u4f7f\u7528\u7aae\u8209\u6cd5\u6c42\u89e3\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u900f\u904e\u8a2d\u8a08\u8caa\u5a6a\u7b56\u7565\uff0c\u6bcf\u8f2a\u5411\u5167\u79fb\u52d5\u77ed\u677f\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \u3002
  • \u5728\u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u63a8\u7406\u51fa\u5169\u500b\u8caa\u5a6a\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u7e7c\u7e8c\u5207\u5206\uff0c\u6700\u512a\u5207\u5206\u56e0\u5b50\u70ba \\(3\\) \u3002\u7a0b\u5f0f\u78bc\u4e2d\u5305\u542b\u51aa\u904b\u7b97\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u51aa\u904b\u7b97\u5be6\u73fe\u65b9\u6cd5\uff0c\u901a\u5e38\u70ba \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
"},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u96dc\u6e4a\u8868","text":"

Abstract

\u5728\u8a08\u7b97\u6a5f\u4e16\u754c\u4e2d\uff0c\u96dc\u6e4a\u8868\u5982\u540c\u4e00\u4f4d\u8070\u6167\u7684\u5716\u66f8\u7ba1\u7406\u54e1\u3002

\u4ed6\u77e5\u9053\u5982\u4f55\u8a08\u7b97\u7d22\u66f8\u865f\uff0c\u5f9e\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6a19\u5716\u66f8\u3002

"},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 6.1 \u00a0 \u96dc\u6e4a\u8868
  • 6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81
  • 6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5
  • 6.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

\u524d\u5169\u7bc0\u4ecb\u7d39\u4e86\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u96dc\u6e4a\u885d\u7a81\u7684\u8655\u7406\u65b9\u6cd5\u3002\u7136\u800c\u7121\u8ad6\u662f\u958b\u653e\u5b9a\u5740\u9084\u662f\u93c8\u5f0f\u4f4d\u5740\uff0c\u5b83\u5011\u53ea\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u767c\u751f\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u7121\u6cd5\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u3002

\u5982\u679c\u96dc\u6e4a\u885d\u7a81\u904e\u65bc\u983b\u7e41\uff0c\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u5247\u6703\u6025\u5287\u52a3\u5316\u3002\u5982\u5716 6-8 \u6240\u793a\uff0c\u5c0d\u65bc\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\uff0c\u7406\u60f3\u60c5\u6cc1\u4e0b\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u5404\u500b\u6876\u4e2d\uff0c\u9054\u5230\u6700\u4f73\u67e5\u8a62\u6548\u7387\uff1b\u6700\u5dee\u60c5\u6cc1\u4e0b\u6240\u6709\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5230\u540c\u4e00\u500b\u6876\u4e2d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u5716 6-8 \u00a0 \u96dc\u6e4a\u885d\u7a81\u7684\u6700\u4f73\u60c5\u6cc1\u8207\u6700\u5dee\u60c5\u6cc1

\u9375\u503c\u5c0d\u7684\u5206\u4f48\u60c5\u6cc1\u7531\u96dc\u6e4a\u51fd\u5f0f\u6c7a\u5b9a\u3002\u56de\u61b6\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u6b65\u9a5f\uff0c\u5148\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u518d\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\uff1a

index = hash(key) % capacity\n

\u89c0\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u7576\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u6642\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u6c7a\u5b9a\u4e86\u8f38\u51fa\u503c\uff0c\u9032\u800c\u6c7a\u5b9a\u4e86\u9375\u503c\u5c0d\u5728\u96dc\u6e4a\u8868\u4e2d\u7684\u5206\u4f48\u60c5\u6cc1\u3002

\u9019\u610f\u5473\u8457\uff0c\u70ba\u4e86\u964d\u4f4e\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u6a5f\u7387\uff0c\u6211\u5011\u61c9\u7576\u5c07\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u7684\u8a2d\u8a08\u4e0a\u3002

"},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u76ee\u6a19","text":"

\u70ba\u4e86\u5be6\u73fe\u201c\u65e2\u5feb\u53c8\u7a69\u201d\u7684\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u5177\u5099\u4ee5\u4e0b\u7279\u9ede\u3002

  • \u78ba\u5b9a\u6027\uff1a\u5c0d\u65bc\u76f8\u540c\u7684\u8f38\u5165\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u59cb\u7d42\u7522\u751f\u76f8\u540c\u7684\u8f38\u51fa\u3002\u9019\u6a23\u624d\u80fd\u78ba\u4fdd\u96dc\u6e4a\u8868\u662f\u53ef\u9760\u7684\u3002
  • \u6548\u7387\u9ad8\uff1a\u8a08\u7b97\u96dc\u6e4a\u503c\u7684\u904e\u7a0b\u61c9\u8a72\u8db3\u5920\u5feb\u3002\u8a08\u7b97\u958b\u92b7\u8d8a\u5c0f\uff0c\u96dc\u6e4a\u8868\u7684\u5be6\u7528\u6027\u8d8a\u9ad8\u3002
  • \u5747\u52fb\u5206\u4f48\uff1a\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u4f7f\u5f97\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u96dc\u6e4a\u8868\u4e2d\u3002\u5206\u4f48\u8d8a\u5747\u52fb\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002

\u5be6\u969b\u4e0a\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u96dc\u6e4a\u8868\uff0c\u9084\u5ee3\u6cdb\u61c9\u7528\u65bc\u5176\u4ed6\u9818\u57df\u4e2d\u3002

  • \u5bc6\u78bc\u5132\u5b58\uff1a\u70ba\u4e86\u4fdd\u8b77\u4f7f\u7528\u8005\u5bc6\u78bc\u7684\u5b89\u5168\uff0c\u7cfb\u7d71\u901a\u5e38\u4e0d\u6703\u76f4\u63a5\u5132\u5b58\u4f7f\u7528\u8005\u7684\u660e\u6587\u5bc6\u78bc\uff0c\u800c\u662f\u5132\u5b58\u5bc6\u78bc\u7684\u96dc\u6e4a\u503c\u3002\u7576\u7528\u6236\u8f38\u5165\u5bc6\u78bc\u6642\uff0c\u7cfb\u7d71\u6703\u5c0d\u8f38\u5165\u7684\u5bc6\u78bc\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u7136\u5f8c\u8207\u5132\u5b58\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u5bc6\u78bc\u5c31\u88ab\u8996\u70ba\u6b63\u78ba\u3002
  • \u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5\uff1a\u8cc7\u6599\u50b3\u9001\u65b9\u53ef\u4ee5\u8a08\u7b97\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\u4e26\u5c07\u5176\u4e00\u540c\u50b3\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8a08\u7b97\u63a5\u6536\u5230\u7684\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\uff0c\u4e26\u8207\u63a5\u6536\u5230\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u8cc7\u6599\u5c31\u88ab\u8996\u70ba\u5b8c\u6574\u3002

\u5c0d\u65bc\u5bc6\u78bc\u5b78\u7684\u76f8\u95dc\u61c9\u7528\uff0c\u70ba\u4e86\u9632\u6b62\u5f9e\u96dc\u6e4a\u503c\u63a8\u5c0e\u51fa\u539f\u59cb\u5bc6\u78bc\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9700\u8981\u5177\u5099\u66f4\u9ad8\u7b49\u7d1a\u7684\u5b89\u5168\u7279\u6027\u3002

  • \u55ae\u5411\u6027\uff1a\u7121\u6cd5\u900f\u904e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u7684\u4efb\u4f55\u8cc7\u8a0a\u3002
  • \u6297\u78b0\u649e\u6027\uff1a\u61c9\u7576\u6975\u96e3\u627e\u5230\u5169\u500b\u4e0d\u540c\u7684\u8f38\u5165\uff0c\u4f7f\u5f97\u5b83\u5011\u7684\u96dc\u6e4a\u503c\u76f8\u540c\u3002
  • \u96ea\u5d29\u6548\u61c9\uff1a\u8f38\u5165\u7684\u5fae\u5c0f\u8b8a\u5316\u61c9\u7576\u5c0e\u81f4\u8f38\u51fa\u7684\u986f\u8457\u4e14\u4e0d\u53ef\u9810\u6e2c\u7684\u8b8a\u5316\u3002

\u8acb\u6ce8\u610f\uff0c\u201c\u5747\u52fb\u5206\u4f48\u201d\u8207\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u5169\u500b\u7368\u7acb\u7684\u6982\u5ff5\uff0c\u6eff\u8db3\u5747\u52fb\u5206\u4f48\u4e0d\u4e00\u5b9a\u6eff\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u96a8\u6a5f\u8f38\u5165 key \u4e0b\uff0c\u96dc\u6e4a\u51fd\u5f0f key % 100 \u53ef\u4ee5\u7522\u751f\u5747\u52fb\u5206\u4f48\u7684\u8f38\u51fa\u3002\u7136\u800c\u8a72\u96dc\u6e4a\u6f14\u7b97\u6cd5\u904e\u65bc\u7c21\u55ae\uff0c\u6240\u6709\u5f8c\u5169\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f38\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u5f9e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u5f9e\u800c\u7834\u89e3\u5bc6\u78bc\u3002

"},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08","text":"

\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u662f\u4e00\u500b\u9700\u8981\u8003\u616e\u8a31\u591a\u56e0\u7d20\u7684\u8907\u96dc\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u5834\u666f\uff0c\u6211\u5011\u4e5f\u80fd\u8a2d\u8a08\u4e00\u4e9b\u7c21\u55ae\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

  • \u52a0\u6cd5\u96dc\u6e4a\uff1a\u5c0d\u8f38\u5165\u7684\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u9032\u884c\u76f8\u52a0\uff0c\u5c07\u5f97\u5230\u7684\u7e3d\u548c\u4f5c\u70ba\u96dc\u6e4a\u503c\u3002
  • \u4e58\u6cd5\u96dc\u6e4a\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u95dc\u6027\uff0c\u6bcf\u8f2a\u4e58\u4ee5\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5404\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u96dc\u6e4a\u503c\u4e2d\u3002
  • \u4e92\u65a5\u6216\u96dc\u6e4a\uff1a\u5c07\u8f38\u5165\u8cc7\u6599\u7684\u6bcf\u500b\u5143\u7d20\u900f\u904e\u4e92\u65a5\u6216\u64cd\u4f5c\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\u3002
  • \u65cb\u8f49\u96dc\u6e4a\uff1a\u5c07\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u7a4d\u4e4b\u524d\u90fd\u6703\u5c0d\u96dc\u6e4a\u503c\u9032\u884c\u65cb\u8f49\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u4e92\u65a5\u6216\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f49\u96dc\u6e4a\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
simple_hash.cpp
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.java
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
simple_hash.cs
/* \u52a0\u6cd5\u96dc\u6e4a */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
simple_hash.go
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
simple_hash.swift
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
simple_hash.js
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.ts
/* \u52a0\u6cd5\u96dc\u6e4a */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
simple_hash.dart
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
simple_hash.rs
/* \u52a0\u6cd5\u96dc\u6e4a */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
simple_hash.c
/* \u52a0\u6cd5\u96dc\u6e4a */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
simple_hash.kt
/* \u52a0\u6cd5\u96dc\u6e4a */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u96dc\u6e4a */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e92\u65a5\u6216\u96dc\u6e4a */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f49\u96dc\u6e4a */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
simple_hash.rb
### \u52a0\u6cd5\u96dc\u6e4a ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u96dc\u6e4a ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u4e92\u65a5\u6216\u96dc\u6e4a ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f49\u96dc\u6e4a ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
simple_hash.zig
[class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u89c0\u5bdf\u767c\u73fe\uff0c\u6bcf\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6700\u5f8c\u4e00\u6b65\u90fd\u662f\u5c0d\u5927\u8cea\u6578 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u78ba\u4fdd\u96dc\u6e4a\u503c\u5728\u5408\u9069\u7684\u7bc4\u570d\u5167\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u70ba\u4ec0\u9ebc\u8981\u5f37\u8abf\u5c0d\u8cea\u6578\u53d6\u6a21\uff0c\u6216\u8005\u8aaa\u5c0d\u5408\u6578\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u9ebc\uff1f\u9019\u662f\u4e00\u500b\u6709\u8da3\u7684\u554f\u984c\u3002

\u5148\u4e1f\u64f2\u7d50\u8ad6\uff1a\u4f7f\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u5206\u4f48\u3002\u56e0\u70ba\u8cea\u6578\u4e0d\u8207\u5176\u4ed6\u6578\u5b57\u5b58\u5728\u516c\u7d04\u6578\uff0c\u53ef\u4ee5\u6e1b\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u7522\u751f\u7684\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u5f9e\u800c\u907f\u514d\u96dc\u6e4a\u885d\u7a81\u3002

\u8209\u500b\u4f8b\u5b50\uff0c\u5047\u8a2d\u6211\u5011\u9078\u64c7\u5408\u6578 \\(9\\) \u4f5c\u70ba\u6a21\u6578\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u9ebc\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u9019\u4e09\u500b\u96dc\u6e4a\u503c\u3002

\\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

\u5982\u679c\u8f38\u5165 key \u6070\u597d\u6eff\u8db3\u9019\u7a2e\u7b49\u5dee\u6578\u5217\u7684\u8cc7\u6599\u5206\u4f48\uff0c\u90a3\u9ebc\u96dc\u6e4a\u503c\u5c31\u6703\u51fa\u73fe\u805a\u5806\u7a4d\uff0c\u5f9e\u800c\u52a0\u91cd\u96dc\u6e4a\u885d\u7a81\u3002\u73fe\u5728\uff0c\u5047\u8a2d\u5c07 modulus \u66ff\u63db\u70ba\u8cea\u6578 \\(13\\) \uff0c\u7531\u65bc key \u548c modulus \u4e4b\u9593\u4e0d\u5b58\u5728\u516c\u7d04\u6578\uff0c\u56e0\u6b64\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u6027\u6703\u660e\u986f\u63d0\u5347\u3002

\\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u5920\u4fdd\u8b49 key \u662f\u96a8\u6a5f\u5747\u52fb\u5206\u4f48\u7684\uff0c\u90a3\u9ebc\u9078\u64c7\u8cea\u6578\u6216\u8005\u5408\u6578\u4f5c\u70ba\u6a21\u6578\u90fd\u53ef\u4ee5\uff0c\u5b83\u5011\u90fd\u80fd\u8f38\u51fa\u5747\u52fb\u5206\u4f48\u7684\u96dc\u6e4a\u503c\u3002\u800c\u7576 key \u7684\u5206\u4f48\u5b58\u5728\u67d0\u7a2e\u9031\u671f\u6027\u6642\uff0c\u5c0d\u5408\u6578\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73fe\u805a\u96c6\u73fe\u8c61\u3002

\u7e3d\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u901a\u5e38\u9078\u53d6\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4e26\u4e14\u9019\u500b\u8cea\u6578\u6700\u597d\u8db3\u5920\u5927\uff0c\u4ee5\u5118\u53ef\u80fd\u6d88\u9664\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002

"},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u898b\u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

\u4e0d\u96e3\u767c\u73fe\uff0c\u4ee5\u4e0a\u4ecb\u7d39\u7684\u7c21\u55ae\u96dc\u6e4a\u6f14\u7b97\u6cd5\u90fd\u6bd4\u8f03\u201c\u8106\u5f31\u201d\uff0c\u9060\u9060\u6c92\u6709\u9054\u5230\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u76ee\u6a19\u3002\u4f8b\u5982\uff0c\u7531\u65bc\u52a0\u6cd5\u548c\u4e92\u65a5\u6216\u6eff\u8db3\u4ea4\u63db\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u96dc\u6e4a\u548c\u4e92\u65a5\u6216\u96dc\u6e4a\u7121\u6cd5\u5340\u5206\u5167\u5bb9\u76f8\u540c\u4f46\u9806\u5e8f\u4e0d\u540c\u7684\u5b57\u4e32\uff0c\u9019\u53ef\u80fd\u6703\u52a0\u5287\u96dc\u6e4a\u885d\u7a81\uff0c\u4e26\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u554f\u984c\u3002

\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u7528\u4e00\u4e9b\u6a19\u6e96\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u5011\u53ef\u4ee5\u5c07\u4efb\u610f\u9577\u5ea6\u7684\u8f38\u5165\u8cc7\u6599\u5c0d\u6620\u5230\u6046\u5b9a\u9577\u5ea6\u7684\u96dc\u6e4a\u503c\u3002

\u8fd1\u4e00\u500b\u4e16\u7d00\u4ee5\u4f86\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u8655\u5728\u4e0d\u65b7\u5347\u7d1a\u8207\u6700\u4f73\u5316\u7684\u904e\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u52aa\u529b\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u548c\u99ed\u5ba2\u5247\u81f4\u529b\u65bc\u5c0b\u627e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u554f\u984c\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5be6\u969b\u61c9\u7528\u4e2d\u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

  • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u64ca\uff0c\u56e0\u6b64\u5b83\u5011\u88ab\u5404\u985e\u5b89\u5168\u61c9\u7528\u68c4\u7528\u3002
  • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73fe\u6210\u529f\u7684\u653b\u64ca\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u985e\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u4e2d\u3002
  • SHA-3 \u76f8\u8f03 SHA-2 \u7684\u5be6\u73fe\u958b\u92b7\u66f4\u4f4e\u3001\u8a08\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u84cb\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

\u8868 6-2 \u00a0 \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5

MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u6642\u9593 1992 1995 2002 2008 \u8f38\u51fa\u9577\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u96dc\u6e4a\u885d\u7a81 \u8f03\u591a \u8f03\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7d1a \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u9ad8 \u9ad8 \u61c9\u7528 \u5df2\u88ab\u68c4\u7528\uff0c\u4ecd\u7528\u65bc\u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5 \u5df2\u88ab\u68c4\u7528 \u52a0\u5bc6\u8ca8\u5e63\u4ea4\u6613\u9a57\u8b49\u3001\u6578\u5b57\u7c3d\u540d\u7b49 \u53ef\u7528\u65bc\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u96dc\u6e4a\u503c","text":"

\u6211\u5011\u77e5\u9053\uff0c\u96dc\u6e4a\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6578\u3001\u5c0f\u6578\u6216\u5b57\u4e32\u7b49\u8cc7\u6599\u578b\u5225\u3002\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u9019\u4e9b\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u547c\u53eb hash() \u51fd\u5f0f\u4f86\u8a08\u7b97\u5404\u7a2e\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u3002

  • \u6574\u6578\u548c\u5e03\u6797\u91cf\u7684\u96dc\u6e4a\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
  • \u6d6e\u9ede\u6578\u548c\u5b57\u4e32\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u8f03\u70ba\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u8acb\u81ea\u884c\u5b78\u7fd2\u3002
  • \u5143\u7d44\u7684\u96dc\u6e4a\u503c\u662f\u5c0d\u5176\u4e2d\u6bcf\u4e00\u500b\u5143\u7d20\u9032\u884c\u96dc\u6e4a\uff0c\u7136\u5f8c\u5c07\u9019\u4e9b\u96dc\u6e4a\u503c\u7d44\u5408\u8d77\u4f86\uff0c\u5f97\u5230\u55ae\u4e00\u7684\u96dc\u6e4a\u503c\u3002
  • \u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u57fa\u65bc\u5176\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u3002\u900f\u904e\u91cd\u5beb\u7269\u4ef6\u7684\u96dc\u6e4a\u65b9\u6cd5\uff0c\u53ef\u5be6\u73fe\u57fa\u65bc\u5167\u5bb9\u751f\u6210\u96dc\u6e4a\u503c\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u96dc\u6e4a\u503c\u8a08\u7b97\u51fd\u5f0f\u7684\u5b9a\u7fa9\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
num = 3\nhash_num = hash(num)\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u6797\u91cf True \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 326484311674566659\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u7bc0\u9ede\u7269\u4ef6 <ListNode object at 0x1058fd810> \u7684\u96dc\u6e4a\u503c\u70ba 274267521\n
built_in_hash.cpp
int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u6797\u91cf 1 \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 4614256650576692846\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5167\u5efa std:hash() \u50c5\u63d0\u4f9b\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\n// \u9663\u5217\u3001\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u9700\u8981\u81ea\u884c\u5be6\u73fe\n
built_in_hash.java
int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@7dc5e7b4 \u7684\u96dc\u6e4a\u503c\u70ba 2110121908\n
built_in_hash.cs
int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729;\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u7bc0\u9ede\u7269\u4ef6 0 \u7684\u96dc\u6e4a\u503c\u70ba 39053774;\n
built_in_hash.go
// Go \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.swift
let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -2465384235396674631\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u9663\u5217 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u96dc\u6e4a\u503c\u70ba -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode \u7684\u96dc\u6e4a\u503c\u70ba -2434780518035996159\n
built_in_hash.js
// JavaScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.ts
// TypeScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.dart
int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u6797\u503c true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2570631074981783\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u7bc0\u9ede\u7269\u4ef6 Instance of 'ListNode' \u7684\u96dc\u6e4a\u503c\u70ba 1033450432\n
built_in_hash.rs
use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2566941990314602357\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7d44 (12836, \"\u5c0f\u54c8\") \u7684\u96dc\u6e4a\u503c\u70ba 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u7bc0\u9ede\u7269\u4ef6 RefCell { value: ListNode { val: 42, next: None } } \u7684\u96dc\u6e4a\u503c\u70ba15387811073369036852\n
built_in_hash.c
// C \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
built_in_hash.kt
val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nval str = \"Hello \u6f14\u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@1d81eb93 \u7684\u96dc\u6e4a\u503c\u70ba 495053715\n
built_in_hash.rb
num = 3\nhash_num = num.hash\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1479186995943067893\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u7bc0\u9ede\u7269\u4ef6 #<ListNode:0x000078133140ab70> \u7684\u96dc\u6e4a\u503c\u70ba 4302940560806366381\n
built_in_hash.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5728\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u624d\u53ef\u4f5c\u70ba\u96dc\u6e4a\u8868\u7684 key \u3002\u5047\u5982\u6211\u5011\u5c07\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f5c\u70ba key \uff0c\u7576\u4e32\u5217\u7684\u5167\u5bb9\u767c\u751f\u8b8a\u5316\u6642\uff0c\u5b83\u7684\u96dc\u6e4a\u503c\u4e5f\u96a8\u4e4b\u6539\u8b8a\uff0c\u6211\u5011\u5c31\u7121\u6cd5\u5728\u96dc\u6e4a\u8868\u4e2d\u67e5\u8a62\u5230\u539f\u5148\u7684 value \u4e86\u3002

\u96d6\u7136\u81ea\u5b9a\u7fa9\u7269\u4ef6\uff08\u6bd4\u5982\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff09\u7684\u6210\u54e1\u8b8a\u6578\u662f\u53ef\u8b8a\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u96dc\u6e4a\u7684\u3002\u9019\u662f\u56e0\u70ba\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u901a\u5e38\u662f\u57fa\u65bc\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u7269\u4ef6\u7684\u5167\u5bb9\u767c\u751f\u4e86\u8b8a\u5316\uff0c\u4f46\u5b83\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u4e0d\u8b8a\uff0c\u96dc\u6e4a\u503c\u4ecd\u7136\u662f\u4e0d\u8b8a\u7684\u3002

\u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u767c\u73fe\u5728\u4e0d\u540c\u63a7\u5236\u6aaf\u4e2d\u57f7\u884c\u7a0b\u5f0f\u6642\uff0c\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u662f\u4e0d\u540c\u7684\u3002\u9019\u662f\u56e0\u70ba Python \u76f4\u8b6f\u5668\u5728\u6bcf\u6b21\u555f\u52d5\u6642\uff0c\u90fd\u6703\u70ba\u5b57\u4e32\u96dc\u6e4a\u51fd\u5f0f\u52a0\u5165\u4e00\u500b\u96a8\u6a5f\u7684\u9e7d\uff08salt\uff09\u503c\u3002\u9019\u7a2e\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u64ca\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

"},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81","text":"

\u4e0a\u4e00\u7bc0\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u5165\u7a7a\u9593\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff0c\u56e0\u6b64\u7406\u8ad6\u4e0a\u96dc\u6e4a\u885d\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f38\u5165\u7a7a\u9593\u70ba\u5168\u9ad4\u6574\u6578\uff0c\u8f38\u51fa\u7a7a\u9593\u70ba\u9663\u5217\u5bb9\u91cf\u5927\u5c0f\uff0c\u5247\u5fc5\u7136\u6709\u591a\u500b\u6574\u6578\u5c0d\u6620\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

\u96dc\u6e4a\u885d\u7a81\u6703\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u932f\u8aa4\uff0c\u56b4\u91cd\u5f71\u97ff\u96dc\u6e4a\u8868\u7684\u53ef\u7528\u6027\u3002\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6bcf\u7576\u9047\u5230\u96dc\u6e4a\u885d\u7a81\u6642\uff0c\u6211\u5011\u5c31\u9032\u884c\u96dc\u6e4a\u8868\u64f4\u5bb9\uff0c\u76f4\u81f3\u885d\u7a81\u6d88\u5931\u70ba\u6b62\u3002\u6b64\u65b9\u6cd5\u7c21\u55ae\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u8981\u9032\u884c\u5927\u91cf\u7684\u8cc7\u6599\u642c\u904b\u8207\u96dc\u6e4a\u503c\u8a08\u7b97\u3002\u70ba\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

  1. \u6539\u826f\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u4f7f\u5f97\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\u3002
  2. \u50c5\u5728\u5fc5\u8981\u6642\uff0c\u5373\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u624d\u57f7\u884c\u64f4\u5bb9\u64cd\u4f5c\u3002

\u96dc\u6e4a\u8868\u7684\u7d50\u69cb\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u548c\u201c\u958b\u653e\u5b9a\u5740\u201d\u3002

"},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u93c8\u5f0f\u4f4d\u5740","text":"

\u5728\u539f\u59cb\u96dc\u6e4a\u8868\u4e2d\uff0c\u6bcf\u500b\u6876\u50c5\u80fd\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u93c8\u5f0f\u4f4d\u5740\uff08separate chaining\uff09\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u63db\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u9375\u503c\u5c0d\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff0c\u5c07\u6240\u6709\u767c\u751f\u885d\u7a81\u7684\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5728\u540c\u4e00\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u5716 6-5 \u5c55\u793a\u4e86\u4e00\u500b\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u4f8b\u5b50\u3002

\u5716 6-5 \u00a0 \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868

\u57fa\u65bc\u93c8\u5f0f\u4f4d\u5740\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u767c\u751f\u4e86\u4ee5\u4e0b\u8b8a\u5316\u3002

  • \u67e5\u8a62\u5143\u7d20\uff1a\u8f38\u5165 key \uff0c\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4e26\u5c0d\u6bd4 key \u4ee5\u67e5\u8a62\u76ee\u6a19\u9375\u503c\u5c0d\u3002
  • \u65b0\u589e\u5143\u7d20\uff1a\u9996\u5148\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u5c07\u7bc0\u9ede\uff08\u9375\u503c\u5c0d\uff09\u65b0\u589e\u5230\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
  • \u522a\u9664\u5143\u7d20\uff1a\u6839\u64da\u96dc\u6e4a\u51fd\u5f0f\u7684\u7d50\u679c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u63a5\u8457\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4ee5\u67e5\u8a62\u76ee\u6a19\u7bc0\u9ede\u4e26\u5c07\u5176\u522a\u9664\u3002

\u93c8\u5f0f\u4f4d\u5740\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

  • \u4f54\u7528\u7a7a\u9593\u589e\u5927\uff1a\u93c8\u7d50\u4e32\u5217\u5305\u542b\u7bc0\u9ede\u6307\u6a19\uff0c\u5b83\u76f8\u6bd4\u9663\u5217\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u67e5\u8a62\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u70ba\u9700\u8981\u7dda\u6027\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u5c0d\u61c9\u5143\u7d20\u3002

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u7d66\u51fa\u4e86\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u7c21\u55ae\u5be6\u73fe\uff0c\u9700\u8981\u6ce8\u610f\u5169\u9ede\u3002

  • \u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\uff0c\u5f9e\u800c\u7c21\u5316\u7a0b\u5f0f\u78bc\u3002\u5728\u9019\u7a2e\u8a2d\u5b9a\u4e0b\uff0c\u96dc\u6e4a\u8868\uff08\u9663\u5217\uff09\u5305\u542b\u591a\u500b\u6876\uff0c\u6bcf\u500b\u6876\u90fd\u662f\u4e00\u500b\u4e32\u5217\u3002
  • \u4ee5\u4e0b\u5be6\u73fe\u5305\u542b\u96dc\u6e4a\u8868\u64f4\u5bb9\u65b9\u6cd5\u3002\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(\\frac{2}{3}\\) \u6642\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
class HashMapChaining:\n    \"\"\"\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u9663\u5217\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
hash_map_chaining.cpp
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;                   // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres;               // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;                // \u64f4\u5bb9\u500d\u6578\n    vector<vector<Pair *>> buckets; // \u6876\u9663\u5217\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n                delete tmp;                       // \u91cb\u653e\u8a18\u61b6\u9ad4\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
hash_map_chaining.java
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
hash_map_chaining.cs
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
hash_map_chaining.go
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int      // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int      // \u64f4\u5bb9\u500d\u6578\n    buckets     [][]pair // \u6876\u9663\u5217\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u522a\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
hash_map_chaining.swift
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [[Pair]] // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
hash_map_chaining.js
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.ts
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    #buckets: Pair[][]; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
hash_map_chaining.dart
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  late int size; // \u9375\u503c\u5c0d\u6578\u91cf\n  late int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  late double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  late int extendRatio; // \u64f4\u5bb9\u500d\u6578\n  late List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
hash_map_chaining.rs
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u5efa\u69cb\u5b50 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        None\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        None\n    }\n}\n
hash_map_chaining.c
/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Node **buckets;   // \u6876\u9663\u5217\n} HashMapChaining;\n\n/* \u5efa\u69cb\u5b50 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
hash_map_chaining.kt
/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    val extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        // mutablelist \u7121\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
hash_map_chaining.rb
### \u9375\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapChaining\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) { [] } # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
hash_map_chaining.zig
[class]{HashMapChaining}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u5f88\u9577\u6642\uff0c\u67e5\u8a62\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u6642\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u201cAVL \u6a39\u201d\u6216\u201c\u7d05\u9ed1\u6a39\u201d\uff0c\u5f9e\u800c\u5c07\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002

"},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u958b\u653e\u5b9a\u5740","text":"

\u958b\u653e\u5b9a\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u800c\u662f\u900f\u904e\u201c\u591a\u6b21\u63a2\u6e2c\u201d\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\uff0c\u63a2\u6e2c\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\u7b49\u3002

\u4e0b\u9762\u4ee5\u7dda\u6027\u63a2\u67e5\u70ba\u4f8b\uff0c\u4ecb\u7d39\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u6a5f\u5236\u3002

"},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7dda\u6027\u63a2\u67e5","text":"

\u7dda\u6027\u63a2\u67e5\u63a1\u7528\u56fa\u5b9a\u6b65\u9577\u7684\u7dda\u6027\u641c\u5c0b\u4f86\u9032\u884c\u63a2\u6e2c\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u8207\u666e\u901a\u96dc\u6e4a\u8868\u6709\u6240\u4e0d\u540c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u767c\u73fe\u6876\u5167\u5df2\u6709\u5143\u7d20\uff0c\u5247\u5f9e\u885d\u7a81\u4f4d\u7f6e\u5411\u5f8c\u7dda\u6027\u8d70\u8a2a\uff08\u6b65\u9577\u901a\u5e38\u70ba \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c07\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u82e5\u767c\u73fe\u96dc\u6e4a\u885d\u7a81\uff0c\u5247\u4f7f\u7528\u76f8\u540c\u6b65\u9577\u5411\u5f8c\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u76f4\u5230\u627e\u5230\u5c0d\u61c9\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8aaa\u660e\u76ee\u6a19\u5143\u7d20\u4e0d\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

\u5716 6-6 \u5c55\u793a\u4e86\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48\u3002\u6839\u64da\u6b64\u96dc\u6e4a\u51fd\u5f0f\uff0c\u6700\u5f8c\u5169\u4f4d\u76f8\u540c\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u900f\u904e\u7dda\u6027\u63a2\u67e5\uff0c\u5b83\u5011\u88ab\u4f9d\u6b21\u5132\u5b58\u5728\u8a72\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

\u5716 6-6 \u00a0 \u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48

\u7136\u800c\uff0c\u7dda\u6027\u63a2\u67e5\u5bb9\u6613\u7522\u751f\u201c\u805a\u96c6\u73fe\u8c61\u201d\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u9663\u5217\u4e2d\u9023\u7e8c\u88ab\u4f54\u7528\u7684\u4f4d\u7f6e\u8d8a\u9577\uff0c\u9019\u4e9b\u9023\u7e8c\u4f4d\u7f6e\u767c\u751f\u96dc\u6e4a\u885d\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u5f9e\u800c\u9032\u4e00\u6b65\u4fc3\u4f7f\u8a72\u4f4d\u7f6e\u7684\u805a\u5806\u7a4d\u751f\u9577\uff0c\u5f62\u6210\u60e1\u6027\u8ff4\u5708\uff0c\u6700\u7d42\u5c0e\u81f4\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u5011\u4e0d\u80fd\u5728\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u4e2d\u76f4\u63a5\u522a\u9664\u5143\u7d20\u3002\u9019\u662f\u56e0\u70ba\u522a\u9664\u5143\u7d20\u6703\u5728\u9663\u5217\u5167\u7522\u751f\u4e00\u500b\u7a7a\u6876 None \uff0c\u800c\u7576\u67e5\u8a62\u5143\u7d20\u6642\uff0c\u7dda\u6027\u63a2\u67e5\u5230\u8a72\u7a7a\u6876\u5c31\u6703\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8a72\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u7121\u6cd5\u518d\u88ab\u8a2a\u554f\u5230\uff0c\u7a0b\u5f0f\u53ef\u80fd\u8aa4\u5224\u9019\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u5716 6-7 \u6240\u793a\u3002

\u5716 6-7 \u00a0 \u5728\u958b\u653e\u5b9a\u5740\u4e2d\u522a\u9664\u5143\u7d20\u5c0e\u81f4\u7684\u67e5\u8a62\u554f\u984c

\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u61f6\u522a\u9664\uff08lazy deletion\uff09\u6a5f\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u5f9e\u96dc\u6e4a\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u500b\u5e38\u6578 TOMBSTONE \u4f86\u6a19\u8a18\u9019\u500b\u6876\u3002\u5728\u8a72\u6a5f\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u9375\u503c\u5c0d\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7dda\u6027\u63a2\u67e5\u5230 TOMBSTONE \u6642\u61c9\u8a72\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u56e0\u70ba\u5176\u4e4b\u4e0b\u53ef\u80fd\u9084\u5b58\u5728\u9375\u503c\u5c0d\u3002

\u7136\u800c\uff0c\u61f6\u522a\u9664\u53ef\u80fd\u6703\u52a0\u901f\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u9000\u5316\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u6b21\u522a\u9664\u64cd\u4f5c\u90fd\u6703\u7522\u751f\u4e00\u500b\u522a\u9664\u6a19\u8a18\uff0c\u96a8\u8457 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u5c0b\u6642\u9593\u4e5f\u6703\u589e\u52a0\uff0c\u56e0\u70ba\u7dda\u6027\u63a2\u67e5\u53ef\u80fd\u9700\u8981\u8df3\u904e\u591a\u500b TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6a19\u5143\u7d20\u3002

\u70ba\u6b64\uff0c\u8003\u616e\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\u8a18\u9304\u9047\u5230\u7684\u9996\u500b TOMBSTONE \u7684\u7d22\u5f15\uff0c\u4e26\u5c07\u641c\u5c0b\u5230\u7684\u76ee\u6a19\u5143\u7d20\u8207\u8a72 TOMBSTONE \u4ea4\u63db\u4f4d\u7f6e\u3002\u9019\u6a23\u505a\u7684\u597d\u8655\u662f\u7576\u6bcf\u6b21\u67e5\u8a62\u6216\u65b0\u589e\u5143\u7d20\u6642\uff0c\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u81f3\u8ddd\u96e2\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6e2c\u8d77\u59cb\u9ede\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u5f9e\u800c\u6700\u4f73\u5316\u67e5\u8a62\u6548\u7387\u3002

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u5305\u542b\u61f6\u522a\u9664\u7684\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u3002\u70ba\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u770b\u4f5c\u4e00\u500b\u201c\u74b0\u5f62\u9663\u5217\u201d\uff0c\u7576\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
class HashMapOpenAddressing:\n    \"\"\"\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u9663\u5217\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u522a\u9664\u6a19\u8a18\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
hash_map_open_addressing.cpp
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4;                     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    const int extendRatio = 2;            // \u64f4\u5bb9\u500d\u6578\n    vector<Pair *> buckets;               // \u6876\u9663\u5217\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
hash_map_open_addressing.java
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    private int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private final int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    private Pair[] buckets; // \u6876\u9663\u5217\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.cs
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    Pair[] buckets; // \u6876\u9663\u5217\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.go
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int     // \u64f4\u5bb9\u500d\u6578\n    buckets     []*pair // \u6876\u9663\u5217\n    TOMBSTONE   *pair   // \u522a\u9664\u6a19\u8a18\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u64da\u9375\u8a08\u7b97\u96dc\u6e4a\u503c\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8a08\u7b97\u7576\u524d\u8ca0\u8f09\u56e0\u5b50\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u7372\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8a18\u9304\u9047\u5230\u7684\u7b2c\u4e00\u500bTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7dda\u6027\u63a2\u67e5\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    }\n    return \"\" // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val\n    }\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        h.size--\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
hash_map_open_addressing.swift
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [Pair?] // \u6876\u9663\u5217\n    var TOMBSTONE: Pair // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.js
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n    #TOMBSTONE; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.#capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.#extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u9663\u5217\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.ts
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    private capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    private buckets: Array<Pair | null>; // \u6876\u9663\u5217\n    private TOMBSTONE: Pair; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u9663\u5217\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.dart
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u9375\u503c\u5c0d\u6578\u91cf\n  int _capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  int _extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n  late List<Pair?> _buckets; // \u6876\u9663\u5217\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
hash_map_open_addressing.rs
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity: usize,            // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extend_ratio: usize,        // \u64f4\u5bb9\u500d\u6578\n    buckets: Vec<Option<Pair>>, // \u6876\u9663\u5217\n    TOMBSTONE: Option<Pair>,    // \u522a\u9664\u6a19\u8a18\n}\n\nimpl HashMapOpenAddressing {\n    /* \u5efa\u69cb\u5b50 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u5efa\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        None\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
hash_map_open_addressing.c
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Pair **buckets;   // \u6876\u9663\u5217\n    Pair *TOMBSTONE;  // \u522a\u9664\u6a19\u8a18\n} HashMapOpenAddressing;\n\n/* \u5efa\u69cb\u5b50 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\";\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
hash_map_open_addressing.kt
/* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u9375\u503c\u5c0d\u6578\u91cf\n    private var capacity: Int           // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private val extendRatio: Int        // \u64f4\u5bb9\u500d\u6578\n    private var buckets: Array<Pair?>   // \u6876\u9663\u5217\n    private val TOMBSTONE: Pair         // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
hash_map_open_addressing.rb
### \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u522a\u9664\u6a19\u8a18\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u958b\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
hash_map_open_addressing.zig
[class]{HashMapOpenAddressing}-[func]{}\n
"},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6e2c","text":"

\u5e73\u65b9\u63a2\u6e2c\u8207\u7dda\u6027\u63a2\u67e5\u985e\u4f3c\uff0c\u90fd\u662f\u958b\u653e\u5b9a\u5740\u7684\u5e38\u898b\u7b56\u7565\u4e4b\u4e00\u3002\u7576\u767c\u751f\u885d\u7a81\u6642\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e0d\u662f\u7c21\u55ae\u5730\u8df3\u904e\u4e00\u500b\u56fa\u5b9a\u7684\u6b65\u6578\uff0c\u800c\u662f\u8df3\u904e\u201c\u63a2\u6e2c\u6b21\u6578\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6578\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

\u5e73\u65b9\u63a2\u6e2c\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u512a\u52e2\u3002

  • \u5e73\u65b9\u63a2\u6e2c\u900f\u904e\u8df3\u904e\u63a2\u6e2c\u6b21\u6578\u5e73\u65b9\u7684\u8ddd\u96e2\uff0c\u8a66\u5716\u7de9\u89e3\u7dda\u6027\u63a2\u67e5\u7684\u805a\u96c6\u6548\u61c9\u3002
  • \u5e73\u65b9\u63a2\u6e2c\u6703\u8df3\u904e\u66f4\u5927\u7684\u8ddd\u96e2\u4f86\u5c0b\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u65bc\u8cc7\u6599\u5206\u4f48\u5f97\u66f4\u52a0\u5747\u52fb\u3002

\u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e26\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

  • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73fe\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u4f54\u7528\u3002
  • \u7531\u65bc\u5e73\u65b9\u7684\u589e\u9577\uff0c\u5e73\u65b9\u63a2\u6e2c\u53ef\u80fd\u4e0d\u6703\u63a2\u6e2c\u6574\u500b\u96dc\u6e4a\u8868\uff0c\u9019\u610f\u5473\u8457\u5373\u4f7f\u96dc\u6e4a\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e5f\u53ef\u80fd\u7121\u6cd5\u8a2a\u554f\u5230\u5b83\u3002
"},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u96dc\u6e4a","text":"

\u9867\u540d\u601d\u7fa9\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u9032\u884c\u63a2\u6e2c\u3002

  • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\) \u51fa\u73fe\u885d\u7a81\uff0c\u5247\u5617\u8a66 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u5f8c\u63d2\u5165\u5143\u7d20\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u96dc\u6e4a\u51fd\u5f0f\u9806\u5e8f\u4e0b\u9032\u884c\u67e5\u8a62\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6642\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5617\u8a66\u6240\u6709\u96dc\u6e4a\u51fd\u5f0f\uff0c\u8aaa\u660e\u96dc\u6e4a\u8868\u4e2d\u4e0d\u5b58\u5728\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de None \u3002

\u8207\u7dda\u6027\u63a2\u67e5\u76f8\u6bd4\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u6703\u5e36\u4f86\u984d\u5916\u7684\u8a08\u7b97\u91cf\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\uff09\u96dc\u6e4a\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u201d\u7684\u554f\u984c\u3002

"},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u9078\u64c7","text":"

\u5404\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u7b56\u7565\uff0c\u4e0b\u9762\u8209\u5e7e\u500b\u4f8b\u5b50\u3002

  • Python \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u507d\u96a8\u6a5f\u6578\u9032\u884c\u63a2\u6e2c\u3002
  • Java \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002\u81ea JDK 1.8 \u4ee5\u4f86\uff0c\u7576 HashMap \u5167\u9663\u5217\u9577\u5ea6\u9054\u5230 64 \u4e14\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u9054\u5230 8 \u6642\uff0c\u93c8\u7d50\u4e32\u5217\u6703\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u80fd\u3002
  • Go \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002Go \u898f\u5b9a\u6bcf\u500b\u6876\u6700\u591a\u5132\u5b58 8 \u500b\u9375\u503c\u5c0d\uff0c\u8d85\u51fa\u5bb9\u91cf\u5247\u9023\u7dda\u4e00\u500b\u6ea2\u4f4d\u6876\uff1b\u7576\u6ea2\u4f4d\u6876\u904e\u591a\u6642\uff0c\u6703\u57f7\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u64f4\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u78ba\u4fdd\u6548\u80fd\u3002
"},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u96dc\u6e4a\u8868","text":"

\u96dc\u6e4a\u8868\uff08hash table\uff09\uff0c\u53c8\u7a31\u6563\u5217\u8868\uff0c\u5b83\u900f\u904e\u5efa\u7acb\u9375 key \u8207\u503c value \u4e4b\u9593\u7684\u5c0d\u6620\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u3002\u5177\u9ad4\u800c\u8a00\uff0c\u6211\u5011\u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u4e00\u500b\u9375 key \uff0c\u5247\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u5c0d\u61c9\u7684\u503c value \u3002

\u5982\u5716 6-1 \u6240\u793a\uff0c\u7d66\u5b9a \\(n\\) \u500b\u5b78\u751f\uff0c\u6bcf\u500b\u5b78\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b78\u865f\u201d\u5169\u9805\u8cc7\u6599\u3002\u5047\u5982\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u201c\u8f38\u5165\u4e00\u500b\u5b78\u865f\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u59d3\u540d\u201d\u7684\u67e5\u8a62\u529f\u80fd\uff0c\u5247\u53ef\u4ee5\u63a1\u7528\u5716 6-1 \u6240\u793a\u7684\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002

\u5716 6-1 \u00a0 \u96dc\u6e4a\u8868\u7684\u62bd\u8c61\u8868\u793a

\u9664\u96dc\u6e4a\u8868\u5916\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e5f\u53ef\u4ee5\u5be6\u73fe\u67e5\u8a62\u529f\u80fd\uff0c\u5b83\u5011\u7684\u6548\u7387\u5c0d\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

  • \u65b0\u589e\u5143\u7d20\uff1a\u50c5\u9700\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
  • \u67e5\u8a62\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u662f\u4e82\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u8d70\u8a2a\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u522a\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8a62\u5230\u5143\u7d20\uff0c\u518d\u5f9e\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u4e2d\u522a\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002

\u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8a62\u6548\u7387\u5c0d\u6bd4

\u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u96dc\u6e4a\u8868 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u65b0\u589e\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

\u89c0\u5bdf\u767c\u73fe\uff0c\u5728\u96dc\u6e4a\u8868\u4e2d\u9032\u884c\u589e\u522a\u67e5\u6539\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u96dc\u6e4a\u8868\u5e38\u7528\u64cd\u4f5c","text":"

\u96dc\u6e4a\u8868\u7684\u5e38\u898b\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8a62\u64cd\u4f5c\u3001\u65b0\u589e\u9375\u503c\u5c0d\u548c\u522a\u9664\u9375\u503c\u5c0d\u7b49\uff0c\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap: dict = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.pop(10583)\n
hash_map.cpp
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nunordered_map<int, string> map;\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.erase(10583);\n
hash_map.java
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u56c9\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9d28\");\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
hash_map.cs
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nDictionary<int, string> map = new() {\n    /* \u65b0\u589e\u64cd\u4f5c */\n    // \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u56c9\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9d28\" }\n};\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.Remove(10583);\n
hash_map_test.go
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nhmap := make(map[int]string)\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\ndelete(hmap, 10583)\n
hash_map.swift
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.removeValue(forKey: 10583)\n
hash_map.js
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\n
hash_map.ts
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map<number, string>();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\nconsole.info('\\n\u65b0\u589e\u5b8c\u6210\u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f38\u5165\u5b78\u865f 15937 \uff0c\u67e5\u8a62\u5230\u59d3\u540d ' + name);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\nconsole.info('\\n\u522a\u9664 10583 \u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n
hash_map.dart
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<int, String> map = {};\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
hash_map.rs
use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u56c9\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9d28\".to_string());\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
hash_map.kt
/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583)\n
hash_map.rb
# \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.delete(10583)\n
hash_map.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u96dc\u6e4a\u8868\u6709\u4e09\u7a2e\u5e38\u7528\u7684\u8d70\u8a2a\u65b9\u5f0f\uff1a\u8d70\u8a2a\u9375\u503c\u5c0d\u3001\u8d70\u8a2a\u9375\u548c\u8d70\u8a2a\u503c\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
# \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key in hmap.keys():\n    print(key)\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nfor value in hmap.values():\n    print(value)\n
hash_map.cpp
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u8d70\u8a2a key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
hash_map.java
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
hash_map.cs
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
hash_map_test.go
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
hash_map.swift
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys {\n    print(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values {\n    print(value)\n}\n
hash_map.js
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.ts
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
hash_map.dart
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
hash_map.rs
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
hash_map.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
hash_map.kt
/* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (key in map.keys) {\n    println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
hash_map.rb
# \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nhmap.keys.each { |key| puts key }\n\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nhmap.values.each { |val| puts val }\n
hash_map.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u96dc\u6e4a\u8868\u7c21\u55ae\u5be6\u73fe","text":"

\u6211\u5011\u5148\u8003\u616e\u6700\u7c21\u55ae\u7684\u60c5\u6cc1\uff0c\u50c5\u7528\u4e00\u500b\u9663\u5217\u4f86\u5be6\u73fe\u96dc\u6e4a\u8868\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5c07\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u7a7a\u4f4d\u7a31\u70ba\u6876\uff08bucket\uff09\uff0c\u6bcf\u500b\u6876\u53ef\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u56e0\u6b64\uff0c\u67e5\u8a62\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5c0d\u61c9\u7684\u6876\uff0c\u4e26\u5728\u6876\u4e2d\u7372\u53d6 value \u3002

\u90a3\u9ebc\uff0c\u5982\u4f55\u57fa\u65bc key \u5b9a\u4f4d\u5c0d\u61c9\u7684\u6876\u5462\uff1f\u9019\u662f\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\uff08hash function\uff09\u5be6\u73fe\u7684\u3002\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u8f38\u51fa\u7a7a\u9593\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8f38\u5165\u7a7a\u9593\u662f\u6240\u6709 key \uff0c\u8f38\u51fa\u7a7a\u9593\u662f\u6240\u6709\u6876\uff08\u9663\u5217\u7d22\u5f15\uff09\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u8f38\u5165\u4e00\u500b key \uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u8a72 key \u5c0d\u61c9\u7684\u9375\u503c\u5c0d\u5728\u9663\u5217\u4e2d\u7684\u5132\u5b58\u4f4d\u7f6e\u3002

\u8f38\u5165\u4e00\u500b key \uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u904e\u7a0b\u5206\u70ba\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u900f\u904e\u67d0\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u8a08\u7b97\u5f97\u5230\u96dc\u6e4a\u503c\u3002
  2. \u5c07\u96dc\u6e4a\u503c\u5c0d\u6876\u6578\u91cf\uff08\u9663\u5217\u9577\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u5f9e\u800c\u7372\u53d6\u8a72 key \u5c0d\u61c9\u7684\u9663\u5217\u7d22\u5f15 index \u3002
index = hash(key) % capacity\n

\u96a8\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u96dc\u6e4a\u8868\u4e2d\u8a2a\u554f\u5c0d\u61c9\u7684\u6876\uff0c\u5f9e\u800c\u7372\u53d6 value \u3002

\u8a2d\u9663\u5217\u9577\u5ea6 capacity = 100\u3001\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u96dc\u6e4a\u51fd\u5f0f\u70ba key % 100 \u3002\u5716 6-2 \u4ee5 key \u5b78\u865f\u548c value \u59d3\u540d\u70ba\u4f8b\uff0c\u5c55\u793a\u4e86\u96dc\u6e4a\u51fd\u5f0f\u7684\u5de5\u4f5c\u539f\u7406\u3002

\u5716 6-2 \u00a0 \u96dc\u6e4a\u51fd\u5f0f\u5de5\u4f5c\u539f\u7406

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u7c21\u55ae\u96dc\u6e4a\u8868\u3002\u5176\u4e2d\uff0c\u6211\u5011\u5c07 key \u548c value \u5c01\u88dd\u6210\u4e00\u500b\u985e\u5225 Pair \uff0c\u4ee5\u8868\u793a\u9375\u503c\u5c0d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
class Pair:\n    \"\"\"\u9375\u503c\u5c0d\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
array_hash_map.cpp
/* \u9375\u503c\u5c0d */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\u4e26\u7f6e\u70ba nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
array_hash_map.java
/* \u9375\u503c\u5c0d */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.cs
/* \u9375\u503c\u5c0d int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
array_hash_map.go
/* \u9375\u503c\u5c0d */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    a.buckets[index] = nil\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u5c0d */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375 */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u7372\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
array_hash_map.swift
/* \u9375\u503c\u5c0d */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = nil\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
array_hash_map.js
/* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.ts
/* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
array_hash_map.dart
/* \u9375\u503c\u5c0d */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375 */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
array_hash_map.rs
/* \u9375\u503c\u5c0d */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
array_hash_map.c
/* \u9375\u503c\u5c0d int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u5efa\u69cb\u5b50 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375 */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u7372\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u5217\u5370\u96dc\u6e4a\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
array_hash_map.kt
/* \u9375\u503c\u5c0d */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
array_hash_map.rb
### \u9375\u503c\u5c0d ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 ###\nclass ArrayHashMap\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375 ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
array_hash_map.zig
// \u9375\u503c\u5c0d\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u500b\u9577\u5ea6\u70ba 100 \u7684\u6876\uff08\u9663\u5217\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u96dc\u6e4a\u51fd\u5f0f\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8a62\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u65b0\u589e\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u522a\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u7372\u53d6\u6240\u6709\u9375\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u7372\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u5217\u5370\u96dc\u6e4a\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u8207\u64f4\u5bb9","text":"

\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u6240\u6709 key \u69cb\u6210\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u9663\u5217\u6240\u6709\u7d22\u5f15\u69cb\u6210\u7684\u8f38\u51fa\u7a7a\u9593\uff0c\u800c\u8f38\u5165\u7a7a\u9593\u5f80\u5f80\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7406\u8ad6\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u76f8\u540c\u8f38\u51fa\u201d\u7684\u60c5\u6cc1\u3002

\u5c0d\u65bc\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u96dc\u6e4a\u51fd\u5f0f\uff0c\u7576\u8f38\u5165\u7684 key \u5f8c\u5169\u4f4d\u76f8\u540c\u6642\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u51fa\u7d50\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8a62\u5b78\u865f\u70ba 12836 \u548c 20336 \u7684\u5169\u500b\u5b78\u751f\u6642\uff0c\u6211\u5011\u5f97\u5230\uff1a

12836 % 100 = 36\n20336 % 100 = 36\n

\u5982\u5716 6-3 \u6240\u793a\uff0c\u5169\u500b\u5b78\u865f\u6307\u5411\u4e86\u540c\u4e00\u500b\u59d3\u540d\uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002\u6211\u5011\u5c07\u9019\u7a2e\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u540c\u4e00\u8f38\u51fa\u7684\u60c5\u6cc1\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\uff08hash collision\uff09\u3002

\u5716 6-3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u793a\u4f8b

\u5bb9\u6613\u60f3\u5230\uff0c\u96dc\u6e4a\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u500b key \u88ab\u5206\u914d\u5230\u540c\u4e00\u500b\u6876\u4e2d\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\uff0c\u885d\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002

\u5982\u5716 6-4 \u6240\u793a\uff0c\u64f4\u5bb9\u524d\u9375\u503c\u5c0d (136, A) \u548c (236, D) \u767c\u751f\u885d\u7a81\uff0c\u64f4\u5bb9\u5f8c\u885d\u7a81\u6d88\u5931\u3002

\u5716 6-4 \u00a0 \u96dc\u6e4a\u8868\u64f4\u5bb9

\u985e\u4f3c\u65bc\u9663\u5217\u64f4\u5bb9\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u5c07\u6240\u6709\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u9077\u79fb\u81f3\u65b0\u96dc\u6e4a\u8868\uff0c\u975e\u5e38\u8017\u6642\uff1b\u4e26\u4e14\u7531\u65bc\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u6539\u8b8a\uff0c\u6211\u5011\u9700\u8981\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u4f86\u91cd\u65b0\u8a08\u7b97\u6240\u6709\u9375\u503c\u5c0d\u7684\u5132\u5b58\u4f4d\u7f6e\uff0c\u9019\u9032\u4e00\u6b65\u589e\u52a0\u4e86\u64f4\u5bb9\u904e\u7a0b\u7684\u8a08\u7b97\u958b\u92b7\u3002\u70ba\u6b64\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u9810\u7559\u8db3\u5920\u5927\u7684\u96dc\u6e4a\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\u3002

\u8ca0\u8f09\u56e0\u5b50\uff08load factor\uff09\u662f\u96dc\u6e4a\u8868\u7684\u4e00\u500b\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u7684\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u7528\u65bc\u8861\u91cf\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u89f8\u767c\u689d\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(0.75\\) \u6642\uff0c\u7cfb\u7d71\u6703\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

"},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u8f38\u5165 key \uff0c\u96dc\u6e4a\u8868\u80fd\u5920\u5728 \\(O(1)\\) \u6642\u9593\u5167\u67e5\u8a62\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
  • \u5e38\u898b\u7684\u96dc\u6e4a\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8a62\u3001\u65b0\u589e\u9375\u503c\u5c0d\u3001\u522a\u9664\u9375\u503c\u5c0d\u548c\u8d70\u8a2a\u96dc\u6e4a\u8868\u7b49\u3002
  • \u96dc\u6e4a\u51fd\u5f0f\u5c07 key \u5c0d\u6620\u70ba\u9663\u5217\u7d22\u5f15\uff0c\u5f9e\u800c\u8a2a\u554f\u5c0d\u61c9\u6876\u4e26\u7372\u53d6 value \u3002
  • \u5169\u500b\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f8c\u5f97\u5230\u76f8\u540c\u7684\u9663\u5217\u7d22\u5f15\uff0c\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u51fa\u932f\uff0c\u9019\u7a2e\u73fe\u8c61\u88ab\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\u3002
  • \u96dc\u6e4a\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\u3002\u8207\u9663\u5217\u64f4\u5bb9\u985e\u4f3c\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u64cd\u4f5c\u7684\u958b\u92b7\u5f88\u5927\u3002
  • \u8ca0\u8f09\u56e0\u5b50\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u4e2d\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u53cd\u6620\u4e86\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89f8\u767c\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u689d\u4ef6\u3002
  • \u93c8\u5f0f\u4f4d\u5740\u900f\u904e\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u5316\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u6240\u6709\u885d\u7a81\u5143\u7d20\u5132\u5b58\u5728\u540c\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6703\u964d\u4f4e\u67e5\u8a62\u6548\u7387\uff0c\u53ef\u4ee5\u900f\u904e\u9032\u4e00\u6b65\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4f86\u63d0\u9ad8\u6548\u7387\u3002
  • \u958b\u653e\u5b9a\u5740\u900f\u904e\u591a\u6b21\u63a2\u6e2c\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\u3002\u7dda\u6027\u63a2\u67e5\u4f7f\u7528\u56fa\u5b9a\u6b65\u9577\uff0c\u7f3a\u9ede\u662f\u4e0d\u80fd\u522a\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u7522\u751f\u805a\u96c6\u3002\u591a\u6b21\u96dc\u6e4a\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u9032\u884c\u63a2\u6e2c\uff0c\u76f8\u8f03\u7dda\u6027\u63a2\u67e5\u66f4\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u589e\u52a0\u4e86\u8a08\u7b97\u91cf\u3002
  • \u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u93c8\u5f0f\u4f4d\u5740\uff0c\u800c Python \u7684 Dict \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002
  • \u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5e0c\u671b\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5177\u6709\u78ba\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u52fb\u5206\u4f48\u7684\u7279\u9ede\u3002\u5728\u5bc6\u78bc\u5b78\u4e2d\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9084\u61c9\u8a72\u5177\u5099\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u61c9\u3002
  • \u96dc\u6e4a\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u5747\u52fb\u5206\u4f48\uff0c\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002
  • \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u65bc\u6821\u9a57\u6a94\u6848\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u65bc\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u3002
  • \u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u662f\u53ef\u96dc\u6e4a\u7684\u3002
"},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f \\(O(n)\\) \uff1f

\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u7576\u96dc\u6e4a\u51fd\u5f0f\u8a2d\u8a08\u5f97\u6bd4\u8f03\u597d\u3001\u5bb9\u91cf\u8a2d\u5b9a\u6bd4\u8f03\u5408\u7406\u3001\u885d\u7a81\u6bd4\u8f03\u5e73\u5747\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u5011\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u96dc\u6e4a\u8868\u6642\uff0c\u901a\u5e38\u8a8d\u70ba\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u4e0d\u4f7f\u7528\u96dc\u6e4a\u51fd\u5f0f \\(f(x) = x\\) \u5462\uff1f\u9019\u6a23\u5c31\u4e0d\u6703\u6709\u885d\u7a81\u4e86\u3002

\u5728 \\(f(x) = x\\) \u96dc\u6e4a\u51fd\u5f0f\u4e0b\uff0c\u6bcf\u500b\u5143\u7d20\u5c0d\u61c9\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u9019\u8207\u9663\u5217\u7b49\u50f9\u3002\u7136\u800c\uff0c\u8f38\u5165\u7a7a\u9593\u901a\u5e38\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff08\u9663\u5217\u9577\u5ea6\uff09\uff0c\u56e0\u6b64\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96dc\u6e4a\u8868\u7684\u76ee\u6a19\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u72c0\u614b\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u7a7a\u9593\uff0c\u4e26\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8a62\u6548\u7387\u3002

Q\uff1a\u96dc\u6e4a\u8868\u5e95\u5c64\u5be6\u73fe\u662f\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u4e8c\u5143\u6a39\uff0c\u4f46\u70ba\u4ec0\u9ebc\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u5011\u66f4\u9ad8\u5462\uff1f

\u9996\u5148\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u6548\u7387\u8b8a\u9ad8\uff0c\u4f46\u7a7a\u9593\u6548\u7387\u8b8a\u4f4e\u4e86\u3002\u96dc\u6e4a\u8868\u6709\u76f8\u7576\u4e00\u90e8\u5206\u8a18\u61b6\u9ad4\u672a\u4f7f\u7528\u3002

\u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u5834\u666f\u4e0b\u6642\u9593\u6548\u7387\u8b8a\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u500b\u529f\u80fd\u80fd\u5920\u5728\u76f8\u540c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u4f7f\u7528\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u90a3\u9ebc\u901a\u5e38\u6bd4\u96dc\u6e4a\u8868\u66f4\u5feb\u3002\u9019\u662f\u56e0\u70ba\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u9700\u8981\u958b\u92b7\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u7684\u5e38\u6578\u9805\u66f4\u5927\u3002

\u6700\u5f8c\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u80fd\u767c\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u93c8\u5f0f\u4f4d\u5740\u4e2d\uff0c\u6211\u5011\u63a1\u53d6\u5728\u93c8\u7d50\u4e32\u5217\u6216\u7d05\u9ed1\u6a39\u4e2d\u57f7\u884c\u67e5\u8a62\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u6642\u9593\u7684\u98a8\u96aa\u3002

Q\uff1a\u591a\u6b21\u96dc\u6e4a\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\u55ce\uff1f\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u9084\u80fd\u518d\u6b21\u4f7f\u7528\u55ce\uff1f

\u591a\u6b21\u96dc\u6e4a\u662f\u958b\u653e\u5b9a\u5740\u7684\u4e00\u7a2e\uff0c\u958b\u653e\u5b9a\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u900f\u904e\u6a19\u8a18\u522a\u9664\u3002\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u7576\u5c07\u65b0\u5143\u7d20\u63d2\u5165\u96dc\u6e4a\u8868\uff0c\u4e26\u4e14\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u4f4d\u7f6e\u6642\uff0c\u8a72\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u9019\u6a23\u505a\u65e2\u80fd\u4fdd\u6301\u96dc\u6e4a\u8868\u7684\u63a2\u6e2c\u5e8f\u5217\u4e0d\u8b8a\uff0c\u53c8\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\u4f7f\u7528\u7387\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\uff0c\u67e5\u8a62\u5143\u7d20\u7684\u6642\u5019\u6703\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u5462\uff1f

\u67e5\u8a62\u7684\u6642\u5019\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u5c0d\u61c9\u7684\u6876\u548c\u9375\u503c\u5c0d\uff0c\u767c\u73fe key \u4e0d\u5339\u914d\uff0c\u9019\u5c31\u4ee3\u8868\u6709\u96dc\u6e4a\u885d\u7a81\u3002\u56e0\u6b64\uff0c\u7dda\u6027\u63a2\u67e5\u6cd5\u6703\u6839\u64da\u9810\u5148\u8a2d\u5b9a\u7684\u6b65\u9577\u4f9d\u6b21\u5411\u4e0b\u67e5\u8a62\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u78ba\u7684\u9375\u503c\u5c0d\u6216\u7121\u6cd5\u627e\u5230\u8df3\u51fa\u70ba\u6b62\u3002

Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u64f4\u5bb9\u80fd\u5920\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\uff1f

\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\uff0c\u8b93\u8f38\u51fa\u503c\u843d\u5728\u9663\u5217\u7d22\u5f15\u7bc4\u570d\u5167\uff1b\u5728\u64f4\u5bb9\u5f8c\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u767c\u751f\u8b8a\u5316\uff0c\u800c key \u5c0d\u61c9\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u500b\u6876\u7684\u591a\u500b key \uff0c\u5728\u64f4\u5bb9\u5f8c\u53ef\u80fd\u6703\u88ab\u5206\u914d\u5230\u591a\u500b\u6876\u4e2d\uff0c\u5f9e\u800c\u5be6\u73fe\u96dc\u6e4a\u885d\u7a81\u7684\u7de9\u89e3\u3002

"},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806\u7a4d","text":"

Abstract

\u5806\u7a4d\u5c31\u50cf\u662f\u5c71\u5dbd\u5cf0\u5dd2\uff0c\u5c64\u758a\u8d77\u4f0f\u3001\u5f62\u614b\u5404\u7570\u3002

\u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u932f\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u7e3d\u662f\u6700\u5148\u6620\u5165\u773c\u7c3e\u3002

"},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 8.1 \u00a0 \u5806\u7a4d
  • 8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c
  • 8.3 \u00a0 Top-k \u554f\u984c
  • 8.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c","text":"

\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u4f86\u69cb\u5efa\u4e00\u500b\u5806\u7a4d\uff0c\u9019\u500b\u904e\u7a0b\u88ab\u7a31\u70ba\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u3002

"},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u85c9\u52a9\u5165\u5806\u7a4d\u64cd\u4f5c\u5be6\u73fe","text":"

\u6211\u5011\u9996\u5148\u5efa\u7acb\u4e00\u500b\u7a7a\u5806\u7a4d\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e32\u5217\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u5143\u7d20\u57f7\u884c\u201c\u5165\u5806\u7a4d\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u5806\u7a4d\u7684\u5c3e\u90e8\uff0c\u518d\u5c0d\u8a72\u5143\u7d20\u57f7\u884c\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u5806\u7a4d\u5316\u3002

\u6bcf\u7576\u4e00\u500b\u5143\u7d20\u5165\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u65bc\u7bc0\u9ede\u662f\u5f9e\u9802\u5230\u5e95\u4f9d\u6b21\u88ab\u65b0\u589e\u9032\u4e8c\u5143\u6a39\u7684\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u69cb\u5efa\u7684\u3002

\u8a2d\u5143\u7d20\u6578\u91cf\u70ba \\(n\\) \uff0c\u6bcf\u500b\u5143\u7d20\u7684\u5165\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u6642\u9593\uff0c\u56e0\u6b64\u8a72\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

"},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u900f\u904e\u8d70\u8a2a\u5806\u7a4d\u5316\u5be6\u73fe","text":"

\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5be6\u73fe\u4e00\u7a2e\u66f4\u70ba\u9ad8\u6548\u7684\u5efa\u5806\u7a4d\u65b9\u6cd5\uff0c\u5171\u5206\u70ba\u5169\u6b65\u3002

  1. \u5c07\u4e32\u5217\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u5730\u65b0\u589e\u5230\u5806\u7a4d\u4e2d\uff0c\u6b64\u6642\u5806\u7a4d\u7684\u6027\u8cea\u5c1a\u672a\u5f97\u5230\u6eff\u8db3\u3002
  2. \u5012\u5e8f\u8d70\u8a2a\u5806\u7a4d\uff08\u5c64\u5e8f\u8d70\u8a2a\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u975e\u8449\u7bc0\u9ede\u57f7\u884c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u3002

\u6bcf\u7576\u5806\u7a4d\u5316\u4e00\u500b\u7bc0\u9ede\u5f8c\uff0c\u4ee5\u8a72\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\u5c31\u5f62\u6210\u4e00\u500b\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\u3002\u800c\u7531\u65bc\u662f\u5012\u5e8f\u8d70\u8a2a\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u69cb\u5efa\u7684\u3002

\u4e4b\u6240\u4ee5\u9078\u64c7\u5012\u5e8f\u8d70\u8a2a\uff0c\u662f\u56e0\u70ba\u9019\u6a23\u80fd\u5920\u4fdd\u8b49\u7576\u524d\u7bc0\u9ede\u4e4b\u4e0b\u7684\u5b50\u6a39\u5df2\u7d93\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u9019\u6a23\u5806\u7a4d\u5316\u7576\u524d\u7bc0\u9ede\u624d\u662f\u6709\u6548\u7684\u3002

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u7531\u65bc\u8449\u7bc0\u9ede\u6c92\u6709\u5b50\u7bc0\u9ede\uff0c\u56e0\u6b64\u5b83\u5011\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u7121\u9808\u5806\u7a4d\u5316\u3002\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u6700\u5f8c\u4e00\u500b\u975e\u8449\u7bc0\u9ede\u662f\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u6211\u5011\u5f9e\u5b83\u958b\u59cb\u5012\u5e8f\u8d70\u8a2a\u4e26\u57f7\u884c\u5806\u7a4d\u5316\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def __init__(self, nums: list[int]):\n    \"\"\"\u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\"\"\"\n    # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    self.max_heap = nums\n    # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
my_heap.cpp
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(vector<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums;\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.java
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<Integer> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
my_heap.cs
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new List<int>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
my_heap.go
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        h.siftDown(i)\n    }\n    return h\n}\n
my_heap.swift
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\ninit(nums: [Int]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
my_heap.js
/* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
my_heap.ts
/* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums?: number[]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
my_heap.dart
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<int> nums) {\n  // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  _maxHeap = nums;\n  // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
my_heap.rs
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
my_heap.c
/* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\u7a4d\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
my_heap.kt
/* \u5927\u9802\u5806\u7a4d */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u4e32\u5217\u800c\u975e\u9663\u5217\uff0c\u9019\u6a23\u7121\u9808\u8003\u616e\u64f4\u5bb9\u554f\u984c\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\n    init {\n        // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n        maxHeap.addAll(nums!!)\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u63db\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    fun push(_val: Int) {\n        // \u65b0\u589e\u7bc0\u9ede\n        maxHeap.add(_val)\n        // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n            val p = parent(i)\n            // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, p)\n            // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806\u7a4d */\n    fun pop(): Int {\n        // \u5224\u7a7a\u8655\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u522a\u9664\u7bc0\u9ede\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n        return _val\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, ma)\n            // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n            i = ma\n        }\n    }\n\n    /* \u5217\u5370\u5806\u7a4d\uff08\u4e8c\u5143\u6a39\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
my_heap.rb
[class]{MaxHeap}-[func]{__init__}\n
my_heap.zig
// \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

\u4e0b\u9762\uff0c\u6211\u5011\u4f86\u5617\u8a66\u63a8\u7b97\u7b2c\u4e8c\u7a2e\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

  • \u5047\u8a2d\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u5247\u8449\u7bc0\u9ede\u6578\u91cf\u70ba \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u70ba\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u7a4d\u5316\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\((n - 1) / 2\\) \u3002
  • \u5728\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u7684\u904e\u7a0b\u4e2d\uff0c\u6bcf\u500b\u7bc0\u9ede\u6700\u591a\u5806\u7a4d\u5316\u5230\u8449\u7bc0\u9ede\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u70ba\u4e8c\u5143\u6a39\u9ad8\u5ea6 \\(\\log n\\) \u3002

\u5c07\u4e0a\u8ff0\u5169\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u7a4d\u904e\u7a0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u4f46\u9019\u500b\u4f30\u7b97\u7d50\u679c\u4e26\u4e0d\u6e96\u78ba\uff0c\u56e0\u70ba\u6211\u5011\u6c92\u6709\u8003\u616e\u5230\u4e8c\u5143\u6a39\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf\u9060\u591a\u65bc\u9802\u5c64\u7bc0\u9ede\u7684\u6027\u8cea\u3002

\u63a5\u4e0b\u4f86\u6211\u5011\u4f86\u9032\u884c\u66f4\u70ba\u6e96\u78ba\u7684\u8a08\u7b97\u3002\u70ba\u4e86\u964d\u4f4e\u8a08\u7b97\u96e3\u5ea6\uff0c\u5047\u8a2d\u7d66\u5b9a\u4e00\u500b\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \u3001\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff0c\u8a72\u5047\u8a2d\u4e0d\u6703\u5f71\u97ff\u8a08\u7b97\u7d50\u679c\u7684\u6b63\u78ba\u6027\u3002

\u5716 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u5404\u5c64\u7bc0\u9ede\u6578\u91cf

\u5982\u5716 8-5 \u6240\u793a\uff0c\u7bc0\u9ede\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u7b49\u65bc\u8a72\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u800c\u8a72\u8ddd\u96e2\u6b63\u662f\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u5404\u5c64\u7684\u201c\u7bc0\u9ede\u6578\u91cf \\(\\times\\) \u7bc0\u9ede\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u7bc0\u9ede\u7684\u5806\u7a4d\u5316\u8fed\u4ee3\u6b21\u6578\u7684\u7e3d\u548c\u3002

\\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

\u5316\u7c21\u4e0a\u5f0f\u9700\u8981\u85c9\u52a9\u4e2d\u5b78\u7684\u6578\u5217\u77e5\u8b58\uff0c\u5148\u5c07 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

\\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

\u4f7f\u7528\u932f\u4f4d\u76f8\u6e1b\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u6e1b\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

\\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

\u89c0\u5bdf\u4e0a\u5f0f\uff0c\u767c\u73fe \\(T(h)\\) \u662f\u4e00\u500b\u7b49\u6bd4\u6578\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

\\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

\u9032\u4e00\u6b65\uff0c\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u8907\u96dc\u5ea6\u70ba \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

"},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806\u7a4d","text":"

\u5806\u7a4d\uff08heap\uff09\u662f\u4e00\u7a2e\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u4e3b\u8981\u53ef\u5206\u70ba\u5169\u7a2e\u578b\u5225\uff0c\u5982\u5716 8-1 \u6240\u793a\u3002

  • \u5c0f\u9802\u5806\u7a4d\uff08min heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\leq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002
  • \u5927\u9802\u5806\u7a4d\uff08max heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\geq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002

\u5716 8-1 \u00a0 \u5c0f\u9802\u5806\u7a4d\u8207\u5927\u9802\u5806\u7a4d

\u5806\u7a4d\u4f5c\u70ba\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u6700\u5e95\u5c64\u7bc0\u9ede\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u3002
  • \u6211\u5011\u5c07\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u9802\u201d\uff0c\u5c07\u5e95\u5c64\u6700\u9760\u53f3\u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u5e95\u201d\u3002
  • \u5c0d\u65bc\u5927\u9802\u5806\u7a4d\uff08\u5c0f\u9802\u5806\u7a4d\uff09\uff0c\u5806\u7a4d\u9802\u5143\u7d20\uff08\u6839\u7bc0\u9ede\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
"},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u662f\u512a\u5148\u4f47\u5217\uff08priority queue\uff09\uff0c\u9019\u662f\u4e00\u7a2e\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b9a\u7fa9\u70ba\u5177\u6709\u512a\u5148\u9806\u5e8f\u6392\u5e8f\u7684\u4f47\u5217\u3002

\u5be6\u969b\u4e0a\uff0c\u5806\u7a4d\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u512a\u5148\u4f47\u5217\uff0c\u5927\u9802\u5806\u7a4d\u76f8\u7576\u65bc\u5143\u7d20\u6309\u5f9e\u5927\u5230\u5c0f\u7684\u9806\u5e8f\u51fa\u5217\u7684\u512a\u5148\u4f47\u5217\u3002\u5f9e\u4f7f\u7528\u89d2\u5ea6\u4f86\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u201c\u512a\u5148\u4f47\u5217\u201d\u548c\u201c\u5806\u7a4d\u201d\u770b\u4f5c\u7b49\u50f9\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u56e0\u6b64\uff0c\u672c\u66f8\u5c0d\u5169\u8005\u4e0d\u505a\u7279\u5225\u5340\u5206\uff0c\u7d71\u4e00\u7a31\u4f5c\u201c\u5806\u7a4d\u201d\u3002

\u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u898b\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

\u8868 8-1 \u00a0 \u5806\u7a4d\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\) pop() \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) peek() \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\uff08\u5c0d\u65bc\u5927 / \u5c0f\u9802\u5806\u7a4d\u5206\u5225\u70ba\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u7372\u53d6\u5806\u7a4d\u7684\u5143\u7d20\u6578\u91cf \\(O(1)\\) isEmpty() \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a \\(O(1)\\)

\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u5806\u7a4d\u985e\u5225\uff08\u6216\u512a\u5148\u4f47\u5217\u985e\u5225\uff09\u3002

\u985e\u4f3c\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u201c\u5f9e\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u5f9e\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u8a2d\u5b9a\u4e00\u500b flag \u6216\u4fee\u6539 Comparator \u5be6\u73fe\u201c\u5c0f\u9802\u5806\u7a4d\u201d\u8207\u201c\u5927\u9802\u5806\u7a4d\u201d\u4e4b\u9593\u7684\u8f49\u63db\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
# \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u7d44\u9810\u8a2d\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n# \u8003\u616e\u5c07\u201c\u5143\u7d20\u53d6\u8ca0\u201d\u5f8c\u518d\u5165\u5806\u7a4d\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5c07\u5927\u5c0f\u95dc\u4fc2\u985b\u5012\uff0c\u5f9e\u800c\u5be6\u73fe\u5927\u9802\u5806\u7a4d\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u6642\u5c0d\u61c9\u5c0f\u9802\u5806\u7a4d\uff0cflag = -1 \u6642\u5c0d\u61c9\u5927\u9802\u5806\u7a4d\n\n# \u5143\u7d20\u5165\u5806\u7a4d\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\n# \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u7372\u53d6\u5806\u7a4d\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
heap.cpp
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
heap.java
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
heap.cs
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
heap.go
// Go \u8a9e\u8a00\u4e2d\u53ef\u4ee5\u900f\u904e\u5be6\u73fe heap.Interface \u4f86\u69cb\u5efa\u6574\u6578\u5927\u9802\u5806\u7a4d\n// \u5be6\u73fe heap.Interface \u9700\u8981\u540c\u6642\u5be6\u73fe sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u63a8\u5165\u5143\u7d20\u5230\u5806\u7a4d\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u70ba\u53c3\u6578\n    // \u56e0\u70ba\u5b83\u5011\u4e0d\u50c5\u6703\u5c0d\u5207\u7247\u7684\u5167\u5bb9\u9032\u884c\u8abf\u6574\uff0c\u9084\u6703\u4fee\u6539\u5207\u7247\u7684\u9577\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u5f48\u51fa\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u7a4d\u5143\u7d20\u5b58\u653e\u5728\u6700\u5f8c\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\uff0c\u5247\u9700\u8981\u8abf\u6574\u70ba\u5c0f\u65bc\u865f\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806\u7a4d */\n    // \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u65b0\u589e\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u7a4d\u9802\u5143\u7d20\u70ba %d\\n\", top)\n\n    /* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u7a4d\u5143\u7d20\u6578\u91cf\u70ba %d\\n\", size)\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u7a4d\u662f\u5426\u70ba\u7a7a %t\\n\", isEmpty)\n}\n
heap.swift
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// Swift \u7684 Heap \u578b\u5225\u540c\u6642\u652f\u6301\u6700\u5927\u5806\u7a4d\u548c\u6700\u5c0f\u5806\u7a4d\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
heap.js
// JavaScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.ts
// TypeScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.dart
// Dart \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.rs
use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
heap.c
// C \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
heap.kt
/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
heap.rb
\n
heap.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7a4d\u7684\u5be6\u73fe","text":"

\u4e0b\u6587\u5be6\u73fe\u7684\u662f\u5927\u9802\u5806\u7a4d\u3002\u82e5\u8981\u5c07\u5176\u8f49\u63db\u70ba\u5c0f\u9802\u5806\u7a4d\uff0c\u53ea\u9700\u5c07\u6240\u6709\u5927\u5c0f\u908f\u8f2f\u5224\u65b7\u9032\u884c\u9006\u8f49\uff08\u4f8b\u5982\uff0c\u5c07 \\(\\geq\\) \u66ff\u63db\u70ba \\(\\leq\\) \uff09\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

"},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7a4d\u7684\u5132\u5b58\u8207\u8868\u793a","text":"

\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u8b1b\u904e\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u7531\u65bc\u5806\u7a4d\u6b63\u662f\u4e00\u7a2e\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u56e0\u6b64\u6211\u5011\u5c07\u63a1\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002

\u7576\u4f7f\u7528\u9663\u5217\u8868\u793a\u4e8c\u5143\u6a39\u6642\uff0c\u5143\u7d20\u4ee3\u8868\u7bc0\u9ede\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u7bc0\u9ede\u5728\u4e8c\u5143\u6a39\u4e2d\u7684\u4f4d\u7f6e\u3002\u7bc0\u9ede\u6307\u6a19\u900f\u904e\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u4f86\u5be6\u73fe\u3002

\u5982\u5716 8-2 \u6240\u793a\uff0c\u7d66\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 2\\) \uff0c\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u7576\u7d22\u5f15\u8d8a\u754c\u6642\uff0c\u8868\u793a\u7a7a\u7bc0\u9ede\u6216\u7bc0\u9ede\u4e0d\u5b58\u5728\u3002

\u5716 8-2 \u00a0 \u5806\u7a4d\u7684\u8868\u793a\u8207\u5132\u5b58

\u6211\u5011\u53ef\u4ee5\u5c07\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def left(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
my_heap.cpp
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.java
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.cs
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.go
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
my_heap.swift
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.js
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.ts
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.dart
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rs
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.c
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
my_heap.kt
/* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
my_heap.rb
### \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
my_heap.zig
// \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
"},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20","text":"

\u5806\u7a4d\u9802\u5143\u7d20\u5373\u70ba\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u4e5f\u5c31\u662f\u4e32\u5217\u7684\u9996\u500b\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def peek(self) -> int:\n    \"\"\"\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
my_heap.cpp
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
my_heap.java
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
my_heap.cs
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
my_heap.go
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
my_heap.swift
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
my_heap.js
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
my_heap.ts
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
my_heap.dart
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
my_heap.rs
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
my_heap.c
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
my_heap.kt
/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
my_heap.rb
### \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
my_heap.zig
// \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806\u7a4d","text":"

\u7d66\u5b9a\u5143\u7d20 val \uff0c\u6211\u5011\u9996\u5148\u5c07\u5176\u65b0\u589e\u5230\u5806\u7a4d\u5e95\u3002\u65b0\u589e\u4e4b\u5f8c\uff0c\u7531\u65bc val \u53ef\u80fd\u5927\u65bc\u5806\u7a4d\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7a4d\u7684\u6210\u7acb\u689d\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u58de\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u5fa9\u5f9e\u63d2\u5165\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u9019\u500b\u64cd\u4f5c\u88ab\u7a31\u70ba\u5806\u7a4d\u5316\uff08heapify\uff09\u3002

\u8003\u616e\u5f9e\u5165\u5806\u7a4d\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u5806\u7a4d\u5316\u3002\u5982\u5716 8-3 \u6240\u793a\uff0c\u6211\u5011\u6bd4\u8f03\u63d2\u5165\u7bc0\u9ede\u8207\u5176\u7236\u7bc0\u9ede\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u7bc0\u9ede\u66f4\u5927\uff0c\u5247\u5c07\u5b83\u5011\u4ea4\u63db\u3002\u7136\u5f8c\u7e7c\u7e8c\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u5f9e\u5e95\u81f3\u9802\u4fee\u5fa9\u5806\u7a4d\u4e2d\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u76f4\u81f3\u8d8a\u904e\u6839\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

<1><2><3><4><5><6><7><8><9>

\u5716 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u7a4d\u6b65\u9a5f

\u8a2d\u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \uff0c\u5247\u6a39\u7684\u9ad8\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u7a4d\u5316\u64cd\u4f5c\u7684\u8ff4\u5708\u8f2a\u6578\u6700\u591a\u70ba \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\u7a4d\"\"\"\n    # \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.append(val)\n    # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p = self.parent(i)\n        # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p)\n        # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n
my_heap.cpp
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.push_back(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap[i], maxHeap[p]);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid Push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.Add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc (h *maxHeap) push(val any) {\n    // \u65b0\u589e\u7bc0\u9ede\n    h.data = append(h.data, val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p := h.parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc push(val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.append(val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = parent(i: i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.#maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.#parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val: number): void {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n  // \u65b0\u589e\u7bc0\u9ede\n  _maxHeap.add(val);\n  // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    int p = _parent(i);\n    // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, p);\n    // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfn push(&mut self, val: i32) {\n    // \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u7bc0\u9ede i \u5df2\u7d93\u662f\u5806\u7a4d\u9802\u7bc0\u9ede\u4e86\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if i == 0 {\n            break;\n        }\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = Self::parent(i);\n        // \u7576\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c\u4e0d\u61c9\u8a72\u65b0\u589e\u9019\u9ebc\u591a\u7bc0\u9ede\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(maxHeap, i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfun push(_val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(_val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        val p = parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u5165\u5806\u7a4d ###\ndef push(val)\n  # \u65b0\u589e\u7bc0\u9ede\n  @max_heap << val\n  # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  sift_up(size - 1)\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    p = parent(i)\n    # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, p)\n    # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u5165\u5806\u7a4d\nfn push(self: *Self, val: T) !void {\n    // \u65b0\u589e\u7bc0\u9ede\n    try self.max_heap.?.append(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        var p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d","text":"

\u5806\u7a4d\u9802\u5143\u7d20\u662f\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u5373\u4e32\u5217\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u5011\u76f4\u63a5\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\uff0c\u90a3\u9ebc\u4e8c\u5143\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u7d22\u5f15\u90fd\u6703\u767c\u751f\u8b8a\u5316\uff0c\u9019\u5c07\u4f7f\u5f97\u5f8c\u7e8c\u4f7f\u7528\u5806\u7a4d\u5316\u9032\u884c\u4fee\u5fa9\u8b8a\u5f97\u56f0\u96e3\u3002\u70ba\u4e86\u5118\u91cf\u6e1b\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u8b8a\u52d5\uff0c\u6211\u5011\u63a1\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9a5f\u3002

  1. \u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff09\u3002
  2. \u4ea4\u63db\u5b8c\u6210\u5f8c\uff0c\u5c07\u5806\u7a4d\u5e95\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\uff08\u6ce8\u610f\uff0c\u7531\u65bc\u5df2\u7d93\u4ea4\u63db\uff0c\u56e0\u6b64\u5be6\u969b\u4e0a\u522a\u9664\u7684\u662f\u539f\u4f86\u7684\u5806\u7a4d\u9802\u5143\u7d20\uff09\u3002
  3. \u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u3002

\u5982\u5716 8-4 \u6240\u793a\uff0c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u8207\u201c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\u201d\u76f8\u53cd\uff0c\u6211\u5011\u5c07\u6839\u7bc0\u9ede\u7684\u503c\u8207\u5176\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u503c\u9032\u884c\u6bd4\u8f03\uff0c\u5c07\u6700\u5927\u7684\u5b50\u7bc0\u9ede\u8207\u6839\u7bc0\u9ede\u4ea4\u63db\u3002\u7136\u5f8c\u8ff4\u5708\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

<1><2><3><4><5><6><7><8><9><10>

\u5716 8-4 \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u6b65\u9a5f

\u8207\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\u7a4d\"\"\"\n    # \u5224\u7a7a\u8655\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u522a\u9664\u7bc0\u9ede\n    val = self.max_heap.pop()\n    # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma)\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n
my_heap.cpp
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nvoid pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u7a4d\u70ba\u7a7a\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u522a\u9664\u7bc0\u9ede\n    maxHeap.pop_back();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.java
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.remove(size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.cs
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint Pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u7bc0\u9ede i \u6700\u5927\u201d\u6216\u201c\u8d8a\u904e\u8449\u7bc0\u9ede\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.go
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u8655\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u522a\u9664\u7bc0\u9ede\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, max)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max\n    }\n}\n
my_heap.swift
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u8655\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    let val = maxHeap.remove(at: size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
my_heap.js
/* \u5143\u7d20\u51fa\u5806\u7a4d */\npop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u7a4d\u70ba\u7a7a');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.#maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.ts
/* \u5143\u7d20\u51fa\u5806\u7a4d */\npop(): number {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.dart
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n  // \u5224\u7a7a\u8655\u7406\n  if (isEmpty()) throw Exception('\u5806\u7a4d\u70ba\u7a7a');\n  // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u522a\u9664\u7bc0\u9ede\n  int val = _maxHeap.removeLast();\n  // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, ma);\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n
my_heap.rs
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u8655\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    let val = self.max_heap.pop().unwrap();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
my_heap.c
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, max);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max;\n    }\n}\n
my_heap.kt
/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfun pop(): Int {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return _val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
my_heap.rb
### \u5143\u7d20\u51fa\u5806\u7a4d ###\ndef pop\n  # \u5224\u7a7a\u8655\u7406\n  raise IndexError, \"\u5806\u7a4d\u70ba\u7a7a\" if is_empty?\n  # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u522a\u9664\u7bc0\u9ede\n  val = @max_heap.pop\n  # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  val\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, ma)\n    # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma\n  end\nend\n
my_heap.zig
// \u5143\u7d20\u51fa\u5806\u7a4d\nfn pop(self: *Self) !T {\n    // \u5224\u65b7\u8655\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    var val = self.max_heap.?.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n} \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7a4d\u7684\u5e38\u898b\u61c9\u7528","text":"
  • \u512a\u5148\u4f47\u5217\uff1a\u5806\u7a4d\u901a\u5e38\u4f5c\u70ba\u5be6\u73fe\u512a\u5148\u4f47\u5217\u7684\u9996\u9078\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \uff0c\u800c\u5efa\u968a\u64cd\u4f5c\u70ba \\(O(n)\\) \uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
  • \u5806\u7a4d\u6392\u5e8f\uff1a\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u5b83\u5011\u5efa\u7acb\u4e00\u500b\u5806\u7a4d\uff0c\u7136\u5f8c\u4e0d\u65b7\u5730\u57f7\u884c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u8cc7\u6599\u3002\u7136\u800c\uff0c\u6211\u5011\u901a\u5e38\u6703\u4f7f\u7528\u4e00\u7a2e\u66f4\u512a\u96c5\u7684\u65b9\u5f0f\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\uff0c\u8a73\u898b\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u7ae0\u7bc0\u3002
  • \u7372\u53d6\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\uff1a\u9019\u662f\u4e00\u500b\u7d93\u5178\u7684\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u540c\u6642\u4e5f\u662f\u4e00\u7a2e\u5178\u578b\u61c9\u7528\uff0c\u4f8b\u5982\u9078\u64c7\u71b1\u5ea6\u524d 10 \u7684\u65b0\u805e\u4f5c\u70ba\u5fae\u535a\u71b1\u641c\uff0c\u9078\u53d6\u92b7\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
"},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5806\u7a4d\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u6839\u64da\u6210\u7acb\u689d\u4ef6\u53ef\u5206\u70ba\u5927\u9802\u5806\u7a4d\u548c\u5c0f\u9802\u5806\u7a4d\u3002\u5927\uff08\u5c0f\uff09\u9802\u5806\u7a4d\u7684\u5806\u7a4d\u9802\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
  • \u512a\u5148\u4f47\u5217\u7684\u5b9a\u7fa9\u662f\u5177\u6709\u51fa\u5217\u512a\u5148\u9806\u5e8f\u7684\u4f47\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u7a4d\u4f86\u5be6\u73fe\u3002
  • \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\)\u3001\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) \u548c\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
  • \u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u8868\u793a\uff0c\u56e0\u6b64\u6211\u5011\u901a\u5e38\u4f7f\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002
  • \u5806\u7a4d\u5316\u64cd\u4f5c\u7528\u65bc\u7dad\u8b77\u5806\u7a4d\u7684\u6027\u8cea\uff0c\u5728\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u90fd\u6703\u7528\u5230\u3002
  • \u8f38\u5165 \\(n\\) \u500b\u5143\u7d20\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
  • Top-k \u662f\u4e00\u500b\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u9ad8\u6548\u89e3\u6c7a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002
"},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u8cc7\u6599\u7d50\u69cb\u7684\u201c\u5806\u7a4d\u201d\u8207\u8a18\u61b6\u9ad4\u7ba1\u7406\u7684\u201c\u5806\u7a4d\u201d\u662f\u540c\u4e00\u500b\u6982\u5ff5\u55ce\uff1f

\u5169\u8005\u4e0d\u662f\u540c\u4e00\u500b\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u7a4d\u201d\u3002\u8a08\u7b97\u6a5f\u7cfb\u7d71\u8a18\u61b6\u9ad4\u4e2d\u7684\u5806\u7a4d\u662f\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6642\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u5132\u5b58\u8cc7\u6599\u3002\u7a0b\u5f0f\u53ef\u4ee5\u8acb\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u7a4d\u8a18\u61b6\u9ad4\uff0c\u7528\u65bc\u5132\u5b58\u5982\u7269\u4ef6\u548c\u9663\u5217\u7b49\u8907\u96dc\u7d50\u69cb\u3002\u7576\u9019\u4e9b\u8cc7\u6599\u4e0d\u518d\u9700\u8981\u6642\uff0c\u7a0b\u5f0f\u9700\u8981\u91cb\u653e\u9019\u4e9b\u8a18\u61b6\u9ad4\uff0c\u4ee5\u9632\u6b62\u8a18\u61b6\u9ad4\u6d41\u5931\u3002\u76f8\u8f03\u65bc\u5806\u758a\u8a18\u61b6\u9ad4\uff0c\u5806\u7a4d\u8a18\u61b6\u9ad4\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8b39\u614e\uff0c\u4f7f\u7528\u4e0d\u7576\u53ef\u80fd\u6703\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d41\u5931\u548c\u91ce\u6307\u6a19\u7b49\u554f\u984c\u3002

"},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u554f\u984c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u7121\u5e8f\u9663\u5217 nums \uff0c\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002

\u5c0d\u65bc\u8a72\u554f\u984c\uff0c\u6211\u5011\u5148\u4ecb\u7d39\u5169\u7a2e\u601d\u8def\u6bd4\u8f03\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7d39\u6548\u7387\u66f4\u9ad8\u7684\u5806\u7a4d\u89e3\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u8d70\u8a2a\u9078\u64c7","text":"

\u6211\u5011\u53ef\u4ee5\u9032\u884c\u5716 8-6 \u6240\u793a\u7684 \\(k\\) \u8f2a\u8d70\u8a2a\uff0c\u5206\u5225\u5728\u6bcf\u8f2a\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\) \u3002

\u6b64\u65b9\u6cd5\u53ea\u9069\u7528\u65bc \\(k \\ll n\\) \u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u7576 \\(k\\) \u8207 \\(n\\) \u6bd4\u8f03\u63a5\u8fd1\u6642\uff0c\u5176\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411\u65bc \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u6642\u3002

\u5716 8-6 \u00a0 \u8d70\u8a2a\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

Tip

\u7576 \\(k = n\\) \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u6642\u7b49\u50f9\u65bc\u201c\u9078\u64c7\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\u3002

"},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

\u5982\u5716 8-7 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u5c0d\u9663\u5217 nums \u9032\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u908a\u7684 \\(k\\) \u500b\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

\u986f\u7136\uff0c\u8a72\u65b9\u6cd5\u201c\u8d85\u984d\u201d\u5b8c\u6210\u4efb\u52d9\u4e86\uff0c\u56e0\u70ba\u6211\u5011\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

\u5716 8-7 \u00a0 \u6392\u5e8f\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

"},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806\u7a4d","text":"

\u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u5806\u7a4d\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u6c7a Top-k \u554f\u984c\uff0c\u6d41\u7a0b\u5982\u5716 8-8 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u5176\u5806\u7a4d\u9802\u5143\u7d20\u6700\u5c0f\u3002
  2. \u5148\u5c07\u9663\u5217\u7684\u524d \\(k\\) \u500b\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u7a4d\u3002
  3. \u5f9e\u7b2c \\(k + 1\\) \u500b\u5143\u7d20\u958b\u59cb\uff0c\u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\uff0c\u4e26\u5c07\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\u3002
  4. \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u5806\u7a4d\u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 8-8 \u00a0 \u57fa\u65bc\u5806\u7a4d\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    heap = []\n    # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in range(k, len(nums)):\n        # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
top_k.cpp
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.java
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.cs
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    PriorityQueue<int, int> heap = new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
top_k.go
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
top_k.swift
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u4e26\u5c07\u524d k \u500b\u5143\u7d20\u5efa\u5806\u7a4d\n    var heap = Heap(nums.prefix(k))\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
top_k.js
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.ts
/* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
top_k.dart
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\uff0c\u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
top_k.rs
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9802\u5806\u7a4d\uff0c\u4f7f\u7528 Reverse \u5c07\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
top_k.c
/* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\u7684\u51fd\u5f0f\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delMaxHeap(maxHeap);\n    return res;\n}\n
top_k.kt
/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    val heap = PriorityQueue<Int>()\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (i in k..<nums.size) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
top_k.rb
### \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n  # \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n  max_heap = MaxHeap.new([])\n\n  # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for i in k...nums.length\n    # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
top_k.zig
[class]{}-[func]{topKHeap}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u7e3d\u5171\u57f7\u884c\u4e86 \\(n\\) \u8f2a\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u6700\u5927\u9577\u5ea6\u70ba \\(k\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002\u8a72\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u7576 \\(k\\) \u8f03\u5c0f\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \uff1b\u7576 \\(k\\) \u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u6703\u8d85\u904e \\(O(n \\log n)\\) \u3002

\u53e6\u5916\uff0c\u8a72\u65b9\u6cd5\u9069\u7528\u65bc\u52d5\u614b\u8cc7\u6599\u6d41\u7684\u4f7f\u7528\u5834\u666f\u3002\u5728\u4e0d\u65b7\u52a0\u5165\u8cc7\u6599\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u6301\u7e8c\u7dad\u8b77\u5806\u7a4d\u5167\u7684\u5143\u7d20\uff0c\u5f9e\u800c\u5be6\u73fe\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u7684\u52d5\u614b\u66f4\u65b0\u3002

"},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

\u5e7e\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u528d\u6307 Offer\u201d\u7cfb\u5217\u984c\u89e3\uff0c\u53d7\u5230\u4e86\u8a31\u591a\u8b80\u8005\u7684\u9f13\u52f5\u548c\u652f\u6301\u3002\u5728\u8207\u8b80\u8005\u4ea4\u6d41\u671f\u9593\uff0c\u6211\u6700\u5e38\u88ab\u554f\u7684\u4e00\u500b\u554f\u984c\u662f\u201c\u5982\u4f55\u5165\u9580\u6f14\u7b97\u6cd5\u201d\u3002\u9010\u6f38\u5730\uff0c\u6211\u5c0d\u9019\u500b\u554f\u984c\u7522\u751f\u4e86\u6fc3\u539a\u7684\u8208\u8da3\u3002

\u5169\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u984c\u4f3c\u4e4e\u662f\u6700\u53d7\u6b61\u8fce\u7684\u65b9\u6cd5\uff0c\u7c21\u55ae\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u984c\u5c31\u5982\u540c\u73a9\u201c\u6383\u96f7\u201d\u904a\u6232\uff0c\u81ea\u5b78\u80fd\u529b\u5f37\u7684\u4eba\u80fd\u5920\u9806\u5229\u5c07\u5730\u96f7\u9010\u500b\u6392\u6389\uff0c\u800c\u57fa\u790e\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6eff\u982d\u662f\u5305\uff0c\u4e26\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7e2e\u3002\u901a\u8b80\u6559\u6750\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u505a\u6cd5\uff0c\u4f46\u5c0d\u65bc\u9762\u5411\u6c42\u8077\u7684\u4eba\u4f86\u8aaa\uff0c\u7562\u696d\u8ad6\u6587\u3001\u6295\u905e\u7c21\u6b77\u3001\u6e96\u5099\u7b46\u8a66\u548c\u9762\u8a66\u5df2\u7d93\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u66f8\u5f80\u5f80\u8b8a\u6210\u4e86\u4e00\u9805\u8271\u9245\u7684\u6311\u6230\u3002

\u5982\u679c\u4f60\u4e5f\u9762\u81e8\u985e\u4f3c\u7684\u56f0\u64fe\uff0c\u90a3\u9ebc\u5f88\u5e78\u904b\u9019\u672c\u66f8\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u66f8\u662f\u6211\u5c0d\u9019\u500b\u554f\u984c\u7d66\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u512a\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u7a4d\u6975\u7684\u5617\u8a66\u3002\u672c\u66f8\u96d6\u7136\u4e0d\u8db3\u4ee5\u8b93\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u6703\u5f15\u5c0e\u4f60\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u201c\u77e5\u8b58\u5730\u5716\u201d\uff0c\u5e36\u4f60\u77ad\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72c0\u3001\u5927\u5c0f\u548c\u5206\u4f48\u4f4d\u7f6e\uff0c\u8b93\u4f60\u638c\u63e1\u5404\u7a2e\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u9019\u4e9b\u672c\u9818\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u984c\u548c\u95b1\u8b80\u6587\u737b\uff0c\u9010\u6b65\u69cb\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8b58\u9ad4\u7cfb\u3002

\u6211\u6df1\u6df1\u8d0a\u540c\u8cbb\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u5f9e\u9019\u500b\u610f\u7fa9\u4e0a\u770b\uff0c\u9019\u672c\u66f8\u4e26\u975e\u5b8c\u5168\u201c\u514d\u8cbb\u201d\u3002\u70ba\u4e86\u4e0d\u8f9c\u8ca0\u4f60\u70ba\u672c\u66f8\u6240\u4ed8\u51fa\u7684\u5bf6\u8cb4\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u6703\u7aed\u76e1\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u4f86\u5b8c\u6210\u672c\u66f8\u7684\u5275\u4f5c\u3002

\u672c\u4eba\u81ea\u77e5\u5b78\u758f\u624d\u6dfa\uff0c\u66f8\u4e2d\u5167\u5bb9\u96d6\u7136\u5df2\u7d93\u904e\u4e00\u6bb5\u6642\u9593\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8a31\u591a\u932f\u8aa4\uff0c\u61c7\u8acb\u5404\u4f4d\u8001\u5e2b\u548c\u540c\u5b78\u6279\u8a55\u6307\u6b63\u3002

Hello\uff0c\u6f14\u7b97\u6cd5\uff01

\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u7d66\u4e16\u754c\u5e36\u4f86\u4e86\u5de8\u5927\u8b8a\u9769\uff0c\u5b83\u6191\u85c9\u9ad8\u901f\u7684\u8a08\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7a0b\u5f0f\u8a2d\u8a08\u6027\uff0c\u6210\u70ba\u4e86\u57f7\u884c\u6f14\u7b97\u6cd5\u8207\u8655\u7406\u8cc7\u6599\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u7121\u8ad6\u662f\u96fb\u5b50\u904a\u6232\u7684\u903c\u771f\u756b\u9762\u3001\u81ea\u52d5\u99d5\u99db\u7684\u667a\u6167\u6c7a\u7b56\uff0c\u9084\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4e92\u52d5\uff0c\u9019\u4e9b\u61c9\u7528\u90fd\u662f\u6f14\u7b97\u6cd5\u5728\u8a08\u7b97\u6a5f\u4e0a\u7684\u7cbe\u5999\u6f14\u7e79\u3002

\u4e8b\u5be6\u4e0a\uff0c\u5728\u8a08\u7b97\u6a5f\u554f\u4e16\u4e4b\u524d\uff0c\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u5c31\u5df2\u7d93\u5b58\u5728\u65bc\u4e16\u754c\u7684\u5404\u500b\u89d2\u843d\u3002\u65e9\u671f\u7684\u6f14\u7b97\u6cd5\u76f8\u5c0d\u7c21\u55ae\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8a08\u6578\u65b9\u6cd5\u548c\u5de5\u5177\u88fd\u4f5c\u6b65\u9a5f\u7b49\u3002\u96a8\u8457\u6587\u660e\u7684\u9032\u6b65\uff0c\u6f14\u7b97\u6cd5\u9010\u6f38\u8b8a\u5f97\u66f4\u52a0\u7cbe\u7d30\u548c\u8907\u96dc\u3002\u5f9e\u5de7\u596a\u5929\u5de5\u7684\u5320\u4eba\u6280\u85dd\u3001\u5230\u89e3\u653e\u751f\u7522\u529b\u7684\u5de5\u696d\u7522\u54c1\u3001\u518d\u5230\u5b87\u5b99\u57f7\u884c\u7684\u79d1\u5b78\u898f\u5f8b\uff0c\u5e7e\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u9a5a\u6b4e\u7684\u4e8b\u7269\u80cc\u5f8c\uff0c\u90fd\u96b1\u85cf\u8457\u7cbe\u5999\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002

\u540c\u6a23\uff0c\u8cc7\u6599\u7d50\u69cb\u7121\u8655\u4e0d\u5728\uff1a\u5927\u5230\u793e\u6703\u7db2\u8def\uff0c\u5c0f\u5230\u5730\u9435\u7dda\u8def\uff0c\u8a31\u591a\u7cfb\u7d71\u90fd\u53ef\u4ee5\u5efa\u6a21\u70ba\u201c\u5716\u201d\uff1b\u5927\u5230\u4e00\u500b\u570b\u5bb6\uff0c\u5c0f\u5230\u4e00\u500b\u5bb6\u5ead\uff0c\u793e\u6703\u7684\u4e3b\u8981\u7d44\u7e54\u5f62\u5f0f\u5448\u73fe\u51fa\u201c\u6a39\u201d\u7684\u7279\u5fb5\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u5806\u758a\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u5f8c\u624d\u80fd\u812b\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5247\u5982\u540c\u201c\u4f47\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u500b\u201c\u96dc\u6e4a\u8868\u201d\uff0c\u80fd\u5920\u5feb\u901f\u67e5\u8a62\u76ee\u6a19\u8a5e\u689d\u3002

\u672c\u66f8\u65e8\u5728\u900f\u904e\u6e05\u6670\u6613\u61c2\u7684\u52d5\u756b\u5716\u89e3\u548c\u53ef\u57f7\u884c\u7684\u7a0b\u5f0f\u78bc\u793a\u4f8b\uff0c\u4f7f\u8b80\u8005\u7406\u89e3\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u4e26\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u4f86\u5be6\u73fe\u5b83\u5011\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u672c\u66f8\u81f4\u529b\u65bc\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u8907\u96dc\u4e16\u754c\u4e2d\u7684\u751f\u52d5\u9ad4\u73fe\uff0c\u5c55\u73fe\u6f14\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u66f8\u80fd\u5920\u5e6b\u52a9\u5230\u4f60\uff01

"},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8b58\u6f14\u7b97\u6cd5","text":"

Abstract

\u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u8207\u8cc7\u6599\u4ea4\u7e54\u5728\u4e00\u8d77\uff0c\u88d9\u896c\u4e0a\u98c4\u63da\u8457\u6f14\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

\u5979\u9080\u8acb\u4f60\u5171\u821e\uff0c\u8acb\u7dca\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6eff\u908f\u8f2f\u8207\u7f8e\u611f\u7684\u6f14\u7b97\u6cd5\u4e16\u754c\u3002

"},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728
  • 1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc
  • 1.3 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728","text":"

\u7576\u6211\u5011\u807d\u5230\u201c\u6f14\u7b97\u6cd5\u201d\u9019\u500b\u8a5e\u6642\uff0c\u5f88\u81ea\u7136\u5730\u6703\u60f3\u5230\u6578\u5b78\u3002\u7136\u800c\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u6d89\u53ca\u8907\u96dc\u6578\u5b78\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8cf4\u57fa\u672c\u908f\u8f2f\uff0c\u9019\u4e9b\u908f\u8f2f\u5728\u6211\u5011\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u8655\u8655\u53ef\u898b\u3002

\u5728\u6b63\u5f0f\u63a2\u8a0e\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u500b\u6709\u8da3\u7684\u4e8b\u5be6\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u4e26\u7fd2\u6163\u5c07\u5b83\u5011\u61c9\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c07\u8209\u5e7e\u500b\u5177\u9ad4\u7684\u4f8b\u5b50\u4f86\u8b49\u5be6\u9019\u4e00\u9ede\u3002

\u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u88e1\uff0c\u6bcf\u500b\u6f22\u5b57\u90fd\u5c0d\u61c9\u4e00\u500b\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\u7684\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u67e5\u8a62\u4e00\u500b\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u6703\u6309\u7167\u5716 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5be6\u73fe\u3002

  1. \u7ffb\u958b\u5b57\u5178\u7d04\u4e00\u534a\u7684\u9801\u6578\uff0c\u6aa2\u8996\u8a72\u9801\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u9ebc\uff0c\u5047\u8a2d\u9996\u5b57\u6bcd\u70ba \\(m\\) \u3002
  2. \u7531\u65bc\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u65bc \\(m\\) \u4e4b\u5f8c\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u8a62\u7bc4\u570d\u7e2e\u5c0f\u5230\u5f8c\u534a\u90e8\u5206\u3002
  3. \u4e0d\u65b7\u91cd\u8907\u6b65\u9a5f 1. \u548c \u6b65\u9a5f 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u9801\u78bc\u70ba\u6b62\u3002
<1><2><3><4><5>

\u5716 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9a5f

\u67e5\u5b57\u5178\u9019\u500b\u5c0f\u5b78\u751f\u5fc5\u5099\u6280\u80fd\uff0c\u5be6\u969b\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u6f14\u7b97\u6cd5\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b57\u5178\u8996\u70ba\u4e00\u500b\u5df2\u6392\u5e8f\u7684\u201c\u9663\u5217\u201d\uff1b\u5f9e\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u3002

\u4f8b\u4e8c\uff1a\u6574\u7406\u64b2\u514b\u3002\u6211\u5011\u5728\u6253\u724c\u6642\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u64b2\u514b\u724c\uff0c\u4f7f\u5176\u5f9e\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5be6\u73fe\u6d41\u7a0b\u5982\u5716 1-2 \u6240\u793a\u3002

  1. \u5c07\u64b2\u514b\u724c\u5283\u5206\u70ba\u201c\u6709\u5e8f\u201d\u548c\u201c\u7121\u5e8f\u201d\u5169\u90e8\u5206\uff0c\u4e26\u5047\u8a2d\u521d\u59cb\u72c0\u614b\u4e0b\u6700\u5de6 1 \u5f35\u64b2\u514b\u724c\u5df2\u7d93\u6709\u5e8f\u3002
  2. \u5728\u7121\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f35\u64b2\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u78ba\u4f4d\u7f6e\uff1b\u5b8c\u6210\u5f8c\u6700\u5de6 2 \u5f35\u64b2\u514b\u5df2\u7d93\u6709\u5e8f\u3002
  3. \u4e0d\u65b7\u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u6bcf\u4e00\u8f2a\u5c07\u4e00\u5f35\u64b2\u514b\u724c\u5f9e\u7121\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u64b2\u514b\u724c\u90fd\u6709\u5e8f\u3002

\u5716 1-2 \u00a0 \u64b2\u514b\u6392\u5e8f\u6b65\u9a5f

\u4e0a\u8ff0\u6574\u7406\u64b2\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\uff0c\u5b83\u5728\u8655\u7406\u5c0f\u578b\u8cc7\u6599\u96c6\u6642\u975e\u5e38\u9ad8\u6548\u3002\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u7684\u6392\u5e8f\u5eab\u51fd\u5f0f\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

\u4f8b\u4e09\uff1a\u8ca8\u5e63\u627e\u96f6\u3002\u5047\u8a2d\u6211\u5011\u5728\u8d85\u5e02\u8cfc\u8cb7\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7d66\u4e86\u6536\u9280\u54e1 \\(100\\) \u5143\uff0c\u5247\u6536\u9280\u54e1\u9700\u8981\u627e\u6211\u5011 \\(31\\) \u5143\u3002\u4ed6\u6703\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u5716 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

  1. \u53ef\u9078\u9805\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8ca8\u5e63\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
  2. \u5f9e\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u9918 \\(31 - 20 = 11\\) \u5143\u3002
  3. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u9918 \\(11 - 10 = 1\\) \u5143\u3002
  4. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u9918 \\(1 - 1 = 0\\) \u5143\u3002
  5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u70ba \\(20 + 10 + 1 = 31\\) \u5143\u3002

\u5716 1-3 \u00a0 \u8ca8\u5e63\u627e\u96f6\u904e\u7a0b

\u5728\u4ee5\u4e0a\u6b65\u9a5f\u4e2d\uff0c\u6211\u5011\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\uff08\u5118\u53ef\u80fd\u7528\u5927\u9762\u984d\u7684\u8ca8\u5e63\uff09\uff0c\u6700\u7d42\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u8caa\u5a6a\u201d\u6f14\u7b97\u6cd5\u3002

\u5c0f\u5230\u70f9\u98ea\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u969b\u822a\u884c\uff0c\u5e7e\u4e4e\u6240\u6709\u554f\u984c\u7684\u89e3\u6c7a\u90fd\u96e2\u4e0d\u958b\u6f14\u7b97\u6cd5\u3002\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u4f7f\u5f97\u6211\u5011\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u5c07\u8cc7\u6599\u7d50\u69cb\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\uff0c\u540c\u6642\u7de8\u5beb\u7a0b\u5f0f\u78bc\u547c\u53eb CPU \u548c GPU \u57f7\u884c\u6f14\u7b97\u6cd5\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u6211\u5011\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u554f\u984c\u8f49\u79fb\u5230\u8a08\u7b97\u6a5f\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u6c7a\u5404\u7a2e\u8907\u96dc\u554f\u984c\u3002

Tip

\u5982\u679c\u4f60\u5c0d\u8cc7\u6599\u7d50\u69cb\u3001\u6f14\u7b97\u6cd5\u3001\u9663\u5217\u548c\u4e8c\u5206\u641c\u5c0b\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8acb\u7e7c\u7e8c\u5f80\u4e0b\u95b1\u8b80\uff0c\u672c\u66f8\u5c07\u5f15\u5c0e\u4f60\u9081\u5165\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u6bbf\u5802\u3002

"},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7d50","text":"
  • \u6f14\u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u7121\u8655\u4e0d\u5728\uff0c\u4e26\u4e0d\u662f\u9059\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8b58\u3002\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u6c7a\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u554f\u984c\u3002
  • \u67e5\u5b57\u5178\u7684\u539f\u7406\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u9ad4\u73fe\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u6f14\u7b97\u6cd5\u601d\u60f3\u3002
  • \u6574\u7406\u64b2\u514b\u7684\u904e\u7a0b\u8207\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u975e\u5e38\u985e\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u9069\u5408\u6392\u5e8f\u5c0f\u578b\u8cc7\u6599\u96c6\u3002
  • \u8ca8\u5e63\u627e\u96f6\u7684\u6b65\u9a5f\u672c\u8cea\u4e0a\u662f\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\u3002
  • \u6f14\u7b97\u6cd5\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002
  • \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7dca\u5bc6\u76f8\u9023\u3002\u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002
  • \u6211\u5011\u53ef\u4ee5\u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728\uff0c\u7a4d\u6728\u4ee3\u8868\u8cc7\u6599\uff0c\u7a4d\u6728\u7684\u5f62\u72c0\u548c\u9023\u7dda\u65b9\u5f0f\u7b49\u4ee3\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u62fc\u88dd\u7a4d\u6728\u7684\u6b65\u9a5f\u5247\u5c0d\u61c9\u6f14\u7b97\u6cd5\u3002
"},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

Q\uff1a\u4f5c\u70ba\u4e00\u540d\u7a0b\u5f0f\u8a2d\u8a08\u5e2b\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u5f9e\u672a\u7528\u6f14\u7b97\u6cd5\u89e3\u6c7a\u904e\u554f\u984c\uff0c\u5e38\u7528\u6f14\u7b97\u6cd5\u90fd\u88ab\u7a0b\u5f0f\u8a9e\u8a00\u5c01\u88dd\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u9019\u662f\u5426\u610f\u5473\u8457\u6211\u5011\u5de5\u4f5c\u4e2d\u7684\u554f\u984c\u9084\u6c92\u6709\u5230\u9054\u9700\u8981\u6f14\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

\u5982\u679c\u628a\u5177\u9ad4\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8a71\uff0c\u90a3\u9ebc\u57fa\u790e\u79d1\u76ee\u61c9\u8a72\u66f4\u50cf\u662f\u201c\u5167\u529f\u201d\u3002

\u6211\u8a8d\u70ba\u5b78\u6f14\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u790e\u79d1\u76ee\uff09\u7684\u610f\u7fa9\u4e0d\u662f\u5728\u65bc\u5728\u5de5\u4f5c\u4e2d\u5f9e\u96f6\u5be6\u73fe\u5b83\uff0c\u800c\u662f\u57fa\u65bc\u5b78\u5230\u7684\u77e5\u8b58\uff0c\u5728\u89e3\u6c7a\u554f\u984c\u6642\u80fd\u5920\u4f5c\u51fa\u5c08\u696d\u7684\u53cd\u61c9\u548c\u5224\u65b7\uff0c\u5f9e\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u9ad4\u8cea\u91cf\u3002\u8209\u4e00\u500b\u7c21\u55ae\u4f8b\u5b50\uff0c\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u5167\u5efa\u4e86\u6392\u5e8f\u51fd\u5f0f\uff1a

  • \u5982\u679c\u6211\u5011\u6c92\u6709\u5b78\u904e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff0c\u90a3\u9ebc\u7d66\u5b9a\u4efb\u4f55\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u80fd\u90fd\u585e\u7d66\u9019\u500b\u6392\u5e8f\u51fd\u5f0f\u53bb\u505a\u4e86\u3002\u57f7\u884c\u9806\u66a2\u3001\u6548\u80fd\u4e0d\u932f\uff0c\u770b\u4e0a\u53bb\u4e26\u6c92\u6709\u4ec0\u9ebc\u554f\u984c\u3002
  • \u4f46\u5982\u679c\u5b78\u904e\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u5c31\u6703\u77e5\u9053\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7d66\u5b9a\u7684\u8cc7\u6599\u662f\u56fa\u5b9a\u4f4d\u6578\u7684\u6574\u6578\uff08\u4f8b\u5982\u5b78\u865f\uff09\uff0c\u90a3\u9ebc\u6211\u5011\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6578\u6392\u5e8f\u201d\u4f86\u505a\uff0c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u70ba \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u70ba\u4f4d\u6578\u3002\u7576\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u6642\uff0c\u7bc0\u7701\u51fa\u4f86\u7684\u57f7\u884c\u6642\u9593\u5c31\u80fd\u5275\u9020\u8f03\u5927\u50f9\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u9ad4\u9a57\u8b8a\u597d\u7b49\uff09\u3002

\u5728\u5de5\u7a0b\u9818\u57df\u4e2d\uff0c\u5927\u91cf\u554f\u984c\u662f\u96e3\u4ee5\u9054\u5230\u6700\u512a\u89e3\u7684\uff0c\u8a31\u591a\u554f\u984c\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u6c7a\u4e86\u3002\u554f\u984c\u7684\u96e3\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u6c7a\u65bc\u554f\u984c\u672c\u8eab\u7684\u6027\u8cea\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u6c7a\u65bc\u89c0\u6e2c\u554f\u984c\u7684\u4eba\u7684\u77e5\u8b58\u5132\u5099\u3002\u4eba\u7684\u77e5\u8b58\u8d8a\u5b8c\u5099\u3001\u7d93\u9a57\u8d8a\u591a\uff0c\u5206\u6790\u554f\u984c\u5c31\u6703\u8d8a\u6df1\u5165\uff0c\u554f\u984c\u5c31\u80fd\u88ab\u89e3\u6c7a\u5f97\u66f4\u512a\u96c5\u3002

"},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u6f14\u7b97\u6cd5\u5b9a\u7fa9","text":"

\u6f14\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

  • \u554f\u984c\u662f\u660e\u78ba\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f38\u5165\u548c\u8f38\u51fa\u5b9a\u7fa9\u3002
  • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u5920\u5728\u6709\u9650\u6b65\u9a5f\u3001\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e0b\u5b8c\u6210\u3002
  • \u5404\u6b65\u9a5f\u90fd\u6709\u78ba\u5b9a\u7684\u542b\u7fa9\uff0c\u5728\u76f8\u540c\u7684\u8f38\u5165\u548c\u57f7\u884c\u689d\u4ef6\u4e0b\uff0c\u8f38\u51fa\u59cb\u7d42\u76f8\u540c\u3002
"},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5b9a\u7fa9","text":"

\u8cc7\u6599\u7d50\u69cb\uff08data structure\uff09\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8a2d\u8a08\u76ee\u6a19\u3002

  • \u7a7a\u9593\u4f54\u7528\u5118\u91cf\u5c11\uff0c\u4ee5\u7bc0\u7701\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u3002
  • \u8cc7\u6599\u64cd\u4f5c\u5118\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u84cb\u8cc7\u6599\u8a2a\u554f\u3001\u65b0\u589e\u3001\u522a\u9664\u3001\u66f4\u65b0\u7b49\u3002
  • \u63d0\u4f9b\u7c21\u6f54\u7684\u8cc7\u6599\u8868\u793a\u548c\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4ee5\u4fbf\u6f14\u7b97\u6cd5\u9ad8\u6548\u57f7\u884c\u3002

\u8cc7\u6599\u7d50\u69cb\u8a2d\u8a08\u662f\u4e00\u500b\u5145\u6eff\u6b0a\u8861\u7684\u904e\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u5354\u3002\u4e0b\u9762\u8209\u5169\u500b\u4f8b\u5b50\u3002

  • \u93c8\u7d50\u4e32\u5217\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u5728\u8cc7\u6599\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u72a7\u7272\u4e86\u8cc7\u6599\u8a2a\u554f\u901f\u5ea6\u3002
  • \u5716\u76f8\u8f03\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u63d0\u4f9b\u4e86\u66f4\u8c50\u5bcc\u7684\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4f46\u9700\u8981\u4f54\u7528\u66f4\u5927\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
"},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2","text":"

\u5982\u5716 1-4 \u6240\u793a\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u95dc\u3001\u7dca\u5bc6\u7d50\u5408\uff0c\u5177\u9ad4\u8868\u73fe\u5728\u4ee5\u4e0b\u4e09\u500b\u65b9\u9762\u3002

  • \u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u8cc7\u6599\u7d50\u69cb\u70ba\u6f14\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7d50\u69cb\u5316\u5132\u5b58\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u64cd\u4f5c\u8cc7\u6599\u7684\u65b9\u6cd5\u3002
  • \u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002\u8cc7\u6599\u7d50\u69cb\u672c\u8eab\u50c5\u5132\u5b58\u8cc7\u6599\u8cc7\u8a0a\uff0c\u7d50\u5408\u6f14\u7b97\u6cd5\u624d\u80fd\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u3002
  • \u6f14\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u65bc\u4e0d\u540c\u7684\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u4f46\u57f7\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9078\u64c7\u5408\u9069\u7684\u8cc7\u6599\u7d50\u69cb\u662f\u95dc\u9375\u3002

\u5716 1-4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2

\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7336\u5982\u5716 1-5 \u6240\u793a\u7684\u62fc\u88dd\u7a4d\u6728\u3002\u4e00\u5957\u7a4d\u6728\uff0c\u9664\u4e86\u5305\u542b\u8a31\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u9084\u9644\u6709\u8a73\u7d30\u7684\u7d44\u88dd\u8aaa\u660e\u66f8\u3002\u6211\u5011\u6309\u7167\u8aaa\u660e\u66f8\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7d44\u88dd\u51fa\u7cbe\u7f8e\u7684\u7a4d\u6728\u6a21\u578b\u3002

\u5716 1-5 \u00a0 \u62fc\u88dd\u7a4d\u6728

\u5169\u8005\u7684\u8a73\u7d30\u5c0d\u61c9\u95dc\u4fc2\u5982\u8868 1-1 \u6240\u793a\u3002

\u8868 1-1 \u00a0 \u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728

\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5 \u62fc\u88dd\u7a4d\u6728 \u8f38\u5165\u8cc7\u6599 \u672a\u62fc\u88dd\u7684\u7a4d\u6728 \u8cc7\u6599\u7d50\u69cb \u7a4d\u6728\u7d44\u7e54\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72c0\u3001\u5927\u5c0f\u3001\u9023\u7dda\u65b9\u5f0f\u7b49 \u6f14\u7b97\u6cd5 \u628a\u7a4d\u6728\u62fc\u6210\u76ee\u6a19\u5f62\u614b\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9a5f \u8f38\u51fa\u8cc7\u6599 \u7a4d\u6728\u6a21\u578b

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u662f\u7368\u7acb\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u66f8\u5f97\u4ee5\u63d0\u4f9b\u57fa\u65bc\u591a\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5be6\u73fe\u3002

\u7d04\u5b9a\u4fd7\u6210\u7684\u7c21\u7a31

\u5728\u5be6\u969b\u8a0e\u8ad6\u6642\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u201c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u201d\u7c21\u7a31\u70ba\u201c\u6f14\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u773e\u6240\u5468\u77e5\u7684 LeetCode \u6f14\u7b97\u6cd5\u984c\u76ee\uff0c\u5be6\u969b\u4e0a\u540c\u6642\u8003\u67e5\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u5169\u65b9\u9762\u7684\u77e5\u8b58\u3002

"},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

Abstract

\u6f14\u7b97\u6cd5\u7336\u5982\u7f8e\u5999\u7684\u4ea4\u97ff\u6a02\uff0c\u6bcf\u4e00\u884c\u7a0b\u5f0f\u78bc\u90fd\u50cf\u97fb\u5f8b\u822c\u6d41\u6dcc\u3002

\u9858\u9019\u672c\u66f8\u5728\u4f60\u7684\u8166\u6d77\u4e2d\u8f15\u8f15\u97ff\u8d77\uff0c\u7559\u4e0b\u7368\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

"},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 0.1 \u00a0 \u95dc\u65bc\u672c\u66f8
  • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8
  • 0.3 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u95dc\u65bc\u672c\u66f8","text":"

\u672c\u5c08\u6848\u65e8\u5728\u5efa\u7acb\u4e00\u672c\u958b\u6e90\u3001\u514d\u8cbb\u3001\u5c0d\u65b0\u624b\u53cb\u597d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5165\u9580\u6559\u7a0b\u3002

  • \u5168\u66f8\u63a1\u7528\u52d5\u756b\u5716\u89e3\uff0c\u7d50\u69cb\u5316\u5730\u8b1b\u89e3\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u5167\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\u3002
  • \u6f14\u7b97\u6cd5\u6e90\u7a0b\u5f0f\u78bc\u7686\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8a9e\u8a00\u3002
  • \u9f13\u52f5\u8b80\u8005\u5728\u7dda\u4e0a\u7ae0\u7bc0\u8a55\u8ad6\u5340\u4e92\u5e6b\u4e92\u52a9\u3001\u5171\u540c\u9032\u6b65\uff0c\u63d0\u554f\u8207\u8a55\u8ad6\u901a\u5e38\u53ef\u5728\u5169\u65e5\u5167\u5f97\u5230\u56de\u8986\u3002
"},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8b80\u8005\u7269\u4ef6","text":"

\u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\uff0c\u5f9e\u672a\u63a5\u89f8\u904e\u6f14\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7d93\u6709\u4e00\u4e9b\u5237\u984c\u7d93\u9a57\uff0c\u5c0d\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8a8d\u8b58\uff0c\u5728\u6703\u8207\u4e0d\u6703\u4e4b\u9593\u53cd\u8986\u6a6b\u8df3\uff0c\u90a3\u9ebc\u672c\u66f8\u6b63\u662f\u70ba\u4f60\u91cf\u8eab\u5b9a\u88fd\u7684\uff01

\u5982\u679c\u4f60\u5df2\u7d93\u7a4d\u7d2f\u4e00\u5b9a\u7684\u5237\u984c\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u984c\u578b\uff0c\u90a3\u9ebc\u672c\u66f8\u53ef\u52a9\u4f60\u56de\u9867\u8207\u68b3\u7406\u6f14\u7b97\u6cd5\u77e5\u8b58\u9ad4\u7cfb\uff0c\u5009\u5eab\u6e90\u7a0b\u5f0f\u78bc\u53ef\u4ee5\u7576\u4f5c\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u6216\u201c\u6f14\u7b97\u6cd5\u5b57\u5178\u201d\u4f86\u4f7f\u7528\u3002

\u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u5011\u671f\u5f85\u6536\u5230\u4f60\u7684\u5bf6\u8cb4\u5efa\u8b70\uff0c\u6216\u8005\u4e00\u8d77\u53c3\u8207\u5275\u4f5c\u3002

\u524d\u7f6e\u689d\u4ef6

\u4f60\u9700\u8981\u81f3\u5c11\u5177\u5099\u4efb\u4e00\u8a9e\u8a00\u7684\u7a0b\u5f0f\u8a2d\u8a08\u57fa\u790e\uff0c\u80fd\u5920\u95b1\u8b80\u548c\u7de8\u5beb\u7c21\u55ae\u7a0b\u5f0f\u78bc\u3002

"},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5167\u5bb9\u7d50\u69cb","text":"

\u672c\u66f8\u7684\u4e3b\u8981\u5167\u5bb9\u5982\u5716 0-1 \u6240\u793a\u3002

  • \u8907\u96dc\u5ea6\u5206\u6790\uff1a\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u7684\u8a55\u50f9\u7dad\u5ea6\u8207\u65b9\u6cd5\u3002\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u898b\u578b\u5225\u3001\u793a\u4f8b\u7b49\u3002
  • \u8cc7\u6599\u7d50\u69cb\uff1a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u5206\u985e\u65b9\u6cd5\u3002\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u898b\u578b\u5225\u3001\u5178\u578b\u61c9\u7528\u3001\u5be6\u73fe\u65b9\u6cd5\u7b49\u3002
  • \u6f14\u7b97\u6cd5\uff1a\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u6548\u7387\u3001\u61c9\u7528\u5834\u666f\u3001\u89e3\u984c\u6b65\u9a5f\u548c\u793a\u4f8b\u554f\u984c\u7b49\u3002

\u5716 0-1 \u00a0 \u672c\u66f8\u4e3b\u8981\u5167\u5bb9

"},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8b1d","text":"

\u672c\u66f8\u5728\u958b\u6e90\u793e\u7fa4\u773e\u591a\u8ca2\u737b\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65b7\u5b8c\u5584\u3002\u611f\u8b1d\u6bcf\u4e00\u4f4d\u6295\u5165\u6642\u9593\u8207\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u5011\u662f\uff08\u6309\u7167 GitHub \u81ea\u52d5\u751f\u6210\u7684\u9806\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\uff09\u3002\u611f\u8b1d\u4ed6\u5011\u4ed8\u51fa\u7684\u6642\u9593\u8207\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u5011\u78ba\u4fdd\u4e86\u5404\u8a9e\u8a00\u7a0b\u5f0f\u78bc\u7684\u898f\u7bc4\u8207\u7d71\u4e00\u3002

\u5728\u672c\u66f8\u7684\u5275\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8a31\u591a\u4eba\u7684\u5e6b\u52a9\u3002

  • \u611f\u8b1d\u6211\u5728\u516c\u53f8\u7684\u5c0e\u5e2b\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u66a2\u8ac7\u4e2d\u4f60\u9f13\u52f5\u6211\u201c\u5feb\u884c\u52d5\u8d77\u4f86\u201d\uff0c\u5805\u5b9a\u4e86\u6211\u5beb\u9019\u672c\u66f8\u7684\u6c7a\u5fc3\uff1b
  • \u611f\u8b1d\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u70ba\u672c\u66f8\u7684\u9996\u4f4d\u8b80\u8005\uff0c\u5f9e\u6f14\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8a31\u591a\u5bf6\u8cb4\u5efa\u8b70\uff0c\u4f7f\u5f97\u672c\u66f8\u66f4\u9069\u5408\u65b0\u624b\u95b1\u8b80\uff1b
  • \u611f\u8b1d\u9a30\u5bf6\u3001\u7426\u5bf6\u3001\u98db\u5bf6\u70ba\u672c\u66f8\u8d77\u4e86\u4e00\u500b\u5bcc\u6709\u5275\u610f\u7684\u540d\u5b57\uff0c\u559a\u8d77\u5927\u5bb6\u5beb\u4e0b\u7b2c\u4e00\u884c\u7a0b\u5f0f\u78bc\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u61b6\uff1b
  • \u611f\u8b1d\u6821\u9293\u5728\u667a\u6167\u8ca1\u7522\u6b0a\u65b9\u9762\u63d0\u4f9b\u7684\u5c08\u696d\u5e6b\u52a9\uff0c\u9019\u5c0d\u672c\u958b\u6e90\u66f8\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
  • \u611f\u8b1d\u8607\u6f7c\u70ba\u672c\u66f8\u8a2d\u8a08\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u4e26\u5728\u6211\u7684\u5f37\u8feb\u75c7\u7684\u9a45\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
  • \u611f\u8b1d @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8b70\uff0c\u4ee5\u53ca\u4ed6\u958b\u767c\u7684\u958b\u6e90\u6587\u4ef6\u4e3b\u984c Material-for-MkDocs \u3002

\u5728\u5beb\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u95b1\u8b80\u4e86\u8a31\u591a\u95dc\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u9019\u4e9b\u4f5c\u54c1\u70ba\u672c\u66f8\u63d0\u4f9b\u4e86\u512a\u79c0\u7684\u7bc4\u672c\uff0c\u78ba\u4fdd\u4e86\u672c\u66f8\u5167\u5bb9\u7684\u6e96\u78ba\u6027\u8207\u54c1\u8cea\u3002\u5728\u6b64\u611f\u8b1d\u6240\u6709\u8001\u5e2b\u548c\u524d\u8f29\u7684\u5091\u51fa\u8ca2\u737b\uff01

\u672c\u66f8\u5021\u5c0e\u624b\u8166\u4e26\u7528\u7684\u5b78\u7fd2\u65b9\u5f0f\uff0c\u5728\u9019\u4e00\u9ede\u4e0a\u6211\u6df1\u53d7\u300a\u52d5\u624b\u5b78\u6df1\u5ea6\u5b78\u7fd2\u300b\u7684\u555f\u767c\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8b80\u8005\u5f37\u70c8\u63a8\u85a6\u9019\u672c\u512a\u79c0\u7684\u8457\u4f5c\u3002

\u8877\u5fc3\u611f\u8b1d\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u5011\u4e00\u76f4\u4ee5\u4f86\u7684\u652f\u6301\u8207\u9f13\u52f5\uff0c\u8b93\u6211\u6709\u6a5f\u6703\u505a\u9019\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

"},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8","text":"

Tip

\u70ba\u4e86\u7372\u5f97\u6700\u4f73\u7684\u95b1\u8b80\u9ad4\u9a57\uff0c\u5efa\u8b70\u4f60\u901a\u8b80\u672c\u7bc0\u5167\u5bb9\u3002

"},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98a8\u683c\u7d04\u5b9a","text":"
  • \u6a19\u984c\u5f8c\u6a19\u8a3b * \u7684\u662f\u9078\u8b80\u7ae0\u7bc0\uff0c\u5167\u5bb9\u76f8\u5c0d\u56f0\u96e3\u3002\u5982\u679c\u4f60\u7684\u6642\u9593\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\u3002
  • \u5c08\u696d\u8853\u8a9e\u6703\u4f7f\u7528\u9ed1\u9ad4\uff08\u7d19\u8cea\u7248\u548c PDF \u7248\uff09\u6216\u65b0\u589e\u4e0b\u5283\u7dda\uff08\u7db2\u9801\u7248\uff09\uff0c\u4f8b\u5982\u9663\u5217\uff08array\uff09\u3002\u5efa\u8b70\u8a18\u4f4f\u5b83\u5011\uff0c\u4ee5\u4fbf\u95b1\u8b80\u6587\u737b\u3002
  • \u91cd\u9ede\u5167\u5bb9\u548c\u7e3d\u7d50\u6027\u8a9e\u53e5\u6703 \u52a0\u7c97\uff0c\u9019\u985e\u6587\u5b57\u503c\u5f97\u7279\u5225\u95dc\u6ce8\u3002
  • \u6709\u7279\u6307\u542b\u7fa9\u7684\u8a5e\u53e5\u6703\u4f7f\u7528\u201c\u5f15\u865f\u201d\u6a19\u8a3b\uff0c\u4ee5\u907f\u514d\u6b67\u7fa9\u3002
  • \u7576\u6d89\u53ca\u7a0b\u5f0f\u8a9e\u8a00\u4e4b\u9593\u4e0d\u4e00\u81f4\u7684\u540d\u8a5e\u6642\uff0c\u672c\u66f8\u5747\u4ee5 Python \u70ba\u6e96\uff0c\u4f8b\u5982\u4f7f\u7528 None \u4f86\u8868\u793a\u201c\u7a7a\u201d\u3002
  • \u672c\u66f8\u90e8\u5206\u653e\u68c4\u4e86\u7a0b\u5f0f\u8a9e\u8a00\u7684\u8a3b\u91cb\u898f\u7bc4\uff0c\u4ee5\u63db\u53d6\u66f4\u52a0\u7dca\u6e4a\u7684\u5167\u5bb9\u6392\u7248\u3002\u8a3b\u91cb\u4e3b\u8981\u5206\u70ba\u4e09\u7a2e\u985e\u578b\uff1a\u6a19\u984c\u8a3b\u91cb\u3001\u5167\u5bb9\u8a3b\u91cb\u3001\u591a\u884c\u8a3b\u91cb\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
\"\"\"\u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\"\"\"\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n\"\"\"\n\u591a\u884c\n\u8a3b\u91cb\n\"\"\"\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
/* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
### \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 ###\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n# \u591a\u884c\n# \u8a3b\u91cb\n
// \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n// \u591a\u884c\n// \u8a3b\u91cb\n
"},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52d5\u756b\u5716\u89e3\u4e2d\u9ad8\u6548\u5b78\u7fd2","text":"

\u76f8\u8f03\u65bc\u6587\u5b57\uff0c\u5f71\u7247\u548c\u5716\u7247\u5177\u6709\u66f4\u9ad8\u7684\u8cc7\u8a0a\u5bc6\u5ea6\u548c\u7d50\u69cb\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u65bc\u7406\u89e3\u3002\u5728\u672c\u66f8\u4e2d\uff0c\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u5c07\u4e3b\u8981\u900f\u904e\u52d5\u756b\u4ee5\u5716\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5247\u4f5c\u70ba\u89e3\u91cb\u8207\u88dc\u5145\u3002

\u5982\u679c\u4f60\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u767c\u73fe\u67d0\u6bb5\u5167\u5bb9\u63d0\u4f9b\u77ad\u5982\u5716 0-2 \u6240\u793a\u7684\u52d5\u756b\u5716\u89e3\uff0c\u8acb\u4ee5\u5716\u70ba\u4e3b\u3001\u4ee5\u6587\u5b57\u70ba\u8f14\uff0c\u7d9c\u5408\u5169\u8005\u4f86\u7406\u89e3\u5167\u5bb9\u3002

\u5716 0-2 \u00a0 \u52d5\u756b\u5716\u89e3\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u7a0b\u5f0f\u78bc\u5be6\u8e10\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

\u672c\u66f8\u7684\u914d\u5957\u7a0b\u5f0f\u78bc\u8a17\u7ba1\u5728 GitHub \u5009\u5eab\u3002\u5982\u5716 0-3 \u6240\u793a\uff0c\u6e90\u7a0b\u5f0f\u78bc\u9644\u6709\u6e2c\u8a66\u6a23\u4f8b\uff0c\u53ef\u4e00\u9375\u57f7\u884c\u3002

\u5982\u679c\u6642\u9593\u5141\u8a31\uff0c\u5efa\u8b70\u4f60\u53c3\u7167\u7a0b\u5f0f\u78bc\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b78\u7fd2\u6642\u9593\u6709\u9650\uff0c\u8acb\u81f3\u5c11\u901a\u8b80\u4e26\u57f7\u884c\u6240\u6709\u7a0b\u5f0f\u78bc\u3002

\u8207\u95b1\u8b80\u7a0b\u5f0f\u78bc\u76f8\u6bd4\uff0c\u7de8\u5beb\u7a0b\u5f0f\u78bc\u7684\u904e\u7a0b\u5f80\u5f80\u80fd\u5e36\u4f86\u66f4\u591a\u6536\u7a6b\u3002\u52d5\u624b\u5b78\uff0c\u624d\u662f\u771f\u7684\u5b78\u3002

\u5716 0-3 \u00a0 \u57f7\u884c\u7a0b\u5f0f\u78bc\u793a\u4f8b

\u57f7\u884c\u7a0b\u5f0f\u78bc\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\u3002

\u7b2c\u4e00\u6b65\uff1a\u5b89\u88dd\u672c\u5730\u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u3002\u8acb\u53c3\u7167\u9644\u9304\u6240\u793a\u7684\u6559\u7a0b\u9032\u884c\u5b89\u88dd\uff0c\u5982\u679c\u5df2\u5b89\u88dd\uff0c\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002

\u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u5009\u5eab\u3002\u524d\u5f80 GitHub \u5009\u5eab\u3002\u5982\u679c\u5df2\u7d93\u5b89\u88dd Git \uff0c\u53ef\u4ee5\u900f\u904e\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u5009\u5eab\uff1a

git clone https://github.com/krahets/hello-algo.git\n

\u7576\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5716 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u9ede\u9078\u201cDownload ZIP\u201d\u6309\u9215\u76f4\u63a5\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u58d3\u7e2e\u5305\uff0c\u7136\u5f8c\u5728\u672c\u5730\u89e3\u58d3\u5373\u53ef\u3002

\u5716 0-4 \u00a0 \u514b\u9686\u5009\u5eab\u8207\u4e0b\u8f09\u7a0b\u5f0f\u78bc

\u7b2c\u4e09\u6b65\uff1a\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 0-5 \u6240\u793a\uff0c\u5c0d\u65bc\u9802\u90e8\u6a19\u6709\u6a94\u6848\u540d\u7a31\u7684\u7a0b\u5f0f\u78bc\u584a\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u5009\u5eab\u7684 codes \u6a94\u6848\u593e\u5167\u627e\u5230\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u3002\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5c07\u5e6b\u52a9\u4f60\u7bc0\u7701\u4e0d\u5fc5\u8981\u7684\u9664\u932f\u6642\u9593\uff0c\u8b93\u4f60\u80fd\u5920\u5c08\u6ce8\u65bc\u5b78\u7fd2\u5167\u5bb9\u3002

\u5716 0-5 \u00a0 \u7a0b\u5f0f\u78bc\u584a\u8207\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848

\u9664\u4e86\u672c\u5730\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u7db2\u9801\u7248\u9084\u652f\u6301 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c\uff08\u57fa\u65bc pythontutor \u5be6\u73fe\uff09\u3002\u5982\u5716 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u9ede\u9078\u7a0b\u5f0f\u78bc\u584a\u4e0b\u65b9\u7684\u201c\u8996\u89ba\u5316\u57f7\u884c\u201d\u4f86\u5c55\u958b\u6aa2\u8996\uff0c\u89c0\u5bdf\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u9ede\u9078\u201c\u5168\u5c4f\u89c0\u770b\u201d\uff0c\u4ee5\u7372\u5f97\u66f4\u597d\u7684\u95b1\u89bd\u9ad4\u9a57\u3002

\u5716 0-6 \u00a0 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c

"},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u554f\u8a0e\u8ad6\u4e2d\u5171\u540c\u6210\u9577","text":"

\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u8acb\u4e0d\u8981\u8f15\u6613\u8df3\u904e\u90a3\u4e9b\u6c92\u5b78\u660e\u767d\u7684\u77e5\u8b58\u9ede\u3002\u6b61\u8fce\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u4f60\u7684\u554f\u984c\uff0c\u6211\u548c\u5c0f\u5925\u4f34\u5011\u5c07\u7aed\u8aa0\u70ba\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u6cc1\u4e0b\u53ef\u5728\u5169\u5929\u5167\u56de\u8986\u3002

\u5982\u5716 0-7 \u6240\u793a\uff0c\u7db2\u9801\u7248\u6bcf\u500b\u7ae0\u7bc0\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8a55\u8ad6\u5340\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u95dc\u6ce8\u8a55\u8ad6\u5340\u7684\u5167\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u77ad\u89e3\u5927\u5bb6\u9047\u5230\u7684\u554f\u984c\uff0c\u5f9e\u800c\u67e5\u6f0f\u88dc\u7f3a\uff0c\u6fc0\u767c\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u5925\u4f34\u7684\u554f\u984c\uff0c\u5206\u4eab\u4f60\u7684\u898b\u89e3\uff0c\u5e6b\u52a9\u4ed6\u4eba\u9032\u6b65\u3002

\u5716 0-7 \u00a0 \u8a55\u8ad6\u5340\u793a\u4f8b

"},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda","text":"

\u5f9e\u7e3d\u9ad4\u4e0a\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u904e\u7a0b\u5283\u5206\u70ba\u4e09\u500b\u968e\u6bb5\u3002

  1. \u968e\u6bb5\u4e00\uff1a\u6f14\u7b97\u6cd5\u5165\u9580\u3002\u6211\u5011\u9700\u8981\u719f\u6089\u5404\u7a2e\u8cc7\u6599\u7d50\u69cb\u7684\u7279\u9ede\u548c\u7528\u6cd5\uff0c\u5b78\u7fd2\u4e0d\u540c\u6f14\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5167\u5bb9\u3002
  2. \u968e\u6bb5\u4e8c\uff1a\u5237\u6f14\u7b97\u6cd5\u984c\u3002\u5efa\u8b70\u5f9e\u71b1\u9580\u984c\u76ee\u958b\u5237\uff0c\u5148\u7a4d\u7d2f\u81f3\u5c11 100 \u9053\u984c\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u3002\u521d\u6b21\u5237\u984c\u6642\uff0c\u201c\u77e5\u8b58\u907a\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u500b\u6311\u6230\uff0c\u4f46\u8acb\u653e\u5fc3\uff0c\u9019\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u5011\u53ef\u4ee5\u6309\u7167\u201c\u827e\u8cd3\u6d69\u65af\u907a\u5fd8\u66f2\u7dda\u201d\u4f86\u8907\u7fd2\u984c\u76ee\uff0c\u901a\u5e38\u5728\u9032\u884c 3\uff5e5 \u8f2a\u7684\u91cd\u8907\u5f8c\uff0c\u5c31\u80fd\u5c07\u5176\u7262\u8a18\u5728\u5fc3\u3002\u63a8\u85a6\u7684\u984c\u55ae\u548c\u5237\u984c\u8a08\u5283\u8acb\u898b\u6b64 GitHub \u5009\u5eab\u3002
  3. \u968e\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5b78\u7fd2\u65b9\u9762\uff0c\u6211\u5011\u53ef\u4ee5\u95b1\u8b80\u6f14\u7b97\u6cd5\u5c08\u6b04\u6587\u7ae0\u3001\u89e3\u984c\u6846\u67b6\u548c\u6f14\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65b7\u8c50\u5bcc\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5237\u984c\u65b9\u9762\uff0c\u53ef\u4ee5\u5617\u8a66\u63a1\u7528\u9032\u968e\u5237\u984c\u7b56\u7565\uff0c\u5982\u6309\u5c08\u984c\u5206\u985e\u3001\u4e00\u984c\u591a\u89e3\u3001\u4e00\u89e3\u591a\u984c\u7b49\uff0c\u76f8\u95dc\u7684\u5237\u984c\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u500b\u793e\u7fa4\u627e\u5230\u3002

\u5982\u5716 0-8 \u6240\u793a\uff0c\u672c\u66f8\u5167\u5bb9\u4e3b\u8981\u6db5\u84cb\u201c\u968e\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e6b\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u958b\u968e\u6bb5\u4e8c\u548c\u968e\u6bb5\u4e09\u7684\u5b78\u7fd2\u3002

\u5716 0-8 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda

"},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7d50","text":"
  • \u672c\u66f8\u7684\u4e3b\u8981\u53d7\u773e\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u790e\uff0c\u672c\u66f8\u80fd\u5e6b\u52a9\u4f60\u7cfb\u7d71\u56de\u9867\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u66f8\u4e2d\u6e90\u7a0b\u5f0f\u78bc\u4e5f\u53ef\u4f5c\u70ba\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u4f7f\u7528\u3002
  • \u66f8\u4e2d\u5167\u5bb9\u4e3b\u8981\u5305\u62ec\u8907\u96dc\u5ea6\u5206\u6790\u3001\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u84cb\u4e86\u8a72\u9818\u57df\u7684\u5927\u90e8\u5206\u4e3b\u984c\u3002
  • \u5c0d\u65bc\u6f14\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b78\u968e\u6bb5\u95b1\u8b80\u4e00\u672c\u5165\u9580\u66f8\u81f3\u95dc\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8a31\u591a\u5f4e\u8def\u3002
  • \u66f8\u4e2d\u7684\u52d5\u756b\u5716\u89e3\u901a\u5e38\u7528\u65bc\u4ecb\u7d39\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u3002\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u61c9\u7d66\u4e88\u9019\u4e9b\u5167\u5bb9\u66f4\u591a\u95dc\u6ce8\u3002
  • \u5be6\u8e10\u4e43\u5b78\u7fd2\u7a0b\u5f0f\u8a2d\u8a08\u4e4b\u6700\u4f73\u9014\u5f91\u3002\u5f37\u70c8\u5efa\u8b70\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u4e26\u89aa\u81ea\u6572\u7a0b\u5f0f\u78bc\u3002
  • \u672c\u66f8\u7db2\u9801\u7248\u7684\u6bcf\u500b\u7ae0\u7bc0\u90fd\u8a2d\u6709\u8a55\u8ad6\u5340\uff0c\u6b61\u8fce\u96a8\u6642\u5206\u4eab\u4f60\u7684\u7591\u60d1\u8207\u898b\u89e3\u3002
"},{"location":"chapter_reference/","title":"\u53c3\u8003\u6587\u737b","text":"

[1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

[2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

[3] Robert Sedgewick, et al. Algorithms (4th Edition).

[4] \u56b4\u851a\u654f. \u8cc7\u6599\u7d50\u69cb\uff08C \u8a9e\u8a00\u7248\uff09.

[5] \u9127\u4fca\u8f1d. \u8cc7\u6599\u7d50\u69cb\uff08C++ \u8a9e\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

[6] \u99ac\u514b \u827e\u502b \u7dad\u65af\u8457\uff0c\u9673\u8d8a\u8b6f. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5206\u6790\uff1aJava\u8a9e\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

[7] \u7a0b\u5091. \u5927\u8a71\u8cc7\u6599\u7d50\u69cb.

[8] \u738b\u722d. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u7f8e.

[9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

[10] Aston Zhang, et al. Dive into Deep Learning.

"},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u5c0b","text":"

Abstract

\u641c\u5c0b\u662f\u4e00\u5834\u672a\u77e5\u7684\u5192\u96aa\uff0c\u6211\u5011\u6216\u8a31\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u9593\u7684\u6bcf\u500b\u89d2\u843d\uff0c\u53c8\u6216\u8a31\u53ef\u4ee5\u5feb\u901f\u9396\u5b9a\u76ee\u6a19\u3002

\u5728\u9019\u5834\u5c0b\u8993\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u500b\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

"},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b
  • 10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede
  • 10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c
  • 10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565
  • 10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5
  • 10.6 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b","text":"

\u4e8c\u5206\u641c\u5c0b\uff08binary search\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\u641c\u5c0b\u7bc4\u570d\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u70ba\u6b62\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5143\u7d20\u6309\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u8907\u3002\u8acb\u67e5\u8a62\u4e26\u8fd4\u56de\u5143\u7d20 target \u5728\u8a72\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 10-1 \u6240\u793a\u3002

\u5716 10-1 \u00a0 \u4e8c\u5206\u641c\u5c0b\u793a\u4f8b\u8cc7\u6599

\u5982\u5716 10-2 \u6240\u793a\uff0c\u6211\u5011\u5148\u521d\u59cb\u5316\u6307\u6a19 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u5c0b\u5340\u9593 \\([0, n - 1]\\) \u3002\u8acb\u6ce8\u610f\uff0c\u4e2d\u62ec\u865f\u8868\u793a\u9589\u5340\u9593\uff0c\u5176\u5305\u542b\u908a\u754c\u503c\u672c\u8eab\u3002

\u63a5\u4e0b\u4f86\uff0c\u8ff4\u5708\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
  2. \u5224\u65b7 nums[m] \u548c target \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u4e09\u7a2e\u60c5\u6cc1\u3002
    1. \u7576 nums[m] < target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(i = m + 1\\) \u3002
    2. \u7576 nums[m] > target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(j = m - 1\\) \u3002
    3. \u7576 nums[m] = target \u6642\uff0c\u8aaa\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

\u82e5\u9663\u5217\u4e0d\u5305\u542b\u76ee\u6a19\u5143\u7d20\uff0c\u641c\u5c0b\u5340\u9593\u6700\u7d42\u6703\u7e2e\u5c0f\u70ba\u7a7a\u3002\u6b64\u6642\u8fd4\u56de \\(-1\\) \u3002

<1><2><3><4><5><6><7>

\u5716 10-2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u6d41\u7a0b

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u578b\u5225\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u6703\u8d85\u51fa int \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u3002\u70ba\u4e86\u907f\u514d\u5927\u6578\u8d8a\u754c\uff0c\u6211\u5011\u901a\u5e38\u63a1\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u4f86\u8a08\u7b97\u4e2d\u9ede\u3002

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8ad6\u4e0a Python \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while i <= j\n    # \u7406\u8ad6\u4e0a Ruby \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n    m = (i + j) / 2   # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u8ff4\u5708\u4e2d\uff0c\u5340\u9593\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u70ba \\(\\log_2 n\\) \u3002

\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7a7a\u9593\u3002

"},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u5340\u9593\u8868\u793a\u65b9\u6cd5","text":"

\u9664\u4e86\u4e0a\u8ff0\u96d9\u9589\u5340\u9593\u5916\uff0c\u5e38\u898b\u7684\u5340\u9593\u8868\u793a\u9084\u6709\u201c\u5de6\u9589\u53f3\u958b\u201d\u5340\u9593\uff0c\u5b9a\u7fa9\u70ba \\([0, n)\\) \uff0c\u5373\u5de6\u908a\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u908a\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8a72\u8868\u793a\u4e0b\uff0c\u5340\u9593 \\([i, j)\\) \u5728 \\(i = j\\) \u6642\u70ba\u7a7a\u3002

\u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u8a72\u8868\u793a\u5be6\u73fe\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
binary_search.cpp
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.java
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.cs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.go
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.swift
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.js
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.ts
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
binary_search.dart
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
binary_search.rs
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.c
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
binary_search.kt
/* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
binary_search.rb
### \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while i < j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
binary_search.zig
// \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u5982\u5716 10-3 \u6240\u793a\uff0c\u5728\u5169\u7a2e\u5340\u9593\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u8ff4\u5708\u689d\u4ef6\u548c\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

\u7531\u65bc\u201c\u96d9\u9589\u5340\u9593\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u908a\u754c\u90fd\u88ab\u5b9a\u7fa9\u70ba\u9589\u5340\u9593\uff0c\u56e0\u6b64\u900f\u904e\u6307\u6a19 \\(i\\) \u548c\u6307\u6a19 \\(j\\) \u7e2e\u5c0f\u5340\u9593\u7684\u64cd\u4f5c\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u9019\u6a23\u66f4\u4e0d\u5bb9\u6613\u51fa\u932f\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8b70\u63a1\u7528\u201c\u96d9\u9589\u5340\u9593\u201d\u7684\u5beb\u6cd5\u3002

\u5716 10-3 \u00a0 \u5169\u7a2e\u5340\u9593\u5b9a\u7fa9

"},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u4e8c\u5206\u641c\u5c0b\u5728\u6642\u9593\u548c\u7a7a\u9593\u65b9\u9762\u90fd\u6709\u8f03\u597d\u7684\u6548\u80fd\u3002

  • \u4e8c\u5206\u641c\u5c0b\u7684\u6642\u9593\u6548\u7387\u9ad8\u3002\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\uff0c\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5177\u6709\u986f\u8457\u512a\u52e2\u3002\u4f8b\u5982\uff0c\u7576\u8cc7\u6599\u5927\u5c0f \\(n = 2^{20}\\) \u6642\uff0c\u7dda\u6027\u67e5\u8a62\u9700\u8981 \\(2^{20} = 1048576\\) \u8f2a\u8ff4\u5708\uff0c\u800c\u4e8c\u5206\u641c\u5c0b\u50c5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f2a\u8ff4\u5708\u3002
  • \u4e8c\u5206\u641c\u5c0b\u7121\u9808\u984d\u5916\u7a7a\u9593\u3002\u76f8\u8f03\u65bc\u9700\u8981\u85c9\u52a9\u984d\u5916\u7a7a\u9593\u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08\u4f8b\u5982\u96dc\u6e4a\u67e5\u8a62\uff09\uff0c\u4e8c\u5206\u641c\u5c0b\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002

\u7136\u800c\uff0c\u4e8c\u5206\u641c\u5c0b\u4e26\u975e\u9069\u7528\u65bc\u6240\u6709\u60c5\u6cc1\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u6709\u5e8f\u8cc7\u6599\u3002\u82e5\u8f38\u5165\u8cc7\u6599\u7121\u5e8f\uff0c\u70ba\u4e86\u4f7f\u7528\u4e8c\u5206\u641c\u5c0b\u800c\u5c08\u9580\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u511f\u5931\u3002\u56e0\u70ba\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u6bd4\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u90fd\u66f4\u9ad8\u3002\u5c0d\u65bc\u983b\u7e41\u63d2\u5165\u5143\u7d20\u7684\u5834\u666f\uff0c\u70ba\u4fdd\u6301\u9663\u5217\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c07\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8cb4\u7684\u3002
  • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u8df3\u8e8d\u5f0f\uff08\u975e\u9023\u7e8c\u5730\uff09\u8a2a\u554f\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u57f7\u884c\u8df3\u8e8d\u5f0f\u8a2a\u554f\u7684\u6548\u7387\u8f03\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u61c9\u7528\u5728\u93c8\u7d50\u4e32\u5217\u6216\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u5c0f\u8cc7\u6599\u91cf\u4e0b\uff0c\u7dda\u6027\u67e5\u8a62\u6548\u80fd\u66f4\u4f73\u3002\u7dda\u4e0a\u6027\u67e5\u8a62\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u9700 1 \u6b21\u5224\u65b7\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65b7\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u6e1b\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u7576\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5c0f\u6642\uff0c\u7dda\u6027\u67e5\u8a62\u53cd\u800c\u6bd4\u4e8c\u5206\u641c\u5c0b\u66f4\u5feb\u3002
"},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u8a62\u5de6\u908a\u754c","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\u3002\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e2d\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

\u56de\u61b6\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u7684\u65b9\u6cd5\uff0c\u641c\u5c0b\u5b8c\u6210\u5f8c \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target \uff0c\u56e0\u6b64\u67e5\u8a62\u63d2\u5165\u9ede\u672c\u8cea\u4e0a\u662f\u5728\u67e5\u8a62\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002

\u8003\u616e\u900f\u904e\u67e5\u8a62\u63d2\u5165\u9ede\u7684\u51fd\u5f0f\u5be6\u73fe\u67e5\u8a62\u5de6\u908a\u754c\u3002\u8acb\u6ce8\u610f\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u9019\u7a2e\u60c5\u6cc1\u53ef\u80fd\u5c0e\u81f4\u4ee5\u4e0b\u5169\u7a2e\u7d50\u679c\u3002

  • \u63d2\u5165\u9ede\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
  • \u5143\u7d20 nums[i] \u8207 target \u4e0d\u76f8\u7b49\u3002

\u7576\u9047\u5230\u4ee5\u4e0a\u5169\u7a2e\u60c5\u6cc1\u6642\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target\"\"\"\n    # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
binary_search_edge.cpp
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u641c\u5c0b\u6700\u5de6\u4e00\u500b target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchLeftEdge}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u8a62\u53f3\u908a\u754c","text":"

\u90a3\u9ebc\u5982\u4f55\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u7a0b\u5f0f\u78bc\uff0c\u66ff\u63db\u5728 nums[m] == target \u60c5\u6cc1\u4e0b\u7684\u6307\u6a19\u6536\u7e2e\u64cd\u4f5c\u3002\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

\u4e0b\u9762\u6211\u5011\u4ecb\u7d39\u5169\u7a2e\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

"},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u8907\u7528\u67e5\u8a62\u5de6\u908a\u754c","text":"

\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u67e5\u8a62\u6700\u5de6\u5143\u7d20\u7684\u51fd\u5f0f\u4f86\u67e5\u8a62\u6700\u53f3\u5143\u7d20\uff0c\u5177\u9ad4\u65b9\u6cd5\u70ba\uff1a\u5c07\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\u3002

\u5982\u5716 10-7 \u6240\u793a\uff0c\u67e5\u8a62\u5b8c\u6210\u5f8c\uff0c\u6307\u6a19 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

\u5716 10-7 \u00a0 \u5c07\u67e5\u8a62\u53f3\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5de6\u908a\u754c

\u8acb\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u9ede\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c07\u5176\u6e1b \\(1\\) \uff0c\u5f9e\u800c\u7372\u5f97 \\(j\\) \uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target\"\"\"\n    # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
binary_search_edge.cpp
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.java
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.cs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.go
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.swift
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.js
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.ts
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.dart
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
binary_search_edge.rs
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
binary_search_edge.c
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
binary_search_edge.kt
/* \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
binary_search_edge.rb
### \u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
binary_search_edge.zig
[class]{}-[func]{binarySearchRightEdge}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20","text":"

\u6211\u5011\u77e5\u9053\uff0c\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u6700\u7d42 \\(i\\) \u548c \\(j\\) \u6703\u5206\u5225\u6307\u5411\u9996\u500b\u5927\u65bc\u3001\u5c0f\u65bc target \u7684\u5143\u7d20\u3002

\u56e0\u6b64\uff0c\u5982\u5716 10-8 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u69cb\u9020\u4e00\u500b\u9663\u5217\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u65bc\u67e5\u8a62\u5de6\u53f3\u908a\u754c\u3002

  • \u67e5\u8a62\u6700\u5de6\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target - 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(i\\) \u3002
  • \u67e5\u8a62\u6700\u53f3\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target + 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(j\\) \u3002

\u5716 10-8 \u00a0 \u5c07\u67e5\u8a62\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20

\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u5169\u9ede\u503c\u5f97\u6ce8\u610f\u3002

  • \u7d66\u5b9a\u9663\u5217\u4e0d\u5305\u542b\u5c0f\u6578\uff0c\u9019\u610f\u5473\u8457\u6211\u5011\u7121\u9808\u95dc\u5fc3\u5982\u4f55\u8655\u7406\u76f8\u7b49\u7684\u60c5\u6cc1\u3002
  • \u56e0\u70ba\u8a72\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6578\uff0c\u6240\u4ee5\u9700\u8981\u5c07\u51fd\u5f0f\u4e2d\u7684\u8b8a\u6578 target \u6539\u70ba\u6d6e\u9ede\u6578\u578b\u5225\uff08Python \u7121\u9808\u6539\u52d5\uff09\u3002
"},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede","text":"

\u4e8c\u5206\u641c\u5c0b\u4e0d\u50c5\u53ef\u7528\u65bc\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\uff0c\u9084\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u8b8a\u7a2e\u554f\u984c\uff0c\u6bd4\u5982\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

"},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \u548c\u4e00\u500b\u5143\u7d20 target \uff0c\u9663\u5217\u4e0d\u5b58\u5728\u91cd\u8907\u5143\u7d20\u3002\u73fe\u5c07 target \u63d2\u5165\u9663\u5217 nums \u4e2d\uff0c\u4e26\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u9663\u5217\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5247\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8acb\u8fd4\u56de\u63d2\u5165\u5f8c target \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u5716 10-4 \u6240\u793a\u3002

\u5716 10-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u793a\u4f8b\u8cc7\u6599

\u5982\u679c\u60f3\u8907\u7528\u4e0a\u4e00\u7bc0\u7684\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\uff0c\u5247\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u5169\u500b\u554f\u984c\u3002

\u554f\u984c\u4e00\uff1a\u7576\u9663\u5217\u4e2d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u662f\u5426\u662f\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u984c\u76ee\u8981\u6c42\u5c07 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u908a\uff0c\u9019\u610f\u5473\u8457\u65b0\u63d2\u5165\u7684 target \u66ff\u63db\u4e86\u539f\u4f86 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u7576\u9663\u5217\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u5c31\u662f\u8a72 target \u7684\u7d22\u5f15\u3002

\u554f\u984c\u4e8c\uff1a\u7576\u9663\u5217\u4e2d\u4e0d\u5b58\u5728 target \u6642\uff0c\u63d2\u5165\u9ede\u662f\u54ea\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff1f

\u9032\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u641c\u5c0b\u904e\u7a0b\uff1a\u7576 nums[m] < target \u6642 \\(i\\) \u79fb\u52d5\uff0c\u9019\u610f\u5473\u8457\u6307\u6a19 \\(i\\) \u5728\u5411\u5927\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u6a19 \\(j\\) \u59cb\u7d42\u5728\u5411\u5c0f\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u56e0\u6b64\u4e8c\u5206\u7d50\u675f\u6642\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u3002\u6613\u5f97\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u7d22\u5f15\u70ba \\(i\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertionSimple}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

Question

\u5728\u4e0a\u4e00\u984c\u7684\u57fa\u790e\u4e0a\uff0c\u898f\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u5176\u9918\u4e0d\u8b8a\u3002

\u5047\u8a2d\u9663\u5217\u4e2d\u5b58\u5728\u591a\u500b target \uff0c\u5247\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u800c\u7121\u6cd5\u78ba\u5b9a\u8a72\u5143\u7d20\u7684\u5de6\u908a\u548c\u53f3\u908a\u9084\u6709\u591a\u5c11 target\u3002

\u984c\u76ee\u8981\u6c42\u5c07\u76ee\u6a19\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u908a\uff0c\u6240\u4ee5\u6211\u5011\u9700\u8981\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u616e\u900f\u904e\u5716 10-5 \u6240\u793a\u7684\u6b65\u9a5f\u5be6\u73fe\u3002

  1. \u57f7\u884c\u4e8c\u5206\u641c\u5c0b\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\(k\\) \u3002
  2. \u5f9e\u7d22\u5f15 \\(k\\) \u958b\u59cb\uff0c\u5411\u5de6\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u7576\u627e\u5230\u6700\u5de6\u908a\u7684 target \u6642\u8fd4\u56de\u3002

\u5716 10-5 \u00a0 \u7dda\u6027\u67e5\u8a62\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede

\u6b64\u65b9\u6cd5\u96d6\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7dda\u6027\u67e5\u8a62\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u7576\u9663\u5217\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u8907\u7684 target \u6642\uff0c\u8a72\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

\u73fe\u8003\u616e\u62d3\u5c55\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 10-6 \u6240\u793a\uff0c\u6574\u9ad4\u6d41\u7a0b\u4fdd\u6301\u4e0d\u8b8a\uff0c\u6bcf\u8f2a\u5148\u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65b7 target \u548c nums[m] \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u5e7e\u7a2e\u60c5\u6cc1\u3002

  • \u7576 nums[m] < target \u6216 nums[m] > target \u6642\uff0c\u8aaa\u660e\u9084\u6c92\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u63a1\u7528\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u7684\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
  • \u7576 nums[m] == target \u6642\uff0c\u8aaa\u660e\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u63a1\u7528 \\(j = m - 1\\) \u4f86\u7e2e\u5c0f\u5340\u9593\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(j\\) \u5411\u5c0f\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

\u8ff4\u5708\u5b8c\u6210\u5f8c\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u908a\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u9ede\u3002

<1><2><3><4><5><6><7><8>

\u5716 10-6 \u00a0 \u4e8c\u5206\u641c\u5c0b\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede\u7684\u6b65\u9a5f

\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5224\u65b7\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u5169\u8005\u53ef\u4ee5\u5408\u4f75\u3002

\u5373\u4fbf\u5982\u6b64\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5c07\u5224\u65b7\u689d\u4ef6\u4fdd\u6301\u5c55\u958b\uff0c\u56e0\u70ba\u5176\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8b80\u6027\u66f4\u597d\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
binary_search_insertion.cpp
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.java
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.cs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.go
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.swift
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.js
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.ts
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.dart
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
binary_search_insertion.rs
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
binary_search_insertion.c
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
binary_search_insertion.kt
/* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
binary_search_insertion.rb
### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
binary_search_insertion.zig
[class]{}-[func]{binarySearchInsertion}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u672c\u7bc0\u7684\u7a0b\u5f0f\u78bc\u90fd\u662f\u201c\u96d9\u9589\u5340\u9593\u201d\u5beb\u6cd5\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u201c\u5de6\u9589\u53f3\u958b\u201d\u5beb\u6cd5\u3002

\u7e3d\u7684\u4f86\u770b\uff0c\u4e8c\u5206\u641c\u5c0b\u7121\u975e\u5c31\u662f\u7d66\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5225\u8a2d\u5b9a\u641c\u5c0b\u76ee\u6a19\uff0c\u76ee\u6a19\u53ef\u80fd\u662f\u4e00\u500b\u5177\u9ad4\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u500b\u5143\u7d20\u7bc4\u570d\uff08\u4f8b\u5982\u5c0f\u65bc target \u7684\u5143\u7d20\uff09\u3002

\u5728\u4e0d\u65b7\u7684\u8ff4\u5708\u4e8c\u5206\u4e2d\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6f38\u903c\u8fd1\u9810\u5148\u8a2d\u5b9a\u7684\u76ee\u6a19\u3002\u6700\u7d42\uff0c\u5b83\u5011\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u904e\u908a\u754c\u5f8c\u505c\u6b62\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565","text":"

\u5728\u6f14\u7b97\u6cd5\u984c\u4e2d\uff0c\u6211\u5011\u5e38\u900f\u904e\u5c07\u7dda\u6027\u67e5\u8a62\u66ff\u63db\u70ba\u96dc\u6e4a\u67e5\u8a62\u4f86\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u6f14\u7b97\u6cd5\u984c\u4f86\u52a0\u6df1\u7406\u89e3\u3002

Question

\u7d66\u5b9a\u4e00\u500b\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u5143\u7d20 target \uff0c\u8acb\u5728\u9663\u5217\u4e2d\u641c\u7d22\u201c\u548c\u201d\u70ba target \u7684\u5169\u500b\u5143\u7d20\uff0c\u4e26\u8fd4\u56de\u5b83\u5011\u7684\u9663\u5217\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u500b\u89e3\u5373\u53ef\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7dda\u6027\u67e5\u8a62\uff1a\u4ee5\u6642\u9593\u63db\u7a7a\u9593","text":"

\u8003\u616e\u76f4\u63a5\u8d70\u8a2a\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\u3002\u5982\u5716 10-9 \u6240\u793a\uff0c\u6211\u5011\u958b\u555f\u4e00\u500b\u5169\u5c64\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u5224\u65b7\u5169\u500b\u6574\u6578\u7684\u548c\u662f\u5426\u70ba target \uff0c\u82e5\u662f\uff0c\u5247\u8fd4\u56de\u5b83\u5011\u7684\u7d22\u5f15\u3002

\u5716 10-9 \u00a0 \u7dda\u6027\u67e5\u8a62\u6c42\u89e3\u5169\u6578\u4e4b\u548c

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209\"\"\"\n    # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u5217\u8209 */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
two_sum.c
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209 ###\ndef two_sum_brute_force(nums, target)\n  # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u5217\u8209\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6b64\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u975e\u5e38\u8017\u6642\u3002

"},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u96dc\u6e4a\u67e5\u8a62\uff1a\u4ee5\u7a7a\u9593\u63db\u6642\u9593","text":"

\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u9375\u503c\u5c0d\u5206\u5225\u70ba\u9663\u5217\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u8ff4\u5708\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u57f7\u884c\u5716 10-10 \u6240\u793a\u7684\u6b65\u9a5f\u3002

  1. \u5224\u65b7\u6578\u5b57 target - nums[i] \u662f\u5426\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u9019\u5169\u500b\u5143\u7d20\u7684\u7d22\u5f15\u3002
  2. \u5c07\u9375\u503c\u5c0d nums[i] \u548c\u7d22\u5f15 i \u65b0\u589e\u9032\u96dc\u6e4a\u8868\u3002
<1><2><3>

\u5716 10-10 \u00a0 \u8f14\u52a9\u96dc\u6e4a\u8868\u6c42\u89e3\u5169\u6578\u4e4b\u548c

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff0c\u50c5\u9700\u55ae\u5c64\u8ff4\u5708\u5373\u53ef\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868\"\"\"\n    # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    dic = {}\n    # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
two_sum.cpp
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    unordered_map<int, int> dic;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
two_sum.java
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
two_sum.cs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Dictionary<int, int> dic = [];\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
two_sum.go
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    hashTable := map[int]int{}\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
two_sum.swift
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic: [Int: Int] = [:]\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
two_sum.js
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m = {};\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
two_sum.ts
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m: Map<number, number> = new Map();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
two_sum.dart
/* \u65b9\u6cd5\u4e8c\uff1a \u8f14\u52a9\u96dc\u6e4a\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  Map<int, int> dic = HashMap();\n  // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
two_sum.rs
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let mut dic = HashMap::new();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
two_sum.c
/* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u96dc\u6e4a\u8868\u67e5\u8a62 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u96dc\u6e4a\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
two_sum.kt
/* \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    val dic = HashMap<Int, Int>()\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
two_sum.rb
### \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  dic = {}\n  # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
two_sum.zig
// \u65b9\u6cd5\u4e8c\uff1a\u8f14\u52a9\u96dc\u6e4a\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u6b64\u65b9\u6cd5\u900f\u904e\u96dc\u6e4a\u67e5\u8a62\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u57f7\u884c\u6548\u7387\u3002

\u7531\u65bc\u9700\u8981\u7dad\u8b77\u4e00\u500b\u984d\u5916\u7684\u96dc\u6e4a\u8868\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5118\u7ba1\u5982\u6b64\uff0c\u8a72\u65b9\u6cd5\u7684\u6574\u9ad4\u6642\u7a7a\u6548\u7387\u66f4\u70ba\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u984c\u7684\u6700\u512a\u89e3\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5","text":"

\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u65bc\u5728\u8cc7\u6599\u7d50\u69cb\uff08\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u6216\u5716\uff09\u4e2d\u641c\u7d22\u4e00\u500b\u6216\u4e00\u7d44\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5143\u7d20\u3002

\u641c\u5c0b\u6f14\u7b97\u6cd5\u53ef\u6839\u64da\u5be6\u73fe\u601d\u8def\u5206\u70ba\u4ee5\u4e0b\u5169\u985e\u3002

  • \u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\uff0c\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u8d70\u8a2a\u7b49\u3002
  • \u5229\u7528\u8cc7\u6599\u7d44\u7e54\u7d50\u69cb\u6216\u8cc7\u6599\u5305\u542b\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u5be6\u73fe\u9ad8\u6548\u5143\u7d20\u67e5\u8a62\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u3001\u96dc\u6e4a\u67e5\u8a62\u548c\u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7b49\u3002

\u4e0d\u96e3\u767c\u73fe\uff0c\u9019\u4e9b\u77e5\u8b58\u9ede\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u56e0\u6b64\u641c\u5c0b\u6f14\u7b97\u6cd5\u5c0d\u65bc\u6211\u5011\u4f86\u8aaa\u4e26\u4e0d\u964c\u751f\u3002\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5c07\u5f9e\u66f4\u52a0\u7cfb\u7d71\u7684\u8996\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5be9\u8996\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u5c0b","text":"

\u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u7684\u6bcf\u500b\u5143\u7d20\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

  • \u201c\u7dda\u6027\u641c\u5c0b\u201d\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7b49\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u5b83\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u4e00\u7aef\u958b\u59cb\uff0c\u9010\u500b\u8a2a\u554f\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u5230\u9054\u53e6\u4e00\u7aef\u4ecd\u6c92\u6709\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
  • \u201c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u548c\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u662f\u5716\u548c\u6a39\u7684\u5169\u7a2e\u8d70\u8a2a\u7b56\u7565\u3002\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\u9010\u5c64\u641c\u5c0b\uff0c\u7531\u8fd1\u53ca\u9060\u5730\u8a2a\u554f\u5404\u500b\u7bc0\u9ede\u3002\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\uff0c\u6cbf\u8457\u4e00\u689d\u8def\u5f91\u8d70\u5230\u982d\uff0c\u518d\u56de\u6eaf\u4e26\u5617\u8a66\u5176\u4ed6\u8def\u5f91\uff0c\u76f4\u5230\u8d70\u8a2a\u5b8c\u6574\u500b\u8cc7\u6599\u7d50\u69cb\u3002

\u66b4\u529b\u641c\u5c0b\u7684\u512a\u9ede\u662f\u7c21\u55ae\u4e14\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u505a\u9810\u8655\u7406\u548c\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\u3002

\u7136\u800c\uff0c\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u5143\u7d20\u6578\u91cf\uff0c\u56e0\u6b64\u5728\u8cc7\u6599\u91cf\u8f03\u5927\u7684\u60c5\u6cc1\u4e0b\u6548\u80fd\u8f03\u5dee\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9069\u61c9\u641c\u5c0b","text":"

\u81ea\u9069\u61c9\u641c\u5c0b\u5229\u7528\u8cc7\u6599\u7684\u7279\u6709\u5c6c\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u4f86\u6700\u4f73\u5316\u641c\u5c0b\u904e\u7a0b\uff0c\u5f9e\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

  • \u201c\u4e8c\u5206\u641c\u5c0b\u201d\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u5be6\u73fe\u9ad8\u6548\u67e5\u8a62\uff0c\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002
  • \u201c\u96dc\u6e4a\u67e5\u8a62\u201d\u5229\u7528\u96dc\u6e4a\u8868\u5c07\u641c\u5c0b\u8cc7\u6599\u548c\u76ee\u6a19\u8cc7\u6599\u5efa\u7acb\u70ba\u9375\u503c\u5c0d\u5c0d\u6620\uff0c\u5f9e\u800c\u5be6\u73fe\u67e5\u8a62\u64cd\u4f5c\u3002
  • \u201c\u6a39\u67e5\u8a62\u201d\u5728\u7279\u5b9a\u7684\u6a39\u7d50\u69cb\uff08\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\uff09\u4e2d\uff0c\u57fa\u65bc\u6bd4\u8f03\u7bc0\u9ede\u503c\u4f86\u5feb\u901f\u6392\u9664\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u662f\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

\u7136\u800c\uff0c\u4f7f\u7528\u9019\u4e9b\u6f14\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u9810\u5148\u5c0d\u9663\u5217\u9032\u884c\u6392\u5e8f\uff0c\u96dc\u6e4a\u67e5\u8a62\u548c\u6a39\u67e5\u8a62\u90fd\u9700\u8981\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u7dad\u8b77\u9019\u4e9b\u8cc7\u6599\u7d50\u69cb\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u958b\u92b7\u3002

Tip

\u81ea\u9069\u61c9\u641c\u5c0b\u6f14\u7b97\u6cd5\u5e38\u88ab\u7a31\u70ba\u67e5\u8a62\u6f14\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u65bc\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u6aa2\u7d22\u76ee\u6a19\u5143\u7d20\u3002

"},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u5c0b\u65b9\u6cd5\u9078\u53d6","text":"

\u7d66\u5b9a\u5927\u5c0f\u70ba \\(n\\) \u7684\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u7dda\u6027\u641c\u5c0b\u3001\u4e8c\u5206\u641c\u5c0b\u3001\u6a39\u67e5\u8a62\u3001\u96dc\u6e4a\u67e5\u8a62\u7b49\u591a\u7a2e\u65b9\u6cd5\u5f9e\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\u3002\u5404\u500b\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u5716 10-11 \u6240\u793a\u3002

\u5716 10-11 \u00a0 \u591a\u7a2e\u641c\u5c0b\u7b56\u7565

\u4e0a\u8ff0\u5e7e\u7a2e\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u8207\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

\u8868 10-1 \u00a0 \u67e5\u8a62\u6f14\u7b97\u6cd5\u6548\u7387\u5c0d\u6bd4

\u7dda\u6027\u641c\u5c0b \u4e8c\u5206\u641c\u5c0b \u6a39\u67e5\u8a62 \u96dc\u6e4a\u67e5\u8a62 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u984d\u5916\u7a7a\u9593 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u8cc7\u6599\u9810\u8655\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6a39 \\(O(n \\log n)\\) \u5efa\u96dc\u6e4a\u8868 \\(O(n)\\) \u8cc7\u6599\u662f\u5426\u6709\u5e8f \u7121\u5e8f \u6709\u5e8f \u6709\u5e8f \u7121\u5e8f

\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u9078\u64c7\u9084\u53d6\u6c7a\u65bc\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u8207\u66f4\u65b0\u983b\u7387\u7b49\u3002

\u7dda\u6027\u641c\u5c0b

  • \u901a\u7528\u6027\u8f03\u597d\uff0c\u7121\u9808\u4efb\u4f55\u8cc7\u6599\u9810\u8655\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u5011\u50c5\u9700\u67e5\u8a62\u4e00\u6b21\u8cc7\u6599\uff0c\u90a3\u9ebc\u5176\u4ed6\u4e09\u7a2e\u65b9\u6cd5\u7684\u8cc7\u6599\u9810\u8655\u7406\u7684\u6642\u9593\u6bd4\u7dda\u6027\u641c\u5c0b\u7684\u6642\u9593\u9084\u8981\u66f4\u9577\u3002
  • \u9069\u7528\u65bc\u9ad4\u91cf\u8f03\u5c0f\u7684\u8cc7\u6599\uff0c\u6b64\u60c5\u6cc1\u4e0b\u6642\u9593\u8907\u96dc\u5ea6\u5c0d\u6548\u7387\u5f71\u97ff\u8f03\u5c0f\u3002
  • \u9069\u7528\u65bc\u8cc7\u6599\u66f4\u65b0\u983b\u7387\u8f03\u9ad8\u7684\u5834\u666f\uff0c\u56e0\u70ba\u8a72\u65b9\u6cd5\u4e0d\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u4efb\u4f55\u984d\u5916\u7dad\u8b77\u3002

\u4e8c\u5206\u641c\u5c0b

  • \u9069\u7528\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u6548\u7387\u8868\u73fe\u7a69\u5b9a\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002
  • \u8cc7\u6599\u91cf\u4e0d\u80fd\u904e\u5927\uff0c\u56e0\u70ba\u5132\u5b58\u9663\u5217\u9700\u8981\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
  • \u4e0d\u9069\u7528\u65bc\u9ad8\u983b\u589e\u522a\u8cc7\u6599\u7684\u5834\u666f\uff0c\u56e0\u70ba\u7dad\u8b77\u6709\u5e8f\u9663\u5217\u7684\u958b\u92b7\u8f03\u5927\u3002

\u96dc\u6e4a\u67e5\u8a62

  • \u9069\u5408\u5c0d\u67e5\u8a62\u6548\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u5834\u666f\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002
  • \u4e0d\u9069\u5408\u9700\u8981\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u7121\u6cd5\u7dad\u8b77\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u3002
  • \u5c0d\u96dc\u6e4a\u51fd\u5f0f\u548c\u96dc\u6e4a\u885d\u7a81\u8655\u7406\u7b56\u7565\u7684\u4f9d\u8cf4\u6027\u8f03\u9ad8\uff0c\u5177\u6709\u8f03\u5927\u7684\u6548\u80fd\u52a3\u5316\u98a8\u96aa\u3002
  • \u4e0d\u9069\u5408\u8cc7\u6599\u91cf\u904e\u5927\u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u9700\u8981\u984d\u5916\u7a7a\u9593\u4f86\u6700\u5927\u7a0b\u5ea6\u5730\u6e1b\u5c11\u885d\u7a81\uff0c\u5f9e\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8a62\u6548\u80fd\u3002

\u6a39\u67e5\u8a62

  • \u9069\u7528\u65bc\u6d77\u91cf\u8cc7\u6599\uff0c\u56e0\u70ba\u6a39\u7bc0\u9ede\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u5206\u6563\u5132\u5b58\u7684\u3002
  • \u9069\u5408\u9700\u8981\u7dad\u8b77\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\u3002
  • \u5728\u6301\u7e8c\u589e\u522a\u7bc0\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u7522\u751f\u50be\u659c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • \u82e5\u4f7f\u7528 AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5247\u5404\u9805\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a69\u5b9a\u57f7\u884c\uff0c\u4f46\u7dad\u8b77\u6a39\u5e73\u8861\u7684\u64cd\u4f5c\u6703\u589e\u52a0\u984d\u5916\u7684\u958b\u92b7\u3002
"},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7d50","text":"
  • \u4e8c\u5206\u641c\u5c0b\u4f9d\u8cf4\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u900f\u904e\u8ff4\u5708\u9010\u6b65\u7e2e\u6e1b\u4e00\u534a\u641c\u5c0b\u5340\u9593\u4f86\u9032\u884c\u67e5\u8a62\u3002\u5b83\u8981\u6c42\u8f38\u5165\u8cc7\u6599\u6709\u5e8f\uff0c\u4e14\u50c5\u9069\u7528\u65bc\u9663\u5217\u6216\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
  • \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u8cc7\u6599\u3002\u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\uff0c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u548c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u9069\u7528\u65bc\u5716\u548c\u6a39\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\uff0c\u4f46\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u8f03\u9ad8\u3002
  • \u96dc\u6e4a\u67e5\u8a62\u3001\u6a39\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u5c6c\u65bc\u9ad8\u6548\u641c\u5c0b\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u85c9\u52a9\u984d\u5916\u8cc7\u6599\u7d50\u69cb\u3002
  • \u5be6\u969b\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5c0d\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u548c\u66f4\u65b0\u983b\u7387\u7b49\u56e0\u7d20\u9032\u884c\u5177\u9ad4\u5206\u6790\uff0c\u5f9e\u800c\u9078\u64c7\u5408\u9069\u7684\u641c\u5c0b\u65b9\u6cd5\u3002
  • \u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u5c0f\u578b\u6216\u983b\u7e41\u66f4\u65b0\u7684\u8cc7\u6599\uff1b\u4e8c\u5206\u641c\u5c0b\u9069\u7528\u65bc\u5927\u578b\u3001\u6392\u5e8f\u7684\u8cc7\u6599\uff1b\u96dc\u6e4a\u67e5\u8a62\u9069\u7528\u65bc\u5c0d\u67e5\u8a62\u6548\u7387\u8981\u6c42\u8f03\u9ad8\u4e14\u7121\u9808\u7bc4\u570d\u67e5\u8a62\u7684\u8cc7\u6599\uff1b\u6a39\u67e5\u8a62\u9069\u7528\u65bc\u9700\u8981\u7dad\u8b77\u9806\u5e8f\u548c\u652f\u6301\u7bc4\u570d\u67e5\u8a62\u7684\u5927\u578b\u52d5\u614b\u8cc7\u6599\u3002
  • \u7528\u96dc\u6e4a\u67e5\u8a62\u66ff\u63db\u7dda\u6027\u67e5\u8a62\u662f\u4e00\u7a2e\u5e38\u7528\u7684\u6700\u4f73\u5316\u57f7\u884c\u6642\u9593\u7684\u7b56\u7565\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
"},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

Abstract

\u6392\u5e8f\u7336\u5982\u4e00\u628a\u5c07\u6df7\u4e82\u8b8a\u70ba\u79e9\u5e8f\u7684\u9b54\u6cd5\u9470\u5319\uff0c\u4f7f\u6211\u5011\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u8207\u8655\u7406\u8cc7\u6599\u3002

\u7121\u8ad6\u662f\u7c21\u55ae\u7684\u5347\u5e8f\uff0c\u9084\u662f\u8907\u96dc\u7684\u5206\u985e\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u5011\u5c55\u793a\u4e86\u8cc7\u6599\u7684\u548c\u8ae7\u7f8e\u611f\u3002

"},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5
  • 11.2 \u00a0 \u9078\u64c7\u6392\u5e8f
  • 11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f
  • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
  • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
  • 11.6 \u00a0 \u5408\u4f75\u6392\u5e8f
  • 11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f
  • 11.8 \u00a0 \u6876\u6392\u5e8f
  • 11.9 \u00a0 \u8a08\u6578\u6392\u5e8f
  • 11.10 \u00a0 \u57fa\u6578\u6392\u5e8f
  • 11.11 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f","text":"

\u6ce1\u6cab\u6392\u5e8f\uff08bubble sort\uff09\u900f\u904e\u9023\u7e8c\u5730\u6bd4\u8f03\u8207\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u5be6\u73fe\u6392\u5e8f\u3002\u9019\u500b\u904e\u7a0b\u5c31\u50cf\u6c23\u6ce1\u5f9e\u5e95\u90e8\u5347\u5230\u9802\u90e8\u4e00\u6a23\uff0c\u56e0\u6b64\u5f97\u540d\u6ce1\u6cab\u6392\u5e8f\u3002

\u5982\u5716 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u904e\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u4f86\u6a21\u64ec\uff1a\u5f9e\u9663\u5217\u6700\u5de6\u7aef\u958b\u59cb\u5411\u53f3\u8d70\u8a2a\uff0c\u4f9d\u6b21\u6bd4\u8f03\u76f8\u9130\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u63db\u4e8c\u8005\u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u7684\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u5230\u9663\u5217\u7684\u6700\u53f3\u7aef\u3002

<1><2><3><4><5><6><7>

\u5716 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u6a21\u64ec\u5192\u6ce1

"},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6b65\u9a5f\u5982\u5716 11-5 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5c0d \\(n\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  2. \u63a5\u4e0b\u4f86\uff0c\u5c0d\u5269\u9918 \\(n - 1\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  3. \u4ee5\u6b64\u985e\u63a8\uff0c\u7d93\u904e \\(n - 1\\) \u8f2a\u201c\u5192\u6ce1\u201d\u5f8c\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
  4. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002

\u5716 11-5 \u00a0 \u6ce1\u6cab\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
bubble_sort.cpp
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.java
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.cs
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
bubble_sort.go
/* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
bubble_sort.swift
/* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
bubble_sort.js
/* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.ts
/* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.dart
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
bubble_sort.rs
/* \u6ce1\u6cab\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
bubble_sort.c
/* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
bubble_sort.kt
/* \u6ce1\u6cab\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort}\n
bubble_sort.zig
// \u6ce1\u6cab\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u6700\u4f73\u5316","text":"

\u6211\u5011\u767c\u73fe\uff0c\u5982\u679c\u67d0\u8f2a\u201c\u5192\u6ce1\u201d\u4e2d\u6c92\u6709\u57f7\u884c\u4efb\u4f55\u4ea4\u63db\u64cd\u4f5c\uff0c\u8aaa\u660e\u9663\u5217\u5df2\u7d93\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7d50\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u500b\u6a19\u8a8c\u4f4d flag \u4f86\u76e3\u6e2c\u9019\u7a2e\u60c5\u6cc1\uff0c\u4e00\u65e6\u51fa\u73fe\u5c31\u7acb\u5373\u8fd4\u56de\u3002

\u7d93\u904e\u6700\u4f73\u5316\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(n^2)\\) \uff1b\u4f46\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u53ef\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
bubble_sort.cpp
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.java
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.cs
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.go
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.swift
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
bubble_sort.js
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.ts
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.dart
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
bubble_sort.rs
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
bubble_sort.c
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
bubble_sort.kt
/* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
bubble_sort.rb
[class]{}-[func]{bubble_sort_with_flag}\n
bubble_sort.zig
// \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5404\u8f2a\u201c\u5192\u6ce1\u201d\u8d70\u8a2a\u7684\u9663\u5217\u9577\u5ea6\u4f9d\u6b21\u70ba \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u7e3d\u548c\u70ba \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u6700\u4f73\u5316\u5f8c\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u63db\u3002
"},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

\u524d\u8ff0\u5e7e\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u90fd\u5c6c\u65bc\u201c\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u900f\u904e\u6bd4\u8f03\u5143\u7d20\u9593\u7684\u5927\u5c0f\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u6b64\u985e\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7121\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u63a2\u8a0e\u5e7e\u7a2e\u201c\u975e\u6bd4\u8f03\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u7dda\u6027\u968e\u3002

\u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u900f\u904e\u8a2d\u5b9a\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u9806\u5e8f\u7684\u6876\uff0c\u6bcf\u500b\u6876\u5c0d\u61c9\u4e00\u500b\u6578\u64da\u7bc4\u570d\uff0c\u5c07\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff1b\u7136\u5f8c\uff0c\u5728\u6bcf\u500b\u6876\u5167\u90e8\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff1b\u6700\u7d42\u6309\u7167\u6876\u7684\u9806\u5e8f\u5c07\u6240\u6709\u8cc7\u6599\u5408\u4f75\u3002

"},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8003\u616e\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u5176\u5143\u7d20\u662f\u7bc4\u570d \\([0, 1)\\) \u5167\u7684\u6d6e\u9ede\u6578\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-13 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316 \\(k\\) \u500b\u6876\uff0c\u5c07 \\(n\\) \u500b\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u500b\u6876\u4e2d\u3002
  2. \u5c0d\u6bcf\u500b\u6876\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff08\u9019\u88e1\u63a1\u7528\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff09\u3002
  3. \u6309\u7167\u6876\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u5408\u4f75\u7d50\u679c\u3002

\u5716 11-13 \u00a0 \u6876\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums:\n        # \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i = int(num * k)\n        # \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
bucket_sort.cpp
/* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = num * k;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.java
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int) (num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.cs
/* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int)(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
bucket_sort.go
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i := int(num * float64(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5167\u5efa\u5207\u7247\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
bucket_sort.swift
/* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
bucket_sort.js
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.ts
/* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
bucket_sort.dart
/* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 _num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c07 _num \u65b0\u589e\u9032\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
bucket_sort.rs
/* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
bucket_sort.c
/* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8a18\u9304\u6bcf\u500b\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52d5\u614b\u9663\u5217\u7684\u9663\u5217\uff08\u6876\uff09\n    // \u70ba\u6bcf\u500b\u6876\u9810\u5206\u914d\u8db3\u5920\u7684\u7a7a\u9593\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u4f75\u6392\u5e8f\u5f8c\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(buckets[i]);\n    }\n}\n
bucket_sort.kt
/* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
bucket_sort.rb
[class]{}-[func]{bucket_sort}\n
bucket_sort.zig
[class]{}-[func]{bucketSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u6876\u6392\u5e8f\u9069\u7528\u65bc\u8655\u7406\u9ad4\u91cf\u5f88\u5927\u7684\u8cc7\u6599\u3002\u4f8b\u5982\uff0c\u8f38\u5165\u8cc7\u6599\u5305\u542b 100 \u842c\u500b\u5143\u7d20\uff0c\u7531\u65bc\u7a7a\u9593\u9650\u5236\uff0c\u7cfb\u7d71\u8a18\u61b6\u9ad4\u7121\u6cd5\u4e00\u6b21\u6027\u8f09\u5165\u6240\u6709\u8cc7\u6599\u3002\u6b64\u6642\uff0c\u53ef\u4ee5\u5c07\u8cc7\u6599\u5206\u6210 1000 \u500b\u6876\uff0c\u7136\u5f8c\u5206\u5225\u5c0d\u6bcf\u500b\u6876\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5408\u4f75\u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\) \uff1a\u5047\u8a2d\u5143\u7d20\u5728\u5404\u500b\u6876\u5167\u5e73\u5747\u5206\u4f48\uff0c\u90a3\u9ebc\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u6578\u91cf\u70ba \\(\\frac{n}{k}\\) \u3002\u5047\u8a2d\u6392\u5e8f\u55ae\u500b\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u6642\u9593\uff0c\u5247\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u6642\u9593\u3002\u7576\u6876\u6578\u91cf \\(k\\) \u6bd4\u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5247\u8da8\u5411\u65bc \\(O(n)\\) \u3002\u5408\u4f75\u7d50\u679c\u6642\u9700\u8981\u8d70\u8a2a\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8cbb \\(O(n + k)\\) \u6642\u9593\u3002
  • \u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u8cc7\u6599\u88ab\u5206\u914d\u5230\u4e00\u500b\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8a72\u6876\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u85c9\u52a9 \\(k\\) \u500b\u6876\u548c\u7e3d\u5171 \\(n\\) \u500b\u5143\u7d20\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u6876\u6392\u5e8f\u662f\u5426\u7a69\u5b9a\u53d6\u6c7a\u65bc\u6392\u5e8f\u6876\u5167\u5143\u7d20\u7684\u6f14\u7b97\u6cd5\u662f\u5426\u7a69\u5b9a\u3002
"},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5be6\u73fe\u5e73\u5747\u5206\u914d","text":"

\u6876\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7406\u8ad6\u4e0a\u53ef\u4ee5\u9054\u5230 \\(O(n)\\) \uff0c\u95dc\u9375\u5728\u65bc\u5c07\u5143\u7d20\u5747\u52fb\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u56e0\u70ba\u5be6\u969b\u8cc7\u6599\u5f80\u5f80\u4e0d\u662f\u5747\u52fb\u5206\u4f48\u7684\u3002\u4f8b\u5982\uff0c\u6211\u5011\u60f3\u8981\u5c07\u6dd8\u5bf6\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u50f9\u683c\u7bc4\u570d\u5e73\u5747\u5206\u914d\u5230 10 \u500b\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u50f9\u683c\u5206\u4f48\u4e0d\u5747\uff0c\u4f4e\u65bc 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u65bc 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c07\u50f9\u683c\u5340\u9593\u5e73\u5747\u5283\u5206\u70ba 10 \u500b\uff0c\u5404\u500b\u6876\u4e2d\u7684\u5546\u54c1\u6578\u91cf\u5dee\u8ddd\u6703\u975e\u5e38\u5927\u3002

\u70ba\u5be6\u73fe\u5e73\u5747\u5206\u914d\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u8a2d\u5b9a\u4e00\u689d\u5927\u81f4\u7684\u5206\u754c\u7dda\uff0c\u5c07\u8cc7\u6599\u7c97\u7565\u5730\u5206\u5230 3 \u500b\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u7562\u5f8c\uff0c\u518d\u5c07\u5546\u54c1\u8f03\u591a\u7684\u6876\u7e7c\u7e8c\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6578\u91cf\u5927\u81f4\u76f8\u7b49\u3002

\u5982\u5716 11-14 \u6240\u793a\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u5efa\u7acb\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u76ee\u6a19\u662f\u8b93\u8449\u7bc0\u9ede\u7684\u503c\u5118\u53ef\u80fd\u5e73\u5747\u3002\u7576\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f2a\u5c07\u8cc7\u6599\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u5177\u9ad4\u5283\u5206\u65b9\u5f0f\u53ef\u6839\u64da\u8cc7\u6599\u7279\u9ede\u9748\u6d3b\u9078\u64c7\u3002

\u5716 11-14 \u00a0 \u905e\u8ff4\u5283\u5206\u6876

\u5982\u679c\u6211\u5011\u63d0\u524d\u77e5\u9053\u5546\u54c1\u50f9\u683c\u7684\u6a5f\u7387\u5206\u4f48\uff0c\u5247\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u6a5f\u7387\u5206\u4f48\u8a2d\u5b9a\u6bcf\u500b\u6876\u7684\u50f9\u683c\u5206\u754c\u7dda\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8cc7\u6599\u5206\u4f48\u4e26\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7d71\u8a08\uff0c\u4e5f\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u7279\u9ede\u63a1\u7528\u67d0\u7a2e\u6a5f\u7387\u6a21\u578b\u9032\u884c\u8fd1\u4f3c\u3002

\u5982\u5716 11-15 \u6240\u793a\uff0c\u6211\u5011\u5047\u8a2d\u5546\u54c1\u50f9\u683c\u670d\u5f9e\u6b63\u614b\u5206\u4f48\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8a2d\u5b9a\u50f9\u683c\u5340\u9593\uff0c\u5f9e\u800c\u5c07\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\u3002

\u5716 11-15 \u00a0 \u6839\u64da\u6a5f\u7387\u5206\u4f48\u5283\u5206\u6876

"},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8a08\u6578\u6392\u5e8f","text":"

\u8a08\u6578\u6392\u5e8f\uff08counting sort\uff09\u900f\u904e\u7d71\u8a08\u5143\u7d20\u6578\u91cf\u4f86\u5be6\u73fe\u6392\u5e8f\uff0c\u901a\u5e38\u61c9\u7528\u65bc\u6574\u6578\u9663\u5217\u3002

"},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7c21\u55ae\u5be6\u73fe","text":"

\u5148\u4f86\u770b\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\u3002\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8ca0\u6574\u6578\u201d\uff0c\u8a08\u6578\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-16 \u6240\u793a\u3002

  1. \u8d70\u8a2a\u9663\u5217\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6578\u5b57\uff0c\u8a18\u70ba \\(m\\) \uff0c\u7136\u5f8c\u5efa\u7acb\u4e00\u500b\u9577\u5ea6\u70ba \\(m + 1\\) \u7684\u8f14\u52a9\u9663\u5217 counter \u3002
  2. \u85c9\u52a9 counter \u7d71\u8a08 nums \u4e2d\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\uff0c\u5176\u4e2d counter[num] \u5c0d\u61c9\u6578\u5b57 num \u7684\u51fa\u73fe\u6b21\u6578\u3002\u7d71\u8a08\u65b9\u6cd5\u5f88\u7c21\u55ae\uff0c\u53ea\u9700\u8d70\u8a2a nums\uff08\u8a2d\u7576\u524d\u6578\u5b57\u70ba num\uff09\uff0c\u6bcf\u8f2a\u5c07 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
  3. \u7531\u65bc counter \u7684\u5404\u500b\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u7576\u65bc\u6240\u6709\u6578\u5b57\u5df2\u7d93\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8d70\u8a2a counter \uff0c\u6839\u64da\u5404\u6578\u5b57\u51fa\u73fe\u6b21\u6578\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

\u5716 11-16 \u00a0 \u8a08\u6578\u6392\u5e8f\u6d41\u7a0b

\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
counting_sort.cpp
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.java
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.cs
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.go
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
counting_sort.swift
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
counting_sort.js
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.ts
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
counting_sort.dart
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
counting_sort.rs
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
counting_sort.c
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
counting_sort.kt
/* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort_naive}\n
counting_sort.zig
[class]{}-[func]{countingSortNaive}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8a08\u6578\u6392\u5e8f\u8207\u6876\u6392\u5e8f\u7684\u95dc\u806f

\u5f9e\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u6578\u6392\u5e8f\u4e2d\u7684\u8a08\u6578\u9663\u5217 counter \u7684\u6bcf\u500b\u7d22\u5f15\u8996\u70ba\u4e00\u500b\u6876\uff0c\u5c07\u7d71\u8a08\u6578\u91cf\u7684\u904e\u7a0b\u770b\u4f5c\u5c07\u5404\u500b\u5143\u7d20\u5206\u914d\u5230\u5c0d\u61c9\u7684\u6876\u4e2d\u3002\u672c\u8cea\u4e0a\uff0c\u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u8cc7\u6599\u4e0b\u7684\u4e00\u500b\u7279\u4f8b\u3002

"},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5be6\u73fe","text":"

\u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u5982\u679c\u8f38\u5165\u8cc7\u6599\u662f\u7269\u4ef6\uff0c\u4e0a\u8ff0\u6b65\u9a5f 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u662f\u5546\u54c1\u7269\u4ef6\uff0c\u6211\u5011\u60f3\u6309\u7167\u5546\u54c1\u50f9\u683c\uff08\u985e\u5225\u7684\u6210\u54e1\u8b8a\u6578\uff09\u5c0d\u5546\u54c1\u9032\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u6f14\u7b97\u6cd5\u53ea\u80fd\u7d66\u51fa\u50f9\u683c\u7684\u6392\u5e8f\u7d50\u679c\u3002

\u90a3\u9ebc\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u8cc7\u6599\u7684\u6392\u5e8f\u7d50\u679c\u5462\uff1f\u6211\u5011\u9996\u5148\u8a08\u7b97 counter \u7684\u201c\u524d\u7db4\u548c\u201d\u3002\u9867\u540d\u601d\u7fa9\uff0c\u7d22\u5f15 i \u8655\u7684\u524d\u7db4\u548c prefix[i] \u7b49\u65bc\u9663\u5217\u524d i \u500b\u5143\u7d20\u4e4b\u548c\uff1a

\\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

\u524d\u7db4\u548c\u5177\u6709\u660e\u78ba\u7684\u610f\u7fa9\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7d50\u679c\u9663\u5217 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\u3002\u9019\u500b\u8cc7\u8a0a\u975e\u5e38\u95dc\u9375\uff0c\u56e0\u70ba\u5b83\u544a\u8a34\u6211\u5011\u5404\u500b\u5143\u7d20\u61c9\u8a72\u51fa\u73fe\u5728\u7d50\u679c\u9663\u5217\u7684\u54ea\u500b\u4f4d\u7f6e\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5012\u5e8f\u8d70\u8a2a\u539f\u9663\u5217 nums \u7684\u6bcf\u500b\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

  1. \u5c07 num \u586b\u5165\u9663\u5217 res \u7684\u7d22\u5f15 prefix[num] - 1 \u8655\u3002
  2. \u4ee4\u524d\u7db4\u548c prefix[num] \u6e1b\u5c0f \\(1\\) \uff0c\u5f9e\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u9663\u5217 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7d50\u679c\uff0c\u6700\u5f8c\u4f7f\u7528 res \u8986\u84cb\u539f\u9663\u5217 nums \u5373\u53ef\u3002\u5716 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8a08\u6578\u6392\u5e8f\u6d41\u7a0b\u3002

<1><2><3><4><5><6><7><8>

\u5716 11-17 \u00a0 \u8a08\u6578\u6392\u5e8f\u6b65\u9a5f

\u8a08\u6578\u6392\u5e8f\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
def counting_sort(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    # \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1  # \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n
counting_sort.cpp
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    nums = res;\n}\n
counting_sort.java
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.cs
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.go
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    copy(nums, res)\n}\n
counting_sort.swift
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1 // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.js
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.ts
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.dart
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n  // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c07 _num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n    counter[_num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  nums.setAll(0, res);\n}\n
counting_sort.rs
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
counting_sort.c
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
counting_sort.kt
/* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]-- // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
counting_sort.rb
[class]{}-[func]{counting_sort}\n
counting_sort.zig
[class]{}-[func]{countingSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f \uff1a\u6d89\u53ca\u8d70\u8a2a nums \u548c\u8d70\u8a2a counter \uff0c\u90fd\u4f7f\u7528\u7dda\u6027\u6642\u9593\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b \\(n \\gg m\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u65bc \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u85c9\u52a9\u4e86\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \u7684\u9663\u5217 res \u548c counter \u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u9806\u5e8f\u662f\u201c\u5f9e\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u8d70\u8a2a nums \u53ef\u4ee5\u907f\u514d\u6539\u8b8a\u76f8\u7b49\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5be6\u73fe\u7a69\u5b9a\u6392\u5e8f\u3002\u5be6\u969b\u4e0a\uff0c\u6b63\u5e8f\u8d70\u8a2a nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\uff0c\u4f46\u7d50\u679c\u662f\u975e\u7a69\u5b9a\u7684\u3002
"},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u4fb7\u9650\u6027","text":"

\u770b\u5230\u9019\u88e1\uff0c\u4f60\u4e5f\u8a31\u6703\u89ba\u5f97\u8a08\u6578\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u50c5\u900f\u904e\u7d71\u8a08\u6578\u91cf\u5c31\u53ef\u4ee5\u5be6\u73fe\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\u76f8\u5c0d\u8f03\u70ba\u56b4\u683c\u3002

\u8a08\u6578\u6392\u5e8f\u53ea\u9069\u7528\u65bc\u975e\u8ca0\u6574\u6578\u3002\u82e5\u60f3\u5c07\u5176\u7528\u65bc\u5176\u4ed6\u578b\u5225\u7684\u8cc7\u6599\uff0c\u9700\u8981\u78ba\u4fdd\u9019\u4e9b\u8cc7\u6599\u53ef\u4ee5\u8f49\u63db\u70ba\u975e\u8ca0\u6574\u6578\uff0c\u4e26\u4e14\u5728\u8f49\u63db\u904e\u7a0b\u4e2d\u4e0d\u80fd\u6539\u8b8a\u5404\u500b\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u5927\u5c0f\u95dc\u4fc2\u3002\u4f8b\u5982\uff0c\u5c0d\u65bc\u5305\u542b\u8ca0\u6578\u7684\u6574\u6578\u9663\u5217\uff0c\u53ef\u4ee5\u5148\u7d66\u6240\u6709\u6578\u5b57\u52a0\u4e0a\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5168\u90e8\u6578\u5b57\u8f49\u5316\u70ba\u6b63\u6578\uff0c\u6392\u5e8f\u5b8c\u6210\u5f8c\u518d\u8f49\u63db\u56de\u53bb\u3002

\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5247\u6703\u4f54\u7528\u904e\u591a\u7a7a\u9593\u3002\u800c\u7576 \\(n \\ll m\\) \u6642\uff0c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u9084\u8981\u6162\u3002

"},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f","text":"

Tip

\u95b1\u8b80\u672c\u7bc0\u524d\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b78\u5b8c\u201c\u5806\u7a4d\u201c\u7ae0\u7bc0\u3002

\u5806\u7a4d\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\u7684\u9ad8\u6548\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u6211\u5011\u53ef\u4ee5\u5229\u7528\u5df2\u7d93\u5b78\u904e\u7684\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u201d\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\u3002

  1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5c0f\u9802\u5806\u7a4d\uff0c\u6b64\u6642\u6700\u5c0f\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
  2. \u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8a18\u9304\u51fa\u5806\u7a4d\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

\u4ee5\u4e0a\u65b9\u6cd5\u96d6\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u85c9\u52a9\u4e00\u500b\u984d\u5916\u9663\u5217\u4f86\u5132\u5b58\u5f48\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f03\u6d6a\u8cbb\u7a7a\u9593\u3002\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u4e00\u7a2e\u66f4\u52a0\u512a\u96c5\u7684\u5be6\u73fe\u65b9\u5f0f\u3002

"},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5806\u7a4d\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-12 \u6240\u793a\u3002

  1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5927\u9802\u5806\u7a4d\u3002\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
  2. \u5c07\u5806\u7a4d\u9802\u5143\u7d20\uff08\u7b2c\u4e00\u500b\u5143\u7d20\uff09\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u6700\u5f8c\u4e00\u500b\u5143\u7d20\uff09\u4ea4\u63db\u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u6e1b \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6578\u91cf\u52a0 \\(1\\) \u3002
  3. \u5f9e\u5806\u7a4d\u9802\u5143\u7d20\u958b\u59cb\uff0c\u5f9e\u9802\u5230\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u7a4d\u5316\u5f8c\uff0c\u5806\u7a4d\u7684\u6027\u8cea\u5f97\u5230\u4fee\u5fa9\u3002
  4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u8ff4\u5708 \\(n - 1\\) \u8f2a\u5f8c\uff0c\u5373\u53ef\u5b8c\u6210\u9663\u5217\u6392\u5e8f\u3002

Tip

\u5be6\u969b\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u500b\u5f48\u51fa\u5143\u7d20\u7684\u6b65\u9a5f\u3002

<1><2><3><4><5><6><7><8><9><10><11><12>

\u5716 11-12 \u00a0 \u5806\u7a4d\u6392\u5e8f\u6b65\u9a5f

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u4f7f\u7528\u4e86\u8207\u201c\u5806\u7a4d\u201d\u7ae0\u7bc0\u76f8\u540c\u7684\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 sift_down() \u51fd\u5f0f\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u5806\u7a4d\u7684\u9577\u5ea6\u6703\u96a8\u8457\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u6e1b\u5c0f\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u7d66 sift_down() \u51fd\u5f0f\u65b0\u589e\u4e00\u500b\u9577\u5ea6\u53c3\u6578 \\(n\\) \uff0c\u7528\u65bc\u6307\u5b9a\u5806\u7a4d\u7684\u7576\u524d\u6709\u6548\u9577\u5ea6\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u7a4d\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0)\n
heap_sort.cpp
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.java
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.cs
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
heap_sort.go
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.swift
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums.swapAt(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
heap_sort.js
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.ts
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.dart
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
heap_sort.rs
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
heap_sort.c
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
heap_sort.kt
/* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
heap_sort.rb
[class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
heap_sort.zig
[class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5efa\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff0c\u5171\u8ff4\u5708 \\(n - 1\\) \u8f2a\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u4f7f\u7528 \\(O(1)\\) \u7a7a\u9593\u3002\u5143\u7d20\u4ea4\u63db\u548c\u5806\u7a4d\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u548c\u5806\u7a4d\u5e95\u5143\u7d20\u6642\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5c0d\u4f4d\u7f6e\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002
"},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

\u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u7a2e\u7c21\u55ae\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u8207\u624b\u52d5\u6574\u7406\u4e00\u526f\u724c\u7684\u904e\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

\u5177\u9ad4\u4f86\u8aaa\uff0c\u6211\u5011\u5728\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u4e00\u500b\u57fa\u6e96\u5143\u7d20\uff0c\u5c07\u8a72\u5143\u7d20\u8207\u5176\u5de6\u5074\u5df2\u6392\u5e8f\u5340\u9593\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f03\u5927\u5c0f\uff0c\u4e26\u5c07\u8a72\u5143\u7d20\u63d2\u5165\u5230\u6b63\u78ba\u7684\u4f4d\u7f6e\u3002

\u5716 11-6 \u5c55\u793a\u4e86\u9663\u5217\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8a2d\u57fa\u6e96\u5143\u7d20\u70ba base \uff0c\u6211\u5011\u9700\u8981\u5c07\u5f9e\u76ee\u6a19\u7d22\u5f15\u5230 base \u4e4b\u9593\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\uff0c\u7136\u5f8c\u5c07 base \u8ce6\u503c\u7d66\u76ee\u6a19\u7d22\u5f15\u3002

\u5716 11-6 \u00a0 \u55ae\u6b21\u63d2\u5165\u64cd\u4f5c

"},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-7 \u6240\u793a\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u9663\u5217\u7684\u7b2c 1 \u500b\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
  2. \u9078\u53d6\u9663\u5217\u7684\u7b2c 2 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9078\u53d6\u7b2c 3 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 3 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u985e\u63a8\uff0c\u5728\u6700\u5f8c\u4e00\u8f2a\u4e2d\uff0c\u9078\u53d6\u6700\u5f8c\u4e00\u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

\u5716 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n
insertion_sort.cpp
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.java
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.cs
/* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.go
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.swift
/* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.js
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.ts
/* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.dart
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  }\n}\n
insertion_sort.rs
/* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.c
/* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
insertion_sort.kt
/* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u8ff4\u5708: \u5df2\u6392\u5e8f\u5143\u7d20\u70ba 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
insertion_sort.rb
### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  end\nend\n
insertion_sort.zig
// \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u5225\u9700\u8981\u8ff4\u5708 \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u8cc7\u6599\u6642\uff0c\u63d2\u5165\u64cd\u4f5c\u6703\u63d0\u524d\u7d42\u6b62\u3002\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u63d2\u5165\u6392\u5e8f\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u6703\u5c07\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\uff0c\u4e0d\u6703\u6539\u8b8a\u5b83\u5011\u7684\u9806\u5e8f\u3002
"},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u512a\u52e2","text":"

\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u800c\u6211\u5011\u5373\u5c07\u5b78\u7fd2\u7684\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u5118\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u7684\u60c5\u6cc1\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

\u9019\u500b\u7d50\u8ad6\u8207\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u7684\u9069\u7528\u60c5\u6cc1\u7684\u7d50\u8ad6\u985e\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u9019\u985e \\(O(n \\log n)\\) \u7684\u6f14\u7b97\u6cd5\u5c6c\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u55ae\u5143\u8a08\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6578\u503c\u6bd4\u8f03\u63a5\u8fd1\uff0c\u8907\u96dc\u5ea6\u4e0d\u4f54\u4e3b\u5c0e\u5730\u4f4d\uff0c\u6bcf\u8f2a\u4e2d\u7684\u55ae\u5143\u64cd\u4f5c\u6578\u91cf\u8d77\u5230\u6c7a\u5b9a\u6027\u4f5c\u7528\u3002

\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u63a1\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u70ba\uff1a\u5c0d\u65bc\u9577\u9663\u5217\uff0c\u63a1\u7528\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5c0d\u65bc\u77ed\u9663\u5217\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

\u96d6\u7136\u6ce1\u6cab\u6392\u5e8f\u3001\u9078\u64c7\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \uff0c\u4f46\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u983b\u7387\u986f\u8457\u9ad8\u65bc\u6ce1\u6cab\u6392\u5e8f\u548c\u9078\u64c7\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u6ce1\u6cab\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u4ea4\u63db\u5be6\u73fe\uff0c\u9700\u8981\u85c9\u52a9\u4e00\u500b\u81e8\u6642\u8b8a\u6578\uff0c\u5171\u6d89\u53ca 3 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u8ce6\u503c\u5be6\u73fe\uff0c\u50c5\u9700 1 \u500b\u55ae\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u8a08\u7b97\u958b\u92b7\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
  • \u9078\u64c7\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u6cc1\u4e0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002\u5982\u679c\u7d66\u5b9a\u4e00\u7d44\u90e8\u5206\u6709\u5e8f\u7684\u8cc7\u6599\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9078\u64c7\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
  • \u9078\u64c7\u6392\u5e8f\u4e0d\u7a69\u5b9a\uff0c\u7121\u6cd5\u61c9\u7528\u65bc\u591a\u7d1a\u6392\u5e8f\u3002
"},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5408\u4f75\u6392\u5e8f","text":"

\u5408\u4f75\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5305\u542b\u5716 11-10 \u6240\u793a\u7684\u201c\u5283\u5206\u201d\u548c\u201c\u5408\u4f75\u201d\u968e\u6bb5\u3002

  1. \u5283\u5206\u968e\u6bb5\uff1a\u900f\u904e\u905e\u8ff4\u4e0d\u65b7\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u958b\uff0c\u5c07\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u8f49\u63db\u70ba\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002
  2. \u5408\u4f75\u968e\u6bb5\uff1a\u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u5283\u5206\uff0c\u958b\u59cb\u5408\u4f75\uff0c\u6301\u7e8c\u5730\u5c07\u5de6\u53f3\u5169\u500b\u8f03\u77ed\u7684\u6709\u5e8f\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u8f03\u9577\u7684\u6709\u5e8f\u9663\u5217\uff0c\u76f4\u81f3\u7d50\u675f\u3002

\u5716 11-10 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5283\u5206\u8207\u5408\u4f75\u968e\u6bb5

"},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u5982\u5716 11-11 \u6240\u793a\uff0c\u201c\u5283\u5206\u968e\u6bb5\u201d\u5f9e\u9802\u81f3\u5e95\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u5207\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002

  1. \u8a08\u7b97\u9663\u5217\u4e2d\u9ede mid \uff0c\u905e\u8ff4\u5283\u5206\u5de6\u5b50\u9663\u5217\uff08\u5340\u9593 [left, mid] \uff09\u548c\u53f3\u5b50\u9663\u5217\uff08\u5340\u9593 [mid + 1, right] \uff09\u3002
  2. \u905e\u8ff4\u57f7\u884c\u6b65\u9a5f 1. \uff0c\u76f4\u81f3\u5b50\u9663\u5217\u5340\u9593\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u3002

\u201c\u5408\u4f75\u968e\u6bb5\u201d\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f9e\u9577\u5ea6\u70ba 1 \u7684\u5b50\u9663\u5217\u958b\u59cb\u5408\u4f75\uff0c\u5408\u4f75\u968e\u6bb5\u4e2d\u7684\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u662f\u6709\u5e8f\u7684\u3002

<1><2><3><4><5><6><7><8><9><10>

\u5716 11-11 \u00a0 \u5408\u4f75\u6392\u5e8f\u6b65\u9a5f

\u89c0\u5bdf\u767c\u73fe\uff0c\u5408\u4f75\u6392\u5e8f\u8207\u4e8c\u5143\u6a39\u5f8c\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u9806\u5e8f\u662f\u4e00\u81f4\u7684\u3002

  • \u5f8c\u5e8f\u8d70\u8a2a\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u6a39\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u6a39\uff0c\u6700\u5f8c\u8655\u7406\u6839\u7bc0\u9ede\u3002
  • \u5408\u4f75\u6392\u5e8f\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u9663\u5217\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u9663\u5217\uff0c\u6700\u5f8c\u8655\u7406\u5408\u4f75\u3002

\u5408\u4f75\u6392\u5e8f\u7684\u5be6\u73fe\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\u3002\u8acb\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u4f75\u5340\u9593\u70ba [left, right] \uff0c\u800c tmp \u7684\u5c0d\u61c9\u5340\u9593\u70ba [0, right - left] \u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\"\"\"\n    # \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    # \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5408\u4f75\u6392\u5e8f\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if left >= right:\n        return  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    # \u5283\u5206\u968e\u6bb5\n    mid = (left + right) // 2  # \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid)  # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right)  # \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    # \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n
merge_sort.cpp
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.java
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.cs
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;       // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    MergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    MergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    Merge(nums, left, mid, right);\n}\n
merge_sort.go
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.swift
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right { // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums: &nums, left: left, right: mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
merge_sort.js
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.ts
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.dart
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n  // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  // \u5283\u5206\u968e\u6bb5\n  int mid = (left + right) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\n  mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n  mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n  // \u5408\u4f75\u968e\u6bb5\n  merge(nums, left, mid, right);\n}\n
merge_sort.rs
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    }\n\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.c
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
merge_sort.kt
/* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else \n            tmp[k++] = nums[j++]\n    }\n    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return  // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    val mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
merge_sort.rb
[class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
merge_sort.zig
// \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n// \u5de6\u5b50\u9663\u5217\u5340\u9593 [left, mid]\n// \u53f3\u5b50\u9663\u5217\u5340\u9593 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f14\u52a9\u9663\u5217\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u5225\u6307\u5411\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u900f\u904e\u8986\u84cb\u539f\u9663\u5217 nums \u4f86\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u53f3\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 <= \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u5de6\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u672a\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 > \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5408\u4f75\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;              // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    var mid = (left + right) / 2;           // \u8a08\u7b97\u4e2d\u9ede\n    try mergeSort(nums, left, mid);         // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    try mergeSort(nums, mid + 1, right);    // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    try merge(nums, left, mid, right);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5283\u5206\u7522\u751f\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u5c64\u5408\u4f75\u7684\u7e3d\u64cd\u4f5c\u6578\u91cf\u70ba \\(n\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u905e\u8ff4\u6df1\u5ea6\u70ba \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u5408\u4f75\u64cd\u4f5c\u9700\u8981\u85c9\u52a9\u8f14\u52a9\u9663\u5217\u5be6\u73fe\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u4f75\u904e\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u8b8a\u3002
"},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u93c8\u7d50\u4e32\u5217\u6392\u5e8f","text":"

\u5c0d\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u5408\u4f75\u6392\u5e8f\u76f8\u8f03\u65bc\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\u5177\u6709\u986f\u8457\u512a\u52e2\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u6392\u5e8f\u4efb\u52d9\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002

  • \u5283\u5206\u968e\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u905e\u8ff4\u201d\u4f86\u5be6\u73fe\u93c8\u7d50\u4e32\u5217\u5283\u5206\u5de5\u4f5c\uff0c\u5f9e\u800c\u7701\u53bb\u905e\u8ff4\u4f7f\u7528\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
  • \u5408\u4f75\u968e\u6bb5\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u50c5\u9700\u6539\u8b8a\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u5be6\u73fe\uff0c\u56e0\u6b64\u5408\u4f75\u968e\u6bb5\uff08\u5c07\u5169\u500b\u77ed\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\u5408\u4f75\u70ba\u4e00\u500b\u9577\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\uff09\u7121\u9808\u5efa\u7acb\u984d\u5916\u93c8\u7d50\u4e32\u5217\u3002

\u5177\u9ad4\u5be6\u73fe\u7d30\u7bc0\u6bd4\u8f03\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u76f8\u95dc\u8cc7\u6599\u9032\u884c\u5b78\u7fd2\u3002

"},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

\u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u57f7\u884c\u9ad8\u6548\uff0c\u61c9\u7528\u5ee3\u6cdb\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5176\u76ee\u6a19\u662f\uff1a\u9078\u64c7\u9663\u5217\u4e2d\u7684\u67d0\u500b\u5143\u7d20\u4f5c\u70ba\u201c\u57fa\u6e96\u6578\u201d\uff0c\u5c07\u6240\u6709\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u5074\uff0c\u800c\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u5074\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u54e8\u5175\u5283\u5206\u7684\u6d41\u7a0b\u5982\u5716 11-8 \u6240\u793a\u3002

  1. \u9078\u53d6\u9663\u5217\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u521d\u59cb\u5316\u5169\u500b\u6307\u6a19 i \u548c j \u5206\u5225\u6307\u5411\u9663\u5217\u7684\u5169\u7aef\u3002
  2. \u8a2d\u5b9a\u4e00\u500b\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u5225\u5c0b\u627e\u7b2c\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u5f8c\u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\u3002
  3. \u8ff4\u5708\u57f7\u884c\u6b65\u9a5f 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u6642\u505c\u6b62\uff0c\u6700\u5f8c\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u500b\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\u3002
<1><2><3><4><5><6><7><8><9>

\u5716 11-8 \u00a0 \u54e8\u5175\u5283\u5206\u6b65\u9a5f

\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u539f\u9663\u5217\u88ab\u5283\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u9663\u5217\u3001\u57fa\u6e96\u6578\u3001\u53f3\u5b50\u9663\u5217\uff0c\u4e14\u6eff\u8db3\u201c\u5de6\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u6e96\u6578 \\(\\leq\\) \u53f3\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u53ea\u9700\u5c0d\u9019\u5169\u500b\u5b50\u9663\u5217\u9032\u884c\u6392\u5e8f\u3002

\u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

\u54e8\u5175\u5283\u5206\u7684\u5be6\u8cea\u662f\u5c07\u4e00\u500b\u8f03\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u7c21\u5316\u70ba\u5169\u500b\u8f03\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u5143\u7d20\u4ea4\u63db */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u54e8\u5175\u5283\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u54e8\u5175\u5283\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.js
/* \u5143\u7d20\u4ea4\u63db */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u5143\u7d20\u4ea4\u63db */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u5143\u7d20\u4ea4\u63db */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u54e8\u5175\u5283\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u5143\u7d20\u4ea4\u63db */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n    return i;\n}\n
quick_sort.kt
/* \u5143\u7d20\u4ea4\u63db */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i              // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{partition}\n
quick_sort.zig
// \u5143\u7d20\u4ea4\u63db\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5283\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u5feb\u901f\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-9 \u6240\u793a\u3002

  1. \u9996\u5148\uff0c\u5c0d\u539f\u9663\u5217\u57f7\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u3002
  2. \u7136\u5f8c\uff0c\u5c0d\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5206\u5225\u905e\u8ff4\u57f7\u884c\u201c\u54e8\u5175\u5283\u5206\u201d\u3002
  3. \u6301\u7e8c\u905e\u8ff4\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\uff0c\u5f9e\u800c\u5b8c\u6210\u6574\u500b\u9663\u5217\u7684\u6392\u5e8f\u3002

\u5716 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right:\n        return\n    # \u54e8\u5175\u5283\u5206\n    pivot = self.partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = Partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    pivot := q.partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  if (left >= right) return;\n  // \u54e8\u5175\u5283\u5206\n  int pivot = _partition(nums, left, right);\n  // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return\n    // \u54e8\u5175\u5283\u5206\n    val pivot = partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
quick_sort.rb
[class]{QuickSort}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    var pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u6cc1\u4e0b\uff0c\u54e8\u5175\u5283\u5206\u7684\u905e\u8ff4\u5c64\u6578\u70ba \\(\\log n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u7e3d\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n \\log n)\\) \u6642\u9593\u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u5283\u5206\u70ba\u9577\u5ea6\u70ba \\(0\\) \u548c \\(n - 1\\) \u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u6b64\u6642\u905e\u8ff4\u5c64\u6578\u9054\u5230 \\(n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f38\u5165\u9663\u5217\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u6cc1\u4e0b\uff0c\u9054\u5230\u6700\u5dee\u905e\u8ff4\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\uff0c\u672a\u85c9\u52a9\u984d\u5916\u9663\u5217\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5283\u5206\u7684\u6700\u5f8c\u4e00\u6b65\uff0c\u57fa\u6e96\u6578\u53ef\u80fd\u6703\u88ab\u4ea4\u63db\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\u3002
"},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u70ba\u4ec0\u9ebc\u5feb","text":"

\u5f9e\u540d\u7a31\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u61c9\u8a72\u5177\u6709\u4e00\u5b9a\u7684\u512a\u52e2\u3002\u5118\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u8207\u201c\u5408\u4f75\u6392\u5e8f\u201d\u548c\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

  • \u51fa\u73fe\u6700\u5dee\u60c5\u6cc1\u7684\u6a5f\u7387\u5f88\u4f4e\uff1a\u96d6\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u6c92\u6709\u5408\u4f75\u6392\u5e8f\u7a69\u5b9a\uff0c\u4f46\u5728\u7d55\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u57f7\u884c\u3002
  • \u5feb\u53d6\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u57f7\u884c\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u6642\uff0c\u7cfb\u7d71\u53ef\u5c07\u6574\u500b\u5b50\u9663\u5217\u8f09\u5165\u5230\u5feb\u53d6\uff0c\u56e0\u6b64\u8a2a\u554f\u5143\u7d20\u7684\u6548\u7387\u8f03\u9ad8\u3002\u800c\u50cf\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u9019\u985e\u6f14\u7b97\u6cd5\u9700\u8981\u8df3\u8e8d\u5f0f\u8a2a\u554f\u5143\u7d20\uff0c\u5f9e\u800c\u7f3a\u4e4f\u9019\u4e00\u7279\u6027\u3002
  • \u8907\u96dc\u5ea6\u7684\u5e38\u6578\u4fc2\u6578\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u7a2e\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f03\u3001\u8ce6\u503c\u3001\u4ea4\u63db\u7b49\u64cd\u4f5c\u7684\u7e3d\u6578\u91cf\u6700\u5c11\u3002\u9019\u8207\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u985e\u4f3c\u3002
"},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u6e96\u6578\u6700\u4f73\u5316","text":"

\u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\u7684\u6642\u9593\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u8209\u4e00\u500b\u6975\u7aef\u4f8b\u5b50\uff0c\u5047\u8a2d\u8f38\u5165\u9663\u5217\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u65bc\u6211\u5011\u9078\u64c7\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u5728\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u57fa\u6e96\u6578\u88ab\u4ea4\u63db\u81f3\u9663\u5217\u6700\u53f3\u7aef\uff0c\u5c0e\u81f4\u5de6\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(n - 1\\)\u3001\u53f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(0\\) \u3002\u5982\u6b64\u905e\u8ff4\u4e0b\u53bb\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u5f8c\u90fd\u6709\u4e00\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u70ba\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

\u70ba\u4e86\u5118\u91cf\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u767c\u751f\uff0c\u6211\u5011\u53ef\u4ee5\u6700\u4f73\u5316\u54e8\u5175\u5283\u5206\u4e2d\u7684\u57fa\u6e96\u6578\u7684\u9078\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u5011\u53ef\u4ee5\u96a8\u6a5f\u9078\u53d6\u4e00\u500b\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u7136\u800c\uff0c\u5982\u679c\u904b\u6c23\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9078\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u6e96\u6578\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u76e1\u5982\u4eba\u610f\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u507d\u96a8\u6a5f\u6578\u201d\u3002\u5982\u679c\u6211\u5011\u91dd\u5c0d\u507d\u96a8\u6a5f\u6578\u5e8f\u5217\u69cb\u5efa\u4e00\u500b\u7279\u5b9a\u7684\u6e2c\u8a66\u6a23\u4f8b\uff0c\u90a3\u9ebc\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

\u70ba\u4e86\u9032\u4e00\u6b65\u6539\u9032\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u9663\u5217\u4e2d\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\uff08\u901a\u5e38\u70ba\u9663\u5217\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u9ede\u5143\u7d20\uff09\uff0c\u4e26\u5c07\u9019\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u57fa\u6e96\u6578\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6a5f\u7387\u5c07\u5927\u5e45\u63d0\u5347\u3002\u7576\u7136\uff0c\u6211\u5011\u9084\u53ef\u4ee5\u9078\u53d6\u66f4\u591a\u5019\u9078\u5143\u7d20\uff0c\u4ee5\u9032\u4e00\u6b65\u63d0\u9ad8\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002\u63a1\u7528\u9019\u7a2e\u65b9\u6cd5\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6a5f\u7387\u5927\u5927\u964d\u4f4e\u3002

\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u9593\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u9593\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
quick_sort.cpp
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.java
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.cs
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.go
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.swift
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
quick_sort.js
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.ts
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.dart
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u9593\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u9593\n  return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rs
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.c
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.kt
/* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u9593\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i                         // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
quick_sort.rb
[class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
quick_sort.zig
// \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n// \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u905e\u8ff4\u6700\u4f73\u5316","text":"

\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u4f54\u7528\u7a7a\u9593\u8f03\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f38\u5165\u9663\u5217\u70ba\u4f8b\uff0c\u8a2d\u905e\u8ff4\u4e2d\u7684\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(m\\) \uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u7522\u751f\u9577\u5ea6\u70ba \\(0\\) \u7684\u5de6\u5b50\u9663\u5217\u548c\u9577\u5ea6\u70ba \\(m - 1\\) \u7684\u53f3\u5b50\u9663\u5217\uff0c\u9019\u610f\u5473\u8457\u6bcf\u4e00\u5c64\u905e\u8ff4\u547c\u53eb\u6e1b\u5c11\u7684\u554f\u984c\u898f\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u6e1b\u5c11\u4e00\u500b\u5143\u7d20\uff09\uff0c\u905e\u8ff4\u6a39\u7684\u9ad8\u5ea6\u6703\u9054\u5230 \\(n - 1\\) \uff0c\u6b64\u6642\u9700\u8981\u4f54\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002

\u70ba\u4e86\u9632\u6b62\u5806\u758a\u5e40\u7a7a\u9593\u7684\u7d2f\u7a4d\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u6bcf\u8f2a\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u5f8c\uff0c\u6bd4\u8f03\u5169\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\uff0c\u50c5\u5c0d\u8f03\u77ed\u7684\u5b50\u9663\u5217\u9032\u884c\u905e\u8ff4\u3002\u7531\u65bc\u8f03\u77ed\u5b50\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u6703\u8d85\u904e \\(n / 2\\) \uff0c\u56e0\u6b64\u9019\u7a2e\u65b9\u6cd5\u80fd\u78ba\u4fdd\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff0c\u5f9e\u800c\u5c07\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right:\n        # \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n
quick_sort.cpp
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.java
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.cs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.go
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    for left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.swift
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.js
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.ts
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.dart
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n      left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n      right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    }\n  }\n}\n
quick_sort.rs
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.c
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
quick_sort.kt
/* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            l = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            r = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
quick_sort.rb
[class]{QuickSortTailCall}-[func]{quick_sort}\n
quick_sort.zig
// \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                   // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6578\u6392\u5e8f","text":"

\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u8a08\u6578\u6392\u5e8f\uff0c\u5b83\u9069\u7528\u65bc\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5927\u4f46\u8cc7\u6599\u7bc4\u570d \\(m\\) \u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u5c0d \\(n = 10^6\\) \u500b\u5b78\u865f\u9032\u884c\u6392\u5e8f\uff0c\u800c\u5b78\u865f\u662f\u4e00\u500b \\(8\\) \u4f4d\u6578\u5b57\uff0c\u9019\u610f\u5473\u8457\u8cc7\u6599\u7bc4\u570d \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u800c\u57fa\u6578\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u3002

\u57fa\u6578\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u8207\u8a08\u6578\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u900f\u904e\u7d71\u8a08\u500b\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u57fa\u6578\u6392\u5e8f\u5229\u7528\u6578\u5b57\u5404\u4f4d\u4e4b\u9593\u7684\u905e\u9032\u95dc\u4fc2\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u4e00\u4f4d\u9032\u884c\u6392\u5e8f\uff0c\u5f9e\u800c\u5f97\u5230\u6700\u7d42\u7684\u6392\u5e8f\u7d50\u679c\u3002

"},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

\u4ee5\u5b78\u865f\u8cc7\u6599\u70ba\u4f8b\uff0c\u5047\u8a2d\u6578\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6578\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-18 \u6240\u793a\u3002

  1. \u521d\u59cb\u5316\u4f4d\u6578 \\(k = 1\\) \u3002
  2. \u5c0d\u5b78\u865f\u7684\u7b2c \\(k\\) \u4f4d\u57f7\u884c\u201c\u8a08\u6578\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u5f8c\uff0c\u8cc7\u6599\u6703\u6839\u64da\u7b2c \\(k\\) \u4f4d\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u3002
  3. \u5c07 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u5f8c\u8fd4\u56de\u6b65\u9a5f 2. \u7e7c\u7e8c\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u5f8c\u7d50\u675f\u3002

\u5716 11-18 \u00a0 \u57fa\u6578\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

\u4e0b\u9762\u5256\u6790\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u65bc\u4e00\u500b \\(d\\) \u9032\u4f4d\u5236\u7684\u6578\u5b57 \\(x\\) \uff0c\u8981\u7372\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8a08\u7b97\u516c\u5f0f\uff1a

\\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

\u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5c0d\u6d6e\u9ede\u6578 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5c0d \\(d\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\u3002\u5c0d\u65bc\u5b78\u865f\u8cc7\u6599\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

\u6b64\u5916\uff0c\u6211\u5011\u9700\u8981\u5c0f\u5e45\u6539\u52d5\u8a08\u6578\u6392\u5e8f\u7a0b\u5f0f\u78bc\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u64da\u6578\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u9032\u884c\u6392\u5e8f\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
def digit(num: int, exp: int) -> int:\n    \"\"\"\u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter = [0] * 10\n    n = len(nums)\n    # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1  # \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6578\u6392\u5e8f\"\"\"\n    # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    m = max(nums)\n    # \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    exp = 1\n    while exp <= m:\n        # \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
radix_sort.cpp
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
radix_sort.java
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.cs
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
radix_sort.go
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++             // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
radix_sort.swift
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var counter = Array(repeating: 0, count: 10)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1 // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
radix_sort.js
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.ts
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
radix_sort.dart
/* \u7372\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n    counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n  }\n  // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n  }\n  // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  // dart \u4e2d int \u7684\u9577\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
radix_sort.rs
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
radix_sort.c
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < size; i++) {\n        // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        int d = digit(nums[i], exp);\n        // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
radix_sort.kt
/* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    while (exp <= m) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
radix_sort.rb
[class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
radix_sort.zig
// \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6578\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u70ba\u4ec0\u9ebc\u5f9e\u6700\u4f4e\u4f4d\u958b\u59cb\u6392\u5e8f\uff1f

\u5728\u9023\u7e8c\u7684\u6392\u5e8f\u8f2a\u6b21\u4e2d\uff0c\u5f8c\u4e00\u8f2a\u6392\u5e8f\u6703\u8986\u84cb\u524d\u4e00\u8f2a\u6392\u5e8f\u7684\u7d50\u679c\u3002\u8209\u4f8b\u4f86\u8aaa\uff0c\u5982\u679c\u7b2c\u4e00\u8f2a\u6392\u5e8f\u7d50\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f2a\u6392\u5e8f\u7d50\u679c \\(a > b\\) \uff0c\u90a3\u9ebc\u7b2c\u4e8c\u8f2a\u7684\u7d50\u679c\u5c07\u53d6\u4ee3\u7b2c\u4e00\u8f2a\u7684\u7d50\u679c\u3002\u7531\u65bc\u6578\u5b57\u7684\u9ad8\u4f4d\u512a\u5148\u9806\u5e8f\u9ad8\u65bc\u4f4e\u4f4d\uff0c\u56e0\u6b64\u61c9\u8a72\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

"},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

\u76f8\u8f03\u65bc\u8a08\u6578\u6392\u5e8f\uff0c\u57fa\u6578\u6392\u5e8f\u9069\u7528\u65bc\u6578\u503c\u7bc4\u570d\u8f03\u5927\u7684\u60c5\u6cc1\uff0c\u4f46\u524d\u63d0\u662f\u8cc7\u6599\u5fc5\u9808\u53ef\u4ee5\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6578\u4e0d\u80fd\u904e\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u9ede\u6578\u4e0d\u9069\u5408\u4f7f\u7528\u57fa\u6578\u6392\u5e8f\uff0c\u56e0\u70ba\u5176\u4f4d\u6578 \\(k\\) \u904e\u5927\uff0c\u53ef\u80fd\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u8a2d\u8cc7\u6599\u91cf\u70ba \\(n\\)\u3001\u8cc7\u6599\u70ba \\(d\\) \u9032\u4f4d\u5236\u3001\u6700\u5927\u4f4d\u6578\u70ba \\(k\\) \uff0c\u5247\u5c0d\u67d0\u4e00\u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u6642\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5c0d\u8f03\u5c0f\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u8207\u8a08\u6578\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6578\u6392\u5e8f\u9700\u8981\u85c9\u52a9\u9577\u5ea6\u70ba \\(n\\) \u548c \\(d\\) \u7684\u9663\u5217 res \u548c counter \u3002
  • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7576\u8a08\u6578\u6392\u5e8f\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u4e5f\u7a69\u5b9a\uff1b\u7576\u8a08\u6578\u6392\u5e8f\u4e0d\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u7121\u6cd5\u4fdd\u8b49\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\u3002
"},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9078\u64c7\u6392\u5e8f","text":"

\u9078\u64c7\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7c21\u55ae\uff1a\u958b\u555f\u4e00\u500b\u8ff4\u5708\uff0c\u6bcf\u8f2a\u5f9e\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c07\u5176\u653e\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u672b\u5c3e\u3002

\u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u9078\u64c7\u6392\u5e8f\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 11-2 \u6240\u793a\u3002

  1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u5340\u9593\u70ba \\([0, n-1]\\) \u3002
  2. \u9078\u53d6\u5340\u9593 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(0\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 1 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  3. \u9078\u53d6\u5340\u9593 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(1\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  4. \u4ee5\u6b64\u985e\u63a8\u3002\u7d93\u904e \\(n - 1\\) \u8f2a\u9078\u64c7\u8207\u4ea4\u63db\u5f8c\uff0c\u9663\u5217\u524d \\(n - 1\\) \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
  5. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u5716 11-2 \u00a0 \u9078\u64c7\u6392\u5e8f\u6b65\u9a5f

\u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u7528 \\(k\\) \u4f86\u8a18\u9304\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
def selection_sort(nums: list[int]):\n    \"\"\"\u9078\u64c7\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in range(n - 1):\n        # \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n
selection_sort.cpp
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        swap(nums[i], nums[k]);\n    }\n}\n
selection_sort.java
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.cs
/* \u9078\u64c7\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
selection_sort.go
/* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
selection_sort.swift
/* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swapAt(i, k)\n    }\n}\n
selection_sort.js
/* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.ts
/* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
selection_sort.dart
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
selection_sort.rs
/* \u9078\u64c7\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in 0..n - 1 {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swap(i, k);\n    }\n}\n
selection_sort.c
/* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
selection_sort.kt
/* \u9078\u64c7\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
selection_sort.rb
[class]{}-[func]{selection_sort}\n
selection_sort.zig
[class]{}-[func]{selectionSort}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5916\u8ff4\u5708\u5171 \\(n - 1\\) \u8f2a\uff0c\u7b2c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6700\u5f8c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(2\\) \uff0c\u5373\u5404\u8f2a\u5916\u8ff4\u5708\u5206\u5225\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f2a\u5167\u8ff4\u5708\uff0c\u6c42\u548c\u70ba \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
  • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5982\u5716 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u63db\u81f3\u8207\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u908a\uff0c\u5c0e\u81f4\u5169\u8005\u7684\u76f8\u5c0d\u9806\u5e8f\u767c\u751f\u6539\u8b8a\u3002

\u5716 11-3 \u00a0 \u9078\u64c7\u6392\u5e8f\u975e\u7a69\u5b9a\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

\u6392\u5e8f\u6f14\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u65bc\u5c0d\u4e00\u7d44\u8cc7\u6599\u6309\u7167\u7279\u5b9a\u9806\u5e8f\u9032\u884c\u6392\u5217\u3002\u6392\u5e8f\u6f14\u7b97\u6cd5\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\uff0c\u56e0\u70ba\u6709\u5e8f\u8cc7\u6599\u901a\u5e38\u80fd\u5920\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u8a62\u3001\u5206\u6790\u548c\u8655\u7406\u3002

\u5982\u5716 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u8cc7\u6599\u578b\u5225\u53ef\u4ee5\u662f\u6574\u6578\u3001\u6d6e\u9ede\u6578\u3001\u5b57\u5143\u6216\u5b57\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65b7\u898f\u5247\u53ef\u6839\u64da\u9700\u6c42\u8a2d\u5b9a\uff0c\u5982\u6578\u5b57\u5927\u5c0f\u3001\u5b57\u5143 ASCII \u78bc\u9806\u5e8f\u6216\u81ea\u5b9a\u7fa9\u898f\u5247\u3002

\u5716 11-1 \u00a0 \u8cc7\u6599\u578b\u5225\u548c\u5224\u65b7\u898f\u5247\u793a\u4f8b

"},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8a55\u50f9\u7dad\u5ea6","text":"

\u57f7\u884c\u6548\u7387\uff1a\u6211\u5011\u671f\u671b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5118\u91cf\u4f4e\uff0c\u4e14\u7e3d\u9ad4\u64cd\u4f5c\u6578\u91cf\u8f03\u5c11\uff08\u6642\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\uff09\u3002\u5c0d\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u57f7\u884c\u6548\u7387\u986f\u5f97\u5c24\u70ba\u91cd\u8981\u3002

\u5c31\u5730\u6027\uff1a\u9867\u540d\u601d\u7fa9\uff0c\u539f\u5730\u6392\u5e8f\u900f\u904e\u5728\u539f\u9663\u5217\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\uff0c\u7121\u9808\u85c9\u52a9\u984d\u5916\u7684\u8f14\u52a9\u9663\u5217\uff0c\u5f9e\u800c\u7bc0\u7701\u8a18\u61b6\u9ad4\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u8cc7\u6599\u642c\u904b\u64cd\u4f5c\u8f03\u5c11\uff0c\u57f7\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

\u7a69\u5b9a\u6027\uff1a\u7a69\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u5f8c\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u76f8\u5c0d\u9806\u5e8f\u4e0d\u767c\u751f\u6539\u8b8a\u3002

\u7a69\u5b9a\u6392\u5e8f\u662f\u591a\u7d1a\u6392\u5e8f\u5834\u666f\u7684\u5fc5\u8981\u689d\u4ef6\u3002\u5047\u8a2d\u6211\u5011\u6709\u4e00\u500b\u5132\u5b58\u5b78\u751f\u8cc7\u8a0a\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u5225\u662f\u59d3\u540d\u548c\u5e74\u9f61\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u975e\u7a69\u5b9a\u6392\u5e8f\u53ef\u80fd\u5c0e\u81f4\u8f38\u5165\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u55aa\u5931\uff1a

# \u8f38\u5165\u8cc7\u6599\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8a2d\u4f7f\u7528\u975e\u7a69\u5b9a\u6392\u5e8f\u6f14\u7b97\u6cd5\u6309\u5e74\u9f61\u6392\u5e8f\u4e32\u5217\uff0c\n# \u7d50\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5c0d\u4f4d\u7f6e\u6539\u8b8a\uff0c\n# \u8f38\u5165\u8cc7\u6599\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8cea\u4e1f\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

\u81ea\u9069\u61c9\u6027\uff1a\u81ea\u9069\u61c9\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u53d7\u8f38\u5165\u8cc7\u6599\u7684\u5f71\u97ff\uff0c\u5373\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u3001\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4e26\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

\u81ea\u9069\u61c9\u6027\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u4f86\u8a55\u4f30\u3002\u5982\u679c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u5dee\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u8aaa\u660e\u6392\u5e8f\u6f14\u7b97\u6cd5\u5728\u67d0\u4e9b\u8cc7\u6599\u4e0b\u6548\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u8996\u70ba\u8ca0\u9762\u5c6c\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u5247\u88ab\u8996\u70ba\u6b63\u9762\u5c6c\u6027\u3002

\u662f\u5426\u57fa\u65bc\u6bd4\u8f03\uff1a\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u4f9d\u8cf4\u6bd4\u8f03\u904b\u7b97\u5b50\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u4f86\u5224\u65b7\u5143\u7d20\u7684\u76f8\u5c0d\u9806\u5e8f\uff0c\u5f9e\u800c\u6392\u5e8f\u6574\u500b\u9663\u5217\uff0c\u7406\u8ad6\u6700\u512a\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f03\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f03\u904b\u7b97\u5b50\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5c0d\u8f03\u5dee\u3002

"},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

\u57f7\u884c\u5feb\u3001\u539f\u5730\u3001\u7a69\u5b9a\u3001\u6b63\u5411\u81ea\u9069\u61c9\u3001\u901a\u7528\u6027\u597d\u3002\u986f\u7136\uff0c\u8fc4\u4eca\u70ba\u6b62\u5c1a\u672a\u767c\u73fe\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9078\u64c7\u6392\u5e8f\u6f14\u7b97\u6cd5\u6642\uff0c\u9700\u8981\u6839\u64da\u5177\u9ad4\u7684\u8cc7\u6599\u7279\u9ede\u548c\u554f\u984c\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u5171\u540c\u5b78\u7fd2\u5404\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4e26\u57fa\u65bc\u4e0a\u8ff0\u8a55\u50f9\u7dad\u5ea6\u5c0d\u5404\u500b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u512a\u7f3a\u9ede\u9032\u884c\u5206\u6790\u3002

"},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u6ce1\u6cab\u6392\u5e8f\u900f\u904e\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u900f\u904e\u65b0\u589e\u4e00\u500b\u6a19\u8a8c\u4f4d\u4f86\u5be6\u73fe\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(n)\\) \u3002
  • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f2a\u5c07\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u6b63\u78ba\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u96d6\u7136\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u4f46\u7531\u65bc\u55ae\u5143\u64cd\u4f5c\u76f8\u5c0d\u8f03\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u8cc7\u6599\u91cf\u7684\u6392\u5e8f\u4efb\u52d9\u4e2d\u975e\u5e38\u53d7\u6b61\u8fce\u3002
  • \u5feb\u901f\u6392\u5e8f\u57fa\u65bc\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5283\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9078\u53d6\u5230\u6700\u5dee\u7684\u57fa\u6e96\u6578\uff0c\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6578\u57fa\u6e96\u6578\u6216\u96a8\u6a5f\u57fa\u6e96\u6578\u53ef\u4ee5\u964d\u4f4e\u9019\u7a2e\u52a3\u5316\u7684\u6a5f\u7387\u3002\u5c3e\u905e\u8ff4\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u6e1b\u5c11\u905e\u8ff4\u6df1\u5ea6\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(\\log n)\\) \u3002
  • \u5408\u4f75\u6392\u5e8f\u5305\u62ec\u5283\u5206\u548c\u5408\u4e26\u5169\u500b\u968e\u6bb5\uff0c\u5178\u578b\u5730\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5408\u4f75\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u9663\u5217\u9700\u8981\u5efa\u7acb\u8f14\u52a9\u9663\u5217\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u93c8\u7d50\u4e32\u5217\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002
  • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u500b\u6b65\u9a5f\uff1a\u8cc7\u6599\u5206\u6876\u3001\u6876\u5167\u6392\u5e8f\u548c\u5408\u4e26\u7d50\u679c\u3002\u5b83\u540c\u6a23\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9069\u7528\u65bc\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u3002\u6876\u6392\u5e8f\u7684\u95dc\u9375\u5728\u65bc\u5c0d\u8cc7\u6599\u9032\u884c\u5e73\u5747\u5206\u914d\u3002
  • \u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5b83\u900f\u904e\u7d71\u8a08\u8cc7\u6599\u51fa\u73fe\u7684\u6b21\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u6709\u9650\u7684\u60c5\u6cc1\uff0c\u4e26\u4e14\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8f49\u63db\u70ba\u6b63\u6574\u6578\u3002
  • \u57fa\u6578\u6392\u5e8f\u900f\u904e\u9010\u4f4d\u6392\u5e8f\u4f86\u5be6\u73fe\u8cc7\u6599\u6392\u5e8f\uff0c\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u6578\u5b57\u3002
  • \u7e3d\u7684\u4f86\u8aaa\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a69\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9069\u61c9\u6027\u7b49\u512a\u9ede\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u6c92\u6709\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u80fd\u5920\u540c\u6642\u6eff\u8db3\u6240\u6709\u9019\u4e9b\u689d\u4ef6\u3002\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u9700\u8981\u6839\u64da\u8cc7\u6599\u7684\u7279\u6027\u4f86\u9078\u64c7\u5408\u9069\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002
  • \u5716 11-19 \u5c0d\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a69\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9069\u61c9\u6027\u7b49\u3002

\u5716 11-19 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5\u5c0d\u6bd4

"},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u6392\u5e8f\u6f14\u7b97\u6cd5\u7a69\u5b9a\u6027\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

\u5728\u73fe\u5be6\u4e2d\uff0c\u6211\u5011\u6709\u53ef\u80fd\u57fa\u65bc\u7269\u4ef6\u7684\u67d0\u500b\u5c6c\u6027\u9032\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b78\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u5169\u500b\u5c6c\u6027\uff0c\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u4e00\u500b\u591a\u7d1a\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5c0d\u8eab\u9ad8\u9032\u884c\u6392\u5e8f\u3002\u7531\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e0d\u7a69\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

\u53ef\u4ee5\u767c\u73fe\uff0c\u5b78\u751f D \u548c C \u7684\u4f4d\u7f6e\u767c\u751f\u4e86\u4ea4\u63db\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u58de\u4e86\uff0c\u800c\u9019\u662f\u6211\u5011\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

Q\uff1a\u54e8\u5175\u5283\u5206\u4e2d\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u8207\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u7684\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\u55ce\uff1f

\u4e0d\u884c\uff0c\u7576\u6211\u5011\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u70ba\u57fa\u6e96\u6578\u6642\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u518d\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002\u9019\u500b\u7d50\u8ad6\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u6211\u5011\u4f86\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

\u54e8\u5175\u5283\u5206 partition() \u7684\u6700\u5f8c\u4e00\u6b65\u662f\u4ea4\u63db nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u57fa\u6e96\u6578\u5de6\u908a\u7684\u5143\u7d20\u90fd <= \u57fa\u6e96\u6578\uff0c\u9019\u5c31\u8981\u6c42\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u524d nums[left] >= nums[i] \u5fc5\u9808\u6210\u7acb\u3002\u5047\u8a2d\u6211\u5011\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\uff0c\u90a3\u9ebc\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5247\u6703\u5728 i == j \u6642\u8df3\u51fa\u8ff4\u5708\uff0c\u6b64\u6642\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6b64\u6642\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u64cd\u4f5c\u6703\u628a\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\uff0c\u5c0e\u81f4\u54e8\u5175\u5283\u5206\u5931\u6557\u3002

\u8209\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u9663\u5217 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u5f9e\u5de6\u5411\u53f3\u67e5\u8a62\u201d\uff0c\u54e8\u5175\u5283\u5206\u5f8c\u9663\u5217\u70ba [1, 0, 0, 0, 0] \uff0c\u9019\u500b\u7d50\u679c\u662f\u4e0d\u6b63\u78ba\u7684\u3002

\u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u5011\u9078\u64c7 nums[right] \u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u6b63\u597d\u53cd\u904e\u4f86\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002

Q\uff1a\u95dc\u65bc\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u70ba\u4ec0\u9ebc\u9078\u77ed\u7684\u9663\u5217\u80fd\u4fdd\u8b49\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff1f

\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f\u7576\u524d\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u65b9\u6cd5\u7684\u6578\u91cf\u3002\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u6211\u5011\u5c07\u539f\u9663\u5217\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002\u5728\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u5f8c\uff0c\u5411\u4e0b\u905e\u8ff4\u7684\u5b50\u9663\u5217\u9577\u5ea6\u6700\u5927\u70ba\u539f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8a2d\u6700\u5dee\u60c5\u6cc1\uff0c\u4e00\u76f4\u70ba\u4e00\u534a\u9577\u5ea6\uff0c\u90a3\u9ebc\u6700\u7d42\u7684\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

\u56de\u9867\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u5011\u6709\u53ef\u80fd\u6703\u9023\u7e8c\u5730\u905e\u8ff4\u9577\u5ea6\u8f03\u5927\u7684\u9663\u5217\uff0c\u6700\u5dee\u60c5\u6cc1\u4e0b\u70ba \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u51fa\u73fe\u3002

Q\uff1a\u7576\u9663\u5217\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u6642\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n^2)\\) \u55ce\uff1f\u8a72\u5982\u4f55\u8655\u7406\u9019\u7a2e\u9000\u5316\u60c5\u6cc1\uff1f

\u662f\u7684\u3002\u5c0d\u65bc\u9019\u7a2e\u60c5\u6cc1\uff0c\u53ef\u4ee5\u8003\u616e\u900f\u904e\u54e8\u5175\u5283\u5206\u5c07\u9663\u5217\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\uff1a\u5c0f\u65bc\u3001\u7b49\u65bc\u3001\u5927\u65bc\u57fa\u6e96\u6578\u3002\u50c5\u5411\u4e0b\u905e\u8ff4\u5c0f\u65bc\u548c\u5927\u65bc\u7684\u5169\u90e8\u5206\u3002\u5728\u8a72\u65b9\u6cd5\u4e0b\uff0c\u8f38\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u9663\u5217\uff0c\u50c5\u4e00\u8f2a\u54e8\u5175\u5283\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u4ec0\u9ebc\u662f \\(O(n^2)\\) \uff1f

\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u500b\u6876\u4e2d\u3002\u5982\u679c\u6211\u5011\u63a1\u7528\u4e00\u500b \\(O(n^2)\\) \u6f14\u7b97\u6cd5\u4f86\u6392\u5e8f\u9019\u4e9b\u5143\u7d20\uff0c\u5247\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

"},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u5806\u758a\u8207\u4f47\u5217","text":"

Abstract

\u5806\u758a\u5982\u540c\u758a\u8c93\u8c93\uff0c\u800c\u4f47\u5217\u5c31\u50cf\u8c93\u8c93\u6392\u968a\u3002

\u5169\u8005\u5206\u5225\u4ee3\u8868\u5148\u5165\u5f8c\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u908f\u8f2f\u95dc\u4fc2\u3002

"},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 5.1 \u00a0 \u5806\u758a
  • 5.2 \u00a0 \u4f47\u5217
  • 5.3 \u00a0 \u96d9\u5411\u4f47\u5217
  • 5.4 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u96d9\u5411\u4f47\u5217","text":"

\u5728\u4f47\u5217\u4e2d\uff0c\u6211\u5011\u50c5\u80fd\u522a\u9664\u982d\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u3002\u5982\u5716 5-7 \u6240\u793a\uff0c\u96d9\u5411\u4f47\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u9748\u6d3b\u6027\uff0c\u5141\u8a31\u5728\u982d\u90e8\u548c\u5c3e\u90e8\u57f7\u884c\u5143\u7d20\u7684\u65b0\u589e\u6216\u522a\u9664\u64cd\u4f5c\u3002

\u5716 5-7 \u00a0 \u96d9\u5411\u4f47\u5217\u7684\u64cd\u4f5c

"},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u96d9\u5411\u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u96d9\u5411\u4f47\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u7a31\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

\u8868 5-3 \u00a0 \u96d9\u5411\u4f47\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push_first() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u9996 \\(O(1)\\) push_last() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop_first() \u522a\u9664\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u522a\u9664\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\)

\u540c\u6a23\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u5df2\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
from collections import deque\n\n# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeq.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeq.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deq[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deq.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deq.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deq) == 0\n
deque.cpp
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint front = deque.front(); // \u4f47\u5217\u9996\u5143\u7d20\nint back = deque.back();   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.pop_front();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.pop_back();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = deque.empty();\n
deque.java
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.pollFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.pollLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
deque.cs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c07\u93c8\u7d50\u4e32\u5217 LinkedList \u770b\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.AddLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.AddFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.RemoveFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.RemoveLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.Count == 0;\n
deque_test.go
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.PushBack(2)      // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.PushFront(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfront := deque.Front() // \u4f47\u5217\u9996\u5143\u7d20\nrear := deque.Back()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.Remove(front)    // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.Remove(rear)     // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := deque.Len() == 0\n
deque.swift
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.append(2) // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.insert(1, at: 0)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nlet peekFirst = deque.first! // \u4f47\u5217\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u4f7f\u7528 Array \u6a21\u64ec\u6642 popFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet popFirst = deque.removeFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nlet popLast = deque.removeLast() // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = deque.isEmpty\n
deque.js
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty = size === 0;\n
deque.ts
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty: boolean = size === 0;\n
deque.dart
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u7fa9\u70ba\u96d9\u5411\u4f47\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.addLast(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.addFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.first; // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.removeFirst(); // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.removeLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.isEmpty;\n
deque.rs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u4f47\u5217\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop_front) = deque.pop_front() { // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
deque.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u96d9\u5411\u4f47\u5217\n
deque.kt
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2)  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u4f47\u5217\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nval popFirst = deque.pollFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nval popLast = deque.pollLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = deque.isEmpty()\n
deque.rb
# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\n# Ruby \u6c92\u6709\u5167\u76f4\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u968a\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#unshift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8a2a\u554f\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u5217\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0c Array#shift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize = deque.length\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = size.zero?\n
deque.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u96d9\u5411\u4f47\u5217\u5be6\u73fe *","text":"

\u96d9\u5411\u4f47\u5217\u7684\u5be6\u73fe\u8207\u4f47\u5217\u985e\u4f3c\uff0c\u53ef\u4ee5\u9078\u64c7\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u4f5c\u70ba\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

"},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u56de\u9867\u4e0a\u4e00\u7bc0\u5167\u5bb9\uff0c\u6211\u5011\u4f7f\u7528\u666e\u901a\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u4f47\u5217\uff0c\u56e0\u70ba\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u522a\u9664\u982d\u7bc0\u9ede\uff08\u5c0d\u61c9\u51fa\u5217\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e\u65b0\u7bc0\u9ede\uff08\u5c0d\u61c9\u5165\u5217\u64cd\u4f5c\uff09\u3002

\u5c0d\u65bc\u96d9\u5411\u4f47\u5217\u800c\u8a00\uff0c\u982d\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u57f7\u884c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96d9\u5411\u4f47\u5217\u9700\u8981\u5be6\u73fe\u53e6\u4e00\u500b\u5c0d\u7a31\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u201c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u201d\u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

\u5982\u5716 5-8 \u6240\u793a\uff0c\u6211\u5011\u5c07\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u548c\u5c3e\u7bc0\u9ede\u8996\u70ba\u96d9\u5411\u4f47\u5217\u7684\u4f47\u5217\u9996\u548c\u4f47\u5217\u5c3e\uff0c\u540c\u6642\u5be6\u73fe\u5728\u5169\u7aef\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u7684\u529f\u80fd\u3002

LinkedListDequepush_last()push_first()pop_last()pop_first()

\u5716 5-8 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0  # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u5217\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        elif is_front:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size += 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u5217\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            # \u522a\u9664\u982d\u7bc0\u9ede\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            # \u522a\u9664\u5c3e\u7bc0\u9ede\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size -= 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
linkedlist_deque.cpp
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nstruct DoublyListNode {\n    int val;              // \u7bc0\u9ede\u503c\n    DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize = 0;              // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_deque.java
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    int val; // \u7bc0\u9ede\u503c\n    ListNode next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    ListNode prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_deque.cs
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(int val) {\n    public int val = val;       // \u7bc0\u9ede\u503c\n    public ListNode? next = null; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u982d\u7bc0\u9ede front, \u5c3e\u7bc0\u9ede rear\n    int queSize = 0;      // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede                           \n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
linkedlist_deque.go
/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u96d9\u7aef\u4f47\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217 */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
linkedlist_deque.swift
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede rear\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if isFront {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size += 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        let val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear!.val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size -= 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.js
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val; // \u7bc0\u9ede\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    #front; // \u982d\u7bc0\u9ede front\n    #rear; // \u5c3e\u7bc0\u9ede rear\n    #queSize; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.ts
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next: ListNode; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val: number; // \u7bc0\u9ede\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u982d\u7bc0\u9ede front\n    private rear: ListNode; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
linkedlist_deque.dart
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  ListNode? prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u5c0d\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u982d\u7bc0\u9ede _front\n  late ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u9577\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u5217\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u5217\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n      val = _front!.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      // \u522a\u9664\u982d\u7bc0\u9ede\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n      val = _rear!.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      // \u522a\u9664\u5c3e\u7bc0\u9ede\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
linkedlist_deque.rs
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\npub struct ListNode<T> {\n    pub val: T,                                 // \u7bc0\u9ede\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u982d\u7bc0\u9ede\n                }\n            }\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u982d\u7bc0\u9ede\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_deque.c
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct DoublyListNode {\n    int val;                     // \u7bc0\u9ede\u503c\n    struct DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n    struct DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\n} DoublyListNode;\n\n/* \u5efa\u69cb\u5b50 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;                  // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n} LinkedListDeque;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e deque \u7d50\u69cb\u9ad4\n    free(deque);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    deque->queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
linkedlist_deque.kt
/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(var _val: Int) {\n    // \u7bc0\u9ede\u503c\n    var next: ListNode? = null // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? = null // \u5c3e\u7bc0\u9ede rear\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++ // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize-- // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return _val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_deque.rb
=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :prev # \u524d\u8ec0\u7bc0\u9ede\u5f15\u7528\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass LinkedListDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0     # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c \u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    elsif is_front\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size += 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u5217\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      # \u522a\u9664\u982d\u7bc0\u9ede\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else\n      val = @rear.val # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      # \u522a\u9664\u5c3e\u7bc0\u9ede\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size -= 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    val\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
linkedlist_deque.zig
// \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u7bc0\u9ede\u503c\n        next: ?*Self = null,    // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n        prev: ?*Self = null,    // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u982d\u7bc0\u9ede front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                             // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u5217\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n            } else {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        } \n\n        // \u4f47\u5217\u9996\u5165\u5217\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u4f47\u5217\u5c3e\u5165\u5217\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u5217\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            var val: T = undefined;\n            // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n                // \u522a\u9664\u982d\u7bc0\u9ede\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n                // \u522a\u9664\u5c3e\u7bc0\u9ede\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n            return val;\n        } \n\n        // \u4f47\u5217\u9996\u51fa\u5217\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u4f47\u5217\u5c3e\u51fa\u5217\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
"},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u5982\u5716 5-9 \u6240\u793a\uff0c\u8207\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u985e\u4f3c\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u4f7f\u7528\u74b0\u5f62\u9663\u5217\u4f86\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u3002

ArrayDequepush_last()push_first()pop_last()pop_first()

\u5716 5-9 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u5728\u4f47\u5217\u7684\u5be6\u73fe\u57fa\u790e\u4e0a\uff0c\u50c5\u9700\u589e\u52a0\u201c\u4f47\u5217\u9996\u5165\u5217\u201d\u548c\u201c\u4f47\u5217\u5c3e\u51fa\u5217\u201d\u7684\u65b9\u6cd5\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
class ArrayDeque:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15\"\"\"\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        num = self.peek_first()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
array_deque.cpp
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;      // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
array_deque.java
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.cs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int Index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.go
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
array_deque.swift
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
array_deque.js
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.ts
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i: number): number {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
array_deque.dart
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n  int index(int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe _front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
array_deque.rs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: usize,    // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: usize, // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
array_deque.c
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u5efa\u69cb\u5b50 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u9663\u5217\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c07 num \u65b0\u589e\u5230\u4f47\u5217\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
array_deque.kt
/* \u5efa\u69cb\u5b50 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_deque.rb
### \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass ArrayDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    num = peek_first\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u4f47\u5217\u5c3e\u51fa\u5217 ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 ###\n  def index(i)\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
array_deque.zig
[class]{ArrayDeque}-[func]{}\n
"},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u96d9\u5411\u4f47\u5217\u61c9\u7528","text":"

\u96d9\u5411\u4f47\u5217\u517c\u5177\u5806\u758a\u8207\u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5be6\u73fe\u9019\u5169\u8005\u7684\u6240\u6709\u61c9\u7528\u5834\u666f\uff0c\u540c\u6642\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

\u6211\u5011\u77e5\u9053\uff0c\u8edf\u9ad4\u7684\u201c\u64a4\u92b7\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u5806\u758a\u4f86\u5be6\u73fe\uff1a\u7cfb\u7d71\u5c07\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u5806\u758a\u4e2d\uff0c\u7136\u5f8c\u900f\u904e pop \u5be6\u73fe\u64a4\u92b7\u3002\u7136\u800c\uff0c\u8003\u616e\u5230\u7cfb\u7d71\u8cc7\u6e90\u7684\u9650\u5236\uff0c\u8edf\u9ad4\u901a\u5e38\u6703\u9650\u5236\u64a4\u92b7\u7684\u6b65\u6578\uff08\u4f8b\u5982\u50c5\u5141\u8a31\u5132\u5b58 \\(50\\) \u6b65\uff09\u3002\u7576\u5806\u758a\u7684\u9577\u5ea6\u8d85\u904e \\(50\\) \u6642\uff0c\u8edf\u9ad4\u9700\u8981\u5728\u5806\u758a\u5e95\uff08\u4f47\u5217\u9996\uff09\u57f7\u884c\u522a\u9664\u64cd\u4f5c\u3002\u4f46\u5806\u758a\u7121\u6cd5\u5be6\u73fe\u8a72\u529f\u80fd\uff0c\u6b64\u6642\u5c31\u9700\u8981\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f86\u66ff\u4ee3\u5806\u758a\u3002\u8acb\u6ce8\u610f\uff0c\u201c\u64a4\u92b7\u201d\u7684\u6838\u5fc3\u908f\u8f2f\u4ecd\u7136\u9075\u5faa\u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u539f\u5247\uff0c\u53ea\u662f\u96d9\u5411\u4f47\u5217\u80fd\u5920\u66f4\u52a0\u9748\u6d3b\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u908f\u8f2f\u3002

"},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u4f47\u5217","text":"

\u4f47\u5217\uff08queue\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u898f\u5247\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u9867\u540d\u601d\u7fa9\uff0c\u4f47\u5217\u6a21\u64ec\u4e86\u6392\u968a\u73fe\u8c61\uff0c\u5373\u65b0\u4f86\u7684\u4eba\u4e0d\u65b7\u52a0\u5165\u4f47\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u65bc\u4f47\u5217\u982d\u90e8\u7684\u4eba\u9010\u500b\u96e2\u958b\u3002

\u5982\u5716 5-4 \u6240\u793a\uff0c\u6211\u5011\u5c07\u4f47\u5217\u982d\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u9996\u201d\uff0c\u5c3e\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u5c07\u628a\u5143\u7d20\u52a0\u5165\u5217\u5c3e\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u5165\u5217\u201d\uff0c\u522a\u9664\u4f47\u5217\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u51fa\u5217\u201d\u3002

\u5716 5-4 \u00a0 \u4f47\u5217\u7684\u5148\u5165\u5148\u51fa\u898f\u5247

"},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

\u4f47\u5217\u7684\u5e38\u898b\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u65b9\u6cd5\u540d\u7a31\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002\u6211\u5011\u5728\u6b64\u63a1\u7528\u8207\u5806\u758a\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

\u8868 5-2 \u00a0 \u4f47\u5217\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5217\uff0c\u5373\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop() \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 \\(O(1)\\) peek() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\)

\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u73fe\u6210\u7684\u4f47\u5217\u985e\u5225\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
from collections import deque\n\n# \u521d\u59cb\u5316\u4f47\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u5011\u4e00\u822c\u5c07\u96d9\u5411\u4f47\u5217\u985e\u5225 deque \u7576\u4f5c\u4f47\u5217\u4f7f\u7528\n# \u96d6\u7136 queue.Queue() \u662f\u7d14\u6b63\u7684\u4f47\u5217\u985e\u5225\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u85a6\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u5217\npop: int = que.popleft()\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(que)\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(que) == 0\n
queue.cpp
/* \u521d\u59cb\u5316\u4f47\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u5217 */\nqueue.pop();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = queue.empty();\n
queue.java
/* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.poll();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
queue.cs
/* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.Dequeue();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.Count == 0;\n
queue_test.go
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u4f47\u5217\u4f86\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u5217 */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := queue.Len() == 0\n
queue.swift
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u7531\u65bc\u662f\u9663\u5217\uff0c\u56e0\u6b64 removeFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet pool = queue.removeFirst()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = queue.isEmpty\n
queue.js
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
queue.ts
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
queue.dart
/* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u4f47\u5217\u985e\u5225 Qeque \u662f\u96d9\u5411\u4f47\u5217\uff0c\u4e5f\u53ef\u4f5c\u70ba\u4f47\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.removeFirst();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.isEmpty;\n
queue.rs
/* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f5c\u70ba\u666e\u901a\u4f47\u5217\u4f86\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
queue.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u4f47\u5217\n
queue.kt
/* \u521d\u59cb\u5316\u4f47\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u5217 */\nval pop = queue.poll()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = queue.isEmpty()\n
queue.rb
# \u521d\u59cb\u5316\u4f47\u5217\n# Ruby \u5167\u5efa\u7684\u4f47\u5217\uff08Thread::Queue) \u6c92\u6709 peek \u548c\u8d70\u8a2a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u5217\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8a2a\u554f\u4f47\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u5217\n# \u6e05\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#shift \u65b9\u6cd5\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop = queue.shift\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize = queue.length\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = queue.empty?\n
queue.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u4f47\u5217\u5be6\u73fe","text":"

\u70ba\u4e86\u5be6\u73fe\u4f47\u5217\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u65b0\u589e\u5143\u7d20\uff0c\u4e26\u5728\u53e6\u4e00\u7aef\u522a\u9664\u5143\u7d20\uff0c\u93c8\u7d50\u4e32\u5217\u548c\u9663\u5217\u90fd\u7b26\u5408\u8981\u6c42\u3002

"},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u5982\u5716 5-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u201c\u982d\u7bc0\u9ede\u201d\u548c\u201c\u5c3e\u7bc0\u9ede\u201d\u5206\u5225\u8996\u70ba\u201c\u4f47\u5217\u9996\u201d\u548c\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u898f\u5b9a\u4f47\u5217\u5c3e\u50c5\u53ef\u65b0\u589e\u7bc0\u9ede\uff0c\u4f47\u5217\u9996\u50c5\u53ef\u522a\u9664\u7bc0\u9ede\u3002

LinkedListQueuepush()pop()

\u5716 5-5 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
class LinkedListQueue:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        node = ListNode(num)\n        # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num = self.peek()\n        # \u522a\u9664\u982d\u7bc0\u9ede\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
linkedlist_queue.cpp
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_queue.java
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.cs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.go
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u4f47\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5217 */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5217 */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
linkedlist_queue.swift
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u982d\u7bc0\u9ede\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.js
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    #front; // \u982d\u7bc0\u9ede #front\n    #rear; // \u5c3e\u7bc0\u9ede #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.ts
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u982d\u7bc0\u9ede front\n    private rear: ListNode | null; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_queue.dart
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u982d\u7bc0\u9ede _front\n  ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    final int _num = peek();\n    // \u522a\u9664\u982d\u7bc0\u9ede\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u4f47\u5217\u70ba\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
linkedlist_queue.rs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u4f47\u5217\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_queue.c
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e queue \u7d50\u69cb\u9ad4\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u7bc0\u9ede\u8655\u65b0\u589e node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
linkedlist_queue.kt
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue(\n    // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        val node = ListNode(num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_queue.rb
### \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u982d\u73fe\u7684\u4f47\u5217 ###\nclass LinkedListQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\uff0c\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u4ee4\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u522a\u9664\u982d\u7bc0\u9ede\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u70ba Array \u4e26\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
linkedlist_queue.zig
// \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u982d\u7bc0\u9ede front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                            // \u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u5728\u9663\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u9019\u6703\u5c0e\u81f4\u51fa\u5217\u64cd\u4f5c\u6548\u7387\u8f03\u4f4e\u3002\u7136\u800c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u4f86\u907f\u514d\u9019\u500b\u554f\u984c\u3002

\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 front \u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u4e26\u7dad\u8b77\u4e00\u500b\u8b8a\u6578 size \u7528\u65bc\u8a18\u9304\u4f47\u5217\u9577\u5ea6\u3002\u5b9a\u7fa9 rear = front + size \uff0c\u9019\u500b\u516c\u5f0f\u8a08\u7b97\u51fa\u7684 rear \u6307\u5411\u4f47\u5217\u5c3e\u5143\u7d20\u4e4b\u5f8c\u7684\u4e0b\u4e00\u500b\u4f4d\u7f6e\u3002

\u57fa\u65bc\u6b64\u8a2d\u8a08\uff0c\u9663\u5217\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u5340\u9593\u70ba [front, rear - 1]\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u6cd5\u5982\u5716 5-6 \u6240\u793a\u3002

  • \u5165\u5217\u64cd\u4f5c\uff1a\u5c07\u8f38\u5165\u5143\u7d20\u8ce6\u503c\u7d66 rear \u7d22\u5f15\u8655\uff0c\u4e26\u5c07 size \u589e\u52a0 1 \u3002
  • \u51fa\u5217\u64cd\u4f5c\uff1a\u53ea\u9700\u5c07 front \u589e\u52a0 1 \uff0c\u4e26\u5c07 size \u6e1b\u5c11 1 \u3002

\u53ef\u4ee5\u770b\u5230\uff0c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u90fd\u53ea\u9700\u9032\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002

ArrayQueuepush()pop()

\u5716 5-6 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u4e00\u500b\u554f\u984c\uff1a\u5728\u4e0d\u65b7\u9032\u884c\u5165\u5217\u548c\u51fa\u5217\u7684\u904e\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52d5\uff0c\u7576\u5b83\u5011\u5230\u9054\u9663\u5217\u5c3e\u90e8\u6642\u5c31\u7121\u6cd5\u7e7c\u7e8c\u79fb\u52d5\u4e86\u3002\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u8996\u70ba\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u74b0\u5f62\u9663\u5217\u201d\u3002

\u5c0d\u65bc\u74b0\u5f62\u9663\u5217\uff0c\u6211\u5011\u9700\u8981\u8b93 front \u6216 rear \u5728\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u76f4\u63a5\u56de\u5230\u9663\u5217\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002\u9019\u7a2e\u9031\u671f\u6027\u898f\u5f8b\u53ef\u4ee5\u900f\u904e\u201c\u53d6\u9918\u64cd\u4f5c\u201d\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
class ArrayQueue:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n        self._front: int = 0  # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        self._size: int = 0  # \u4f47\u5217\u9577\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u4f47\u5217\u5df2\u6eff\")\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num: int = self.peek()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
array_queue.cpp
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u4f47\u5217\u9577\u5ea6\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c07\u9663\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
array_queue.java
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.cs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
array_queue.go
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u5217 */\nfunc (q *arrayQueue) push(num int) {\n    // \u7576 rear == queCapacity \u8868\u793a\u4f47\u5217\u5df2\u6eff\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u5217 */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
array_queue.swift
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u4f47\u5217\u9577\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
array_queue.js
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front = 0; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.ts
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
array_queue.dart
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u4f47\u5217\u9577\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    int _num = peek();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
array_queue.rs
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: i32,        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: i32,     // \u4f47\u5217\u9577\u5ea6\n    que_capacity: i32, // \u4f47\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u5217 */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
array_queue.c
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u5efa\u69cb\u5b50 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u9663\u5217\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u5217 */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u5217 */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
array_queue.kt
/* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
array_queue.rb
### \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 ###\nclass ArrayQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    @front = 0 # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    @size = 0 # \u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    raise IndexError, '\u4f47\u5217\u5df2\u6eff' if size == capacity\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear = (@front + size) % capacity\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
array_queue.zig
// \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217     \n        cap: usize = 0,                                 // \u4f47\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u9663\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u4f47\u5217\u5df2\u6eff\\n\", .{});\n                return;\n            }\n            // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n            // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u4ee5\u4e0a\u5be6\u73fe\u7684\u4f47\u5217\u4ecd\u7136\u5177\u6709\u4fb7\u9650\u6027\uff1a\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002\u7136\u800c\uff0c\u9019\u500b\u554f\u984c\u4e0d\u96e3\u89e3\u6c7a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u66ff\u63db\u70ba\u52d5\u614b\u9663\u5217\uff0c\u5f9e\u800c\u5f15\u5165\u64f4\u5bb9\u6a5f\u5236\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u5617\u8a66\u81ea\u884c\u5be6\u73fe\u3002

\u5169\u7a2e\u5be6\u73fe\u7684\u5c0d\u6bd4\u7d50\u8ad6\u8207\u5806\u758a\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

"},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u4f47\u5217\u5178\u578b\u61c9\u7528","text":"
  • \u6dd8\u5bf6\u8a02\u55ae\u3002\u8cfc\u7269\u8005\u4e0b\u55ae\u5f8c\uff0c\u8a02\u55ae\u5c07\u52a0\u5165\u5217\u5217\u4e2d\uff0c\u7cfb\u7d71\u96a8\u5f8c\u6703\u6839\u64da\u9806\u5e8f\u8655\u7406\u4f47\u5217\u4e2d\u7684\u8a02\u55ae\u3002\u5728\u96d9\u5341\u4e00\u671f\u9593\uff0c\u77ed\u6642\u9593\u5167\u6703\u7522\u751f\u6d77\u91cf\u8a02\u55ae\uff0c\u9ad8\u4f75\u767c\u6210\u70ba\u5de5\u7a0b\u5e2b\u5011\u9700\u8981\u91cd\u9ede\u653b\u514b\u7684\u554f\u984c\u3002
  • \u5404\u985e\u5f85\u8fa6\u4e8b\u9805\u3002\u4efb\u4f55\u9700\u8981\u5be6\u73fe\u201c\u5148\u4f86\u5f8c\u5230\u201d\u529f\u80fd\u7684\u5834\u666f\uff0c\u4f8b\u5982\u5370\u8868\u6a5f\u7684\u4efb\u52d9\u4f47\u5217\u3001\u9910\u5ef3\u7684\u51fa\u9910\u4f47\u5217\u7b49\uff0c\u4f47\u5217\u5728\u9019\u4e9b\u5834\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7dad\u8b77\u8655\u7406\u9806\u5e8f\u3002
"},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u5806\u758a","text":"

\u5806\u758a\uff08stack\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u908f\u8f2f\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002

\u6211\u5011\u53ef\u4ee5\u5c07\u5806\u758a\u985e\u6bd4\u70ba\u684c\u9762\u4e0a\u7684\u4e00\u758a\u76e4\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76e4\u5b50\uff0c\u5247\u9700\u8981\u5148\u5c07\u4e0a\u9762\u7684\u76e4\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u5011\u5c07\u76e4\u5b50\u66ff\u63db\u70ba\u5404\u7a2e\u578b\u5225\u7684\u5143\u7d20\uff08\u5982\u6574\u6578\u3001\u5b57\u5143\u3001\u7269\u4ef6\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u5806\u758a\u9019\u7a2e\u8cc7\u6599\u7d50\u69cb\u3002

\u5982\u5716 5-1 \u6240\u793a\uff0c\u6211\u5011\u628a\u5806\u7a4d\u758a\u5143\u7d20\u7684\u9802\u90e8\u7a31\u70ba\u201c\u5806\u758a\u9802\u201d\uff0c\u5e95\u90e8\u7a31\u70ba\u201c\u5806\u758a\u5e95\u201d\u3002\u5c07\u628a\u5143\u7d20\u65b0\u589e\u5230\u5806\u758a\u9802\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u5806\u758a\u201d\uff0c\u522a\u9664\u5806\u758a\u9802\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u5806\u758a\u201d\u3002

\u5716 5-1 \u00a0 \u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u898f\u5247

"},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c","text":"

\u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u5011\u4ee5\u5e38\u898b\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u70ba\u4f8b\u3002

\u8868 5-1 \u00a0 \u5806\u758a\u7684\u64cd\u4f5c\u6548\u7387

\u65b9\u6cd5 \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u758a\uff08\u65b0\u589e\u81f3\u5806\u758a\u9802\uff09 \\(O(1)\\) pop() \u5806\u758a\u9802\u5143\u7d20\u51fa\u5806\u758a \\(O(1)\\) peek() \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 \\(O(1)\\)

\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8a9e\u8a00\u53ef\u80fd\u6c92\u6709\u5c08\u9580\u63d0\u4f9b\u5806\u758a\u985e\u5225\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u5c07\u8a72\u8a9e\u8a00\u7684\u201c\u9663\u5217\u201d\u6216\u201c\u93c8\u7d50\u4e32\u5217\u201d\u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\uff0c\u4e26\u5728\u7a0b\u5f0f\u908f\u8f2f\u4e0a\u5ffd\u7565\u8207\u5806\u758a\u7121\u95dc\u7684\u64cd\u4f5c\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
# \u521d\u59cb\u5316\u5806\u758a\n# Python \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a list \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop: int = stack.pop()\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(stack) == 0\n
stack.cpp
/* \u521d\u59cb\u5316\u5806\u758a */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nstack.pop(); // \u7121\u8fd4\u56de\u503c\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool empty = stack.empty();\n
stack.java
/* \u521d\u59cb\u5316\u5806\u758a */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
stack.cs
/* \u521d\u59cb\u5316\u5806\u758a */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.Pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.Count == 0;\n
stack_test.go
/* \u521d\u59cb\u5316\u5806\u758a */\n// \u5728 Go \u4e2d\uff0c\u63a8\u85a6\u5c07 Slice \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nisEmpty := len(stack) == 0\n
stack.swift
/* \u521d\u59cb\u5316\u5806\u758a */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.removeLast()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = stack.isEmpty\n
stack.js
/* \u521d\u59cb\u5316\u5806\u758a */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.ts
/* \u521d\u59cb\u5316\u5806\u758a */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
stack.dart
/* \u521d\u59cb\u5316\u5806\u758a */\n// Dart \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a List \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.removeLast();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.isEmpty;\n
stack.rs
/* \u521d\u59cb\u5316\u5806\u758a */\n// \u628a Vec \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.pop().unwrap();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet is_empty = stack.is_empty();\n
stack.c
// C \u672a\u63d0\u4f9b\u5167\u5efa\u5806\u758a\n
stack.kt
/* \u521d\u59cb\u5316\u5806\u758a */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nval pop = stack.pop()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nval isEmpty = stack.isEmpty()\n
stack.rb
# \u521d\u59cb\u5316\u5806\u758a\n# Ruby \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop = stack.pop\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize = stack.length\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty = stack.empty?\n
stack.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u5806\u758a\u7684\u5be6\u73fe","text":"

\u70ba\u4e86\u6df1\u5165\u77ad\u89e3\u5806\u758a\u7684\u57f7\u884c\u6a5f\u5236\uff0c\u6211\u5011\u4f86\u5617\u8a66\u81ea\u5df1\u5be6\u73fe\u4e00\u500b\u5806\u758a\u985e\u5225\u3002

\u5806\u758a\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u7684\u539f\u5247\uff0c\u56e0\u6b64\u6211\u5011\u53ea\u80fd\u5728\u5806\u758a\u9802\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u65b0\u589e\u548c\u522a\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u5806\u758a\u53ef\u4ee5\u8996\u70ba\u4e00\u7a2e\u53d7\u9650\u5236\u7684\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u201c\u906e\u853d\u201d\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u90e8\u5206\u7121\u95dc\u64cd\u4f5c\uff0c\u4f7f\u5176\u5c0d\u5916\u8868\u73fe\u7684\u908f\u8f2f\u7b26\u5408\u5806\u758a\u7684\u7279\u6027\u3002

"},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u9802\uff0c\u5c3e\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u5e95\u3002

\u5982\u5716 5-2 \u6240\u793a\uff0c\u5c0d\u65bc\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u6211\u5011\u53ea\u9700\u5c07\u5143\u7d20\u63d2\u5165\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u9019\u7a2e\u7bc0\u9ede\u63d2\u5165\u65b9\u6cd5\u88ab\u7a31\u70ba\u201c\u982d\u63d2\u6cd5\u201d\u3002\u800c\u5c0d\u65bc\u51fa\u5806\u758a\u64cd\u4f5c\uff0c\u53ea\u9700\u5c07\u982d\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u5373\u53ef\u3002

LinkedListStackpush()pop()

\u5716 5-2 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

\u4ee5\u4e0b\u662f\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
class LinkedListStack:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
linkedlist_stack.cpp
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize;        // \u5806\u758a\u7684\u9577\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
linkedlist_stack.java
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private int stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.cs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize = 0;   // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.go
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u5806\u758a\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
linkedlist_stack.swift
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var _size: Int // \u5806\u758a\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.js
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    #stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    #stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.ts
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private stkSize: number = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
linkedlist_stack.dart
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u985e\u5225\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n  int _stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba List \u4e26\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
linkedlist_stack.rs
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    stk_size: usize,                              // \u5806\u758a\u7684\u9577\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u5806\u758a */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
linkedlist_stack.c
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    ListNode *top; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int size;      // \u5806\u758a\u7684\u9577\u5ea6\n} LinkedListStack;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u6307\u6a19\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u8cc7\u6599\u57df\n    s->top = node;       // \u66f4\u65b0\u5806\u758a\u9802\n    s->size++;           // \u66f4\u65b0\u5806\u758a\u5927\u5c0f\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u5806\u758a */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n    s->size--;\n    return val;\n}\n
linkedlist_stack.kt
/* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var stkSize: Int = 0 // \u5806\u758a\u7684\u9577\u5ea6\n) {\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
linkedlist_stack.rb
### \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
linkedlist_stack.zig
// \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n        stk_size: usize = 0,                             // \u5806\u758a\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u5806\u758a\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u5806\u758a\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u7684\u5c3e\u90e8\u4f5c\u70ba\u5806\u758a\u9802\u3002\u5982\u5716 5-3 \u6240\u793a\uff0c\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u5206\u5225\u5c0d\u61c9\u5728\u9663\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u8207\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(1)\\) \u3002

ArrayStackpush()pop()

\u5716 5-3 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

\u7531\u65bc\u5165\u5806\u758a\u7684\u5143\u7d20\u53ef\u80fd\u6703\u6e90\u6e90\u4e0d\u65b7\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff0c\u9019\u6a23\u5c31\u7121\u9808\u81ea\u884c\u8655\u7406\u9663\u5217\u64f4\u5bb9\u554f\u984c\u3002\u4ee5\u4e0b\u70ba\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
class ArrayStack:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        return self._stack\n
array_stack.cpp
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
array_stack.java
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
array_stack.cs
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
array_stack.go
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype arrayStack struct {\n    data []int // \u8cc7\u6599\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8a2d\u5b9a\u5806\u758a\u7684\u9577\u5ea6\u70ba 0\uff0c\u5bb9\u91cf\u70ba 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u6703\u81ea\u52d5\u64f4\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6\u5806\u758a\u9802\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
array_stack.swift
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = []\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
array_stack.js
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
array_stack.ts
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
array_stack.dart
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c07\u5806\u758a\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
array_stack.rs
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u5806\u758a */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u5806\u758a\u70ba\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
array_stack.c
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u5efa\u69cb\u5b50 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u500b\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u64f4\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u5806\u758a\u5df2\u6eff\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u5806\u758a */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
array_stack.kt
/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
array_stack.rb
### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass ArrayStack\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
array_stack.zig
// \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u69cb\u65b9\u6cd5\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u5806\u758a\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u5169\u7a2e\u5be6\u73fe\u5c0d\u6bd4","text":"

\u652f\u6301\u64cd\u4f5c

\u5169\u7a2e\u5be6\u73fe\u90fd\u652f\u6301\u5806\u758a\u5b9a\u7fa9\u4e2d\u7684\u5404\u9805\u64cd\u4f5c\u3002\u9663\u5217\u5be6\u73fe\u984d\u5916\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff0c\u4f46\u9019\u5df2\u8d85\u51fa\u4e86\u5806\u758a\u7684\u5b9a\u7fa9\u7bc4\u7587\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u6703\u7528\u5230\u3002

\u6642\u9593\u6548\u7387

\u5728\u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u5165\u5806\u758a\u548c\u51fa\u5806\u758a\u64cd\u4f5c\u90fd\u5728\u9810\u5148\u5206\u914d\u597d\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u4e2d\u9032\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u5feb\u53d6\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f03\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u5806\u758a\u6642\u8d85\u51fa\u9663\u5217\u5bb9\u91cf\uff0c\u6703\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\uff0c\u5c0e\u81f4\u8a72\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8b8a\u70ba \\(O(n)\\) \u3002

\u5728\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u64f4\u5bb9\u975e\u5e38\u9748\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u9663\u5217\u64f4\u5bb9\u6642\u6548\u7387\u964d\u4f4e\u7684\u554f\u984c\u3002\u4f46\u662f\uff0c\u5165\u5806\u758a\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u7bc0\u9ede\u7269\u4ef6\u4e26\u4fee\u6539\u6307\u6a19\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5c0d\u8f03\u4f4e\u3002\u4e0d\u904e\uff0c\u5982\u679c\u5165\u5806\u758a\u5143\u7d20\u672c\u8eab\u5c31\u662f\u7bc0\u9ede\u7269\u4ef6\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9a5f\uff0c\u5f9e\u800c\u63d0\u9ad8\u6548\u7387\u3002

\u7d9c\u4e0a\u6240\u8ff0\uff0c\u7576\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u8cc7\u6599\u578b\u5225\u6642\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

  • \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u5728\u89f8\u767c\u64f4\u5bb9\u6642\u6548\u7387\u6703\u964d\u4f4e\uff0c\u4f46\u7531\u65bc\u64f4\u5bb9\u662f\u4f4e\u983b\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
  • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002

\u7a7a\u9593\u6548\u7387

\u5728\u521d\u59cb\u5316\u4e32\u5217\u6642\uff0c\u7cfb\u7d71\u6703\u70ba\u4e32\u5217\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8a72\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\uff1b\u4e26\u4e14\uff0c\u64f4\u5bb9\u6a5f\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u9032\u884c\u64f4\u5bb9\u7684\uff0c\u64f4\u5bb9\u5f8c\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002

\u7136\u800c\uff0c\u7531\u65bc\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9700\u8981\u984d\u5916\u5132\u5b58\u6307\u6a19\uff0c\u56e0\u6b64\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u4f54\u7528\u7684\u7a7a\u9593\u76f8\u5c0d\u8f03\u5927\u3002

\u7d9c\u4e0a\uff0c\u6211\u5011\u4e0d\u80fd\u7c21\u55ae\u5730\u78ba\u5b9a\u54ea\u7a2e\u5be6\u73fe\u66f4\u52a0\u7bc0\u7701\u8a18\u61b6\u9ad4\uff0c\u9700\u8981\u91dd\u5c0d\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

"},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u5806\u758a\u7684\u5178\u578b\u61c9\u7528","text":"
  • \u700f\u89bd\u5668\u4e2d\u7684\u5f8c\u9000\u8207\u524d\u9032\u3001\u8edf\u9ad4\u4e2d\u7684\u64a4\u92b7\u8207\u53cd\u64a4\u92b7\u3002\u6bcf\u7576\u6211\u5011\u958b\u555f\u65b0\u7684\u7db2\u9801\uff0c\u700f\u89bd\u5668\u5c31\u6703\u5c0d\u4e0a\u4e00\u500b\u7db2\u9801\u57f7\u884c\u5165\u5806\u758a\uff0c\u9019\u6a23\u6211\u5011\u5c31\u53ef\u4ee5\u901a\u904e\u5f8c\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u500b\u7db2\u9801\u3002\u5f8c\u9000\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u5728\u57f7\u884c\u51fa\u5806\u758a\u3002\u5982\u679c\u8981\u540c\u6642\u652f\u6301\u5f8c\u9000\u548c\u524d\u9032\uff0c\u90a3\u9ebc\u9700\u8981\u5169\u500b\u5806\u758a\u4f86\u914d\u5408\u5be6\u73fe\u3002
  • \u7a0b\u5f0f\u8a18\u61b6\u9ad4\u7ba1\u7406\u3002\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u5728\u5806\u758a\u9802\u65b0\u589e\u4e00\u500b\u5806\u758a\u5e40\uff0c\u7528\u65bc\u8a18\u9304\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u8a0a\u3002\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u5411\u4e0b\u905e\u63a8\u968e\u6bb5\u6703\u4e0d\u65b7\u57f7\u884c\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u968e\u6bb5\u5247\u6703\u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u758a\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u5806\u758a\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
  • \u5728\u6642\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u5177\u6709\u8f03\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u64f4\u5bb9\u904e\u7a0b\u4e2d\uff0c\u55ae\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5806\u758a\u7684\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5177\u6709\u66f4\u70ba\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002
  • \u5728\u7a7a\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u53ef\u80fd\u5c0e\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6bd4\u9663\u5217\u5143\u7d20\u66f4\u5927\u3002
  • \u4f47\u5217\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u540c\u6a23\u53ef\u4ee5\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u7684\u5c0d\u6bd4\u4e0a\uff0c\u4f47\u5217\u7684\u7d50\u8ad6\u8207\u524d\u8ff0\u5806\u758a\u7684\u7d50\u8ad6\u76f8\u4f3c\u3002
  • \u96d9\u5411\u4f47\u5217\u662f\u4e00\u7a2e\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u4f47\u5217\uff0c\u5b83\u5141\u8a31\u5728\u5169\u7aef\u9032\u884c\u5143\u7d20\u7684\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u3002
"},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u662f\u5426\u662f\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1f

\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u529f\u80fd\u672c\u8cea\u4e0a\u662f\u201c\u5806\u758a\u201d\u7684\u9ad4\u73fe\u3002\u7576\u7528\u6236\u8a2a\u554f\u4e00\u500b\u65b0\u9801\u9762\u6642\uff0c\u8a72\u9801\u9762\u6703\u88ab\u65b0\u589e\u5230\u5806\u758a\u9802\uff1b\u7576\u7528\u6236\u9ede\u9078\u5f8c\u9000\u6309\u9215\u6642\uff0c\u8a72\u9801\u9762\u6703\u5f9e\u5806\u758a\u9802\u5f48\u51fa\u3002\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u64cd\u4f5c\uff0c\u9019\u500b\u5728\u201c\u96d9\u5411\u4f47\u5217\u201d\u7ae0\u7bc0\u6709\u63d0\u5230\u3002

Q\uff1a\u5728\u51fa\u5806\u758a\u5f8c\uff0c\u662f\u5426\u9700\u8981\u91cb\u653e\u51fa\u5806\u758a\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\uff1f

\u5982\u679c\u5f8c\u7e8c\u4ecd\u9700\u8981\u4f7f\u7528\u5f48\u51fa\u7bc0\u9ede\uff0c\u5247\u4e0d\u9700\u8981\u91cb\u653e\u8a18\u61b6\u9ad4\u3002\u82e5\u4e4b\u5f8c\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8a9e\u8a00\u64c1\u6709\u81ea\u52d5\u5783\u573e\u56de\u6536\u6a5f\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\u3002

Q\uff1a\u96d9\u5411\u4f47\u5217\u50cf\u662f\u5169\u500b\u5806\u758a\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u9ebc\uff1f

\u96d9\u5411\u4f47\u5217\u5c31\u50cf\u662f\u5806\u758a\u548c\u4f47\u5217\u7684\u7d44\u5408\u6216\u5169\u500b\u5806\u758a\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73fe\u7684\u662f\u5806\u758a + \u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u53ef\u4ee5\u5be6\u73fe\u5806\u758a\u8207\u4f47\u5217\u7684\u6240\u6709\u61c9\u7528\uff0c\u4e26\u4e14\u66f4\u52a0\u9748\u6d3b\u3002

Q\uff1a\u64a4\u92b7\uff08undo\uff09\u548c\u53cd\u64a4\u92b7\uff08redo\uff09\u5177\u9ad4\u662f\u5982\u4f55\u5be6\u73fe\u7684\uff1f

\u4f7f\u7528\u5169\u500b\u5806\u758a\uff0c\u5806\u758a A \u7528\u65bc\u64a4\u92b7\uff0c\u5806\u758a B \u7528\u65bc\u53cd\u64a4\u92b7\u3002

  1. \u6bcf\u7576\u4f7f\u7528\u8005\u57f7\u884c\u4e00\u500b\u64cd\u4f5c\uff0c\u5c07\u9019\u500b\u64cd\u4f5c\u58d3\u5165\u5806\u758a A \uff0c\u4e26\u6e05\u7a7a\u5806\u758a B \u3002
  2. \u7576\u7528\u6236\u57f7\u884c\u201c\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a A \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a B \u3002
  3. \u7576\u7528\u6236\u57f7\u884c\u201c\u53cd\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a B \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a A \u3002
"},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6a39","text":"

Abstract

\u53c3\u5929\u5927\u6a39\u5145\u6eff\u751f\u547d\u529b\uff0c\u6839\u6df1\u8449\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

\u5b83\u70ba\u6211\u5011\u5c55\u73fe\u4e86\u8cc7\u6599\u5206\u6cbb\u7684\u751f\u52d5\u5f62\u614b\u3002

"},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
  • 7.1 \u00a0 \u4e8c\u5143\u6a39
  • 7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a
  • 7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a
  • 7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39
  • 7.5 \u00a0 AVL *
  • 7.6 \u00a0 \u5c0f\u7d50
"},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a","text":"

\u5728\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u5132\u5b58\u55ae\u5143\u70ba\u7bc0\u9ede TreeNode \uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u6307\u6a19\u76f8\u9023\u7dda\u3002\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7684\u5404\u9805\u57fa\u672c\u64cd\u4f5c\u3002

\u90a3\u9ebc\uff0c\u6211\u5011\u80fd\u5426\u7528\u9663\u5217\u4f86\u8868\u793a\u4e8c\u5143\u6a39\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

\u5148\u5206\u6790\u4e00\u500b\u7c21\u55ae\u6848\u4f8b\u3002\u7d66\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u6211\u5011\u5c07\u6240\u6709\u7bc0\u9ede\u6309\u7167\u5c64\u5e8f\u8d70\u8a2a\u7684\u9806\u5e8f\u5132\u5b58\u5728\u4e00\u500b\u9663\u5217\u4e2d\uff0c\u5247\u6bcf\u500b\u7bc0\u9ede\u90fd\u5c0d\u61c9\u552f\u4e00\u7684\u9663\u5217\u7d22\u5f15\u3002

\u6839\u64da\u5c64\u5e8f\u8d70\u8a2a\u7684\u7279\u6027\uff0c\u6211\u5011\u53ef\u4ee5\u63a8\u5c0e\u51fa\u7236\u7bc0\u9ede\u7d22\u5f15\u8207\u5b50\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u201c\u5c0d\u6620\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(i\\) \uff0c\u5247\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 2\\) \u3002\u5716 7-12 \u5c55\u793a\u4e86\u5404\u500b\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u5c0d\u6620\u95dc\u4fc2\u3002

\u5716 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u5c0d\u6620\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u7576\u65bc\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u7d66\u5b9a\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u7bc0\u9ede\uff0c\u6211\u5011\u90fd\u53ef\u4ee5\u900f\u904e\u5c0d\u6620\u516c\u5f0f\u4f86\u8a2a\u554f\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3002

"},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u5143\u6a39","text":"

\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u4e00\u500b\u7279\u4f8b\uff0c\u5728\u4e8c\u5143\u6a39\u7684\u4e2d\u9593\u5c64\u901a\u5e38\u5b58\u5728\u8a31\u591a None \u3002\u7531\u65bc\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e26\u4e0d\u5305\u542b\u9019\u4e9b None \uff0c\u56e0\u6b64\u6211\u5011\u7121\u6cd5\u50c5\u6191\u8a72\u5e8f\u5217\u4f86\u63a8\u6e2c None \u7684\u6578\u91cf\u548c\u5206\u4f48\u4f4d\u7f6e\u3002\u9019\u610f\u5473\u8457\u5b58\u5728\u591a\u7a2e\u4e8c\u5143\u6a39\u7d50\u69cb\u90fd\u7b26\u5408\u8a72\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002

\u5982\u5716 7-13 \u6240\u793a\uff0c\u7d66\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u4e0a\u8ff0\u9663\u5217\u8868\u793a\u65b9\u6cd5\u5df2\u7d93\u5931\u6548\u3002

\u5716 7-13 \u00a0 \u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c0d\u61c9\u591a\u7a2e\u4e8c\u5143\u6a39\u53ef\u80fd\u6027

\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e2d\u986f\u5f0f\u5730\u5beb\u51fa\u6240\u6709 None \u3002\u5982\u5716 7-14 \u6240\u793a\uff0c\u9019\u6a23\u8655\u7406\u5f8c\uff0c\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u5143\u6a39\u4e86\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
# \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\n# \u4f7f\u7528 None \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6a19\u8a18\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88dd\u985e\u5225 Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 any \u578b\u5225\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 None \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6a19\u8a18\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u7bc0\u9ede\u503c\u4e0d\u80fd\u70ba INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
/* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
### \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a ###\n# \u4f7f\u7528 nil \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
\n

\u5716 7-14 \u00a0 \u4efb\u610f\u578b\u5225\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u4f7f\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u56de\u9867\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u5b9a\u7fa9\uff0cNone \u53ea\u51fa\u73fe\u5728\u6700\u5e95\u5c64\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73fe\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u672b\u5c3e\u3002

\u9019\u610f\u5473\u8457\u4f7f\u7528\u9663\u5217\u8868\u793a\u5b8c\u5168\u4e8c\u5143\u6a39\u6642\uff0c\u53ef\u4ee5\u7701\u7565\u5132\u5b58\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u5716 7-15 \u7d66\u51fa\u4e86\u4e00\u500b\u4f8b\u5b50\u3002

\u5716 7-15 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u68f5\u57fa\u65bc\u9663\u5217\u8868\u793a\u7684\u4e8c\u5143\u6a39\uff0c\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u64cd\u4f5c\u3002

  • \u7d66\u5b9a\u67d0\u7bc0\u9ede\uff0c\u7372\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3001\u7236\u7bc0\u9ede\u3002
  • \u7372\u53d6\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u3001\u5f8c\u5e8f\u8d70\u8a2a\u3001\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
class ArrayBinaryTree:\n    \"\"\"\u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
array_binary_tree.cpp
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
array_binary_tree.java
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.cs
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
array_binary_tree.go
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
array_binary_tree.swift
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u5efa\u69cb\u5b50 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
array_binary_tree.js
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    #dfs(i, order, res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.ts
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
array_binary_tree.dart
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u4e32\u5217\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c64\u5e8f\u8d70\u8a2a */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u8d70\u8a2a */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u8d70\u8a2a */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u5f8c\u5e8f\u8d70\u8a2a */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
array_binary_tree.rs
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
array_binary_tree.c
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u5efa\u69cb\u5b50 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
array_binary_tree.kt
/* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
array_binary_tree.rb
### \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 ###\nclass ArrayBinaryTree\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u4e32\u5217\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c64\u5e8f\u8d70\u8a2a ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u5f8c\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u8d70\u8a2a ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u8d70\u8a2a ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u5f8c\u5e8f\u8d70\u8a2a ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
array_binary_tree.zig
[class]{ArrayBinaryTree}-[func]{}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

  • \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u5c0d\u5feb\u53d6\u53cb\u597d\uff0c\u8a2a\u554f\u8207\u8d70\u8a2a\u901f\u5ea6\u8f03\u5feb\u3002
  • \u4e0d\u9700\u8981\u5132\u5b58\u6307\u6a19\uff0c\u6bd4\u8f03\u7bc0\u7701\u7a7a\u9593\u3002
  • \u5141\u8a31\u96a8\u6a5f\u8a2a\u554f\u7bc0\u9ede\u3002

\u7136\u800c\uff0c\u9663\u5217\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002

  • \u9663\u5217\u5132\u5b58\u9700\u8981\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u5132\u5b58\u8cc7\u6599\u91cf\u904e\u5927\u7684\u6a39\u3002
  • \u589e\u522a\u7bc0\u9ede\u9700\u8981\u900f\u904e\u9663\u5217\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u5be6\u73fe\uff0c\u6548\u7387\u8f03\u4f4e\u3002
  • \u7576\u4e8c\u5143\u6a39\u4e2d\u5b58\u5728\u5927\u91cf None \u6642\uff0c\u9663\u5217\u4e2d\u5305\u542b\u7684\u7bc0\u9ede\u8cc7\u6599\u6bd4\u91cd\u8f03\u4f4e\uff0c\u7a7a\u9593\u5229\u7528\u7387\u8f03\u4f4e\u3002
"},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6a39 *","text":"

\u5728\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7ae0\u7bc0\u4e2d\u6211\u5011\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5c07\u5f9e \\(O(\\log n)\\) \u52a3\u5316\u70ba \\(O(n)\\) \u3002

\u5982\u5716 7-24 \u6240\u793a\uff0c\u7d93\u904e\u5169\u6b21\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\uff0c\u9019\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\u4fbf\u6703\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002

\u5716 7-24 \u00a0 AVL \u6a39\u5728\u522a\u9664\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

\u518d\u4f8b\u5982\uff0c\u5728\u5716 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u5169\u500b\u7bc0\u9ede\u5f8c\uff0c\u6a39\u5c07\u56b4\u91cd\u5411\u5de6\u50be\u659c\uff0c\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u96a8\u4e4b\u52a3\u5316\u3002

\u5716 7-25 \u00a0 AVL \u6a39\u5728\u63d2\u5165\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8ad6\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6a39\u3002\u8ad6\u6587\u4e2d\u8a73\u7d30\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u78ba\u4fdd\u5728\u6301\u7e8c\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u4e0d\u6703\u9000\u5316\uff0c\u5f9e\u800c\u4f7f\u5f97\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7d1a\u5225\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u5728\u9700\u8981\u983b\u7e41\u9032\u884c\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u5834\u666f\u4e2d\uff0cAVL \u6a39\u80fd\u59cb\u7d42\u4fdd\u6301\u9ad8\u6548\u7684\u8cc7\u6599\u64cd\u4f5c\u6548\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u61c9\u7528\u50f9\u503c\u3002

"},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6a39\u5e38\u898b\u8853\u8a9e","text":"

AVL \u6a39\u65e2\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u5143\u6a39\uff0c\u540c\u6642\u6eff\u8db3\u9019\u5169\u985e\u4e8c\u5143\u6a39\u7684\u6240\u6709\u6027\u8cea\uff0c\u56e0\u6b64\u662f\u4e00\u7a2e\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff08balanced binary search tree\uff09\u3002

"},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u7bc0\u9ede\u9ad8\u5ea6","text":"

\u7531\u65bc AVL \u6a39\u7684\u76f8\u95dc\u64cd\u4f5c\u9700\u8981\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u70ba\u7bc0\u9ede\u985e\u5225\u65b0\u589e height \u8b8a\u6578\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"AVL \u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u7bc0\u9ede\u503c\n        self.height: int = 0                # \u7bc0\u9ede\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nstruct TreeNode {\n    int val{};          // \u7bc0\u9ede\u503c\n    int height = 0;     // \u7bc0\u9ede\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u7bc0\u9ede\n    TreeNode *right{};  // \u53f3\u5b50\u7bc0\u9ede\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    public int val;        // \u7bc0\u9ede\u503c\n    public int height;     // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u7bc0\u9ede\n    public TreeNode right; // \u53f3\u5b50\u7bc0\u9ede\n    public TreeNode(int x) { val = x; }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val    int       // \u7bc0\u9ede\u503c\n    Height int       // \u7bc0\u9ede\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var height: Int // \u7bc0\u9ede\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    height; //\u7bc0\u9ede\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;            // \u7bc0\u9ede\u503c\n    height: number;         // \u7bc0\u9ede\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right: TreeNode | null; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    height: i32,                            // \u7bc0\u9ede\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val height: Int = 0          // \u7bc0\u9ede\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\n}\n
### AVL \u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :height # \u7bc0\u9ede\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
\n

\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u662f\u6307\u5f9e\u8a72\u7bc0\u9ede\u5230\u5b83\u7684\u6700\u9060\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u5373\u6240\u7d93\u904e\u7684\u201c\u908a\u201d\u7684\u6578\u91cf\u3002\u9700\u8981\u7279\u5225\u6ce8\u610f\u7684\u662f\uff0c\u8449\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(0\\) \uff0c\u800c\u7a7a\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(-1\\) \u3002\u6211\u5011\u5c07\u5efa\u7acb\u5169\u500b\u5de5\u5177\u51fd\u5f0f\uff0c\u5206\u5225\u7528\u65bc\u7372\u53d6\u548c\u66f4\u65b0\u7bc0\u9ede\u7684\u9ad8\u5ea6\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
avl_tree.cpp
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
avl_tree.java
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.cs
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
avl_tree.go
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
avl_tree.swift
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
avl_tree.js
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.ts
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
avl_tree.dart
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
avl_tree.rs
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
avl_tree.c
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
avl_tree.kt
/* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
avl_tree.rb
### \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
avl_tree.zig
// \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
"},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50","text":"

\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u7fa9\u70ba\u7bc0\u9ede\u5de6\u5b50\u6a39\u7684\u9ad8\u5ea6\u6e1b\u53bb\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\uff0c\u540c\u6642\u898f\u5b9a\u7a7a\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u70ba \\(0\\) \u3002\u6211\u5011\u540c\u6a23\u5c07\u7372\u53d6\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node is None:\n        return 0\n    # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
avl_tree.cpp
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == nullptr)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.java
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
avl_tree.cs
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
avl_tree.go
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node == nil {\n        return 0\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
avl_tree.swift
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    guard let node = node else { return 0 }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
avl_tree.js
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.ts
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
avl_tree.dart
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  if (node == null) return 0;\n  // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
avl_tree.rs
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n        None => 0,\n        // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
avl_tree.c
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
avl_tree.kt
/* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
avl_tree.rb
### \u7372\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  return 0 if node.nil?\n\n  # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
avl_tree.zig
// \u7372\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

Tip

\u8a2d\u5e73\u8861\u56e0\u5b50\u70ba \\(f\\) \uff0c\u5247\u4e00\u68f5 AVL \u6a39\u7684\u4efb\u610f\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6eff\u8db3 \\(-1 \\le f \\le 1\\) \u3002

"},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6a39\u65cb\u8f49","text":"

AVL \u6a39\u7684\u7279\u9ede\u5728\u65bc\u201c\u65cb\u8f49\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u5920\u5728\u4e0d\u5f71\u97ff\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u65cb\u8f49\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7684\u6027\u8cea\uff0c\u4e5f\u80fd\u4f7f\u6a39\u91cd\u65b0\u8b8a\u70ba\u201c\u5e73\u8861\u4e8c\u5143\u6a39\u201d\u3002

\u6211\u5011\u5c07\u5e73\u8861\u56e0\u5b50\u7d55\u5c0d\u503c \\(> 1\\) \u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5931\u8861\u7bc0\u9ede\u201d\u3002\u6839\u64da\u7bc0\u9ede\u5931\u8861\u60c5\u6cc1\u7684\u4e0d\u540c\uff0c\u65cb\u8f49\u64cd\u4f5c\u5206\u70ba\u56db\u7a2e\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3002\u4e0b\u9762\u8a73\u7d30\u4ecb\u7d39\u9019\u4e9b\u65cb\u8f49\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

\u5982\u5716 7-26 \u6240\u793a\uff0c\u7bc0\u9ede\u4e0b\u65b9\u70ba\u5e73\u8861\u56e0\u5b50\u3002\u5f9e\u5e95\u81f3\u9802\u770b\uff0c\u4e8c\u5143\u6a39\u4e2d\u9996\u500b\u5931\u8861\u7bc0\u9ede\u662f\u201c\u7bc0\u9ede 3\u201d\u3002\u6211\u5011\u95dc\u6ce8\u4ee5\u8a72\u5931\u8861\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\uff0c\u5c07\u8a72\u7bc0\u9ede\u8a18\u70ba node \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u8a18\u70ba child \uff0c\u57f7\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u5f8c\uff0c\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\uff0c\u4e26\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u3002

<1><2><3><4>

\u5716 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9a5f

\u5982\u5716 7-27 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u53f3\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u5de6\u5b50\u7bc0\u9ede\u3002

\u5716 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

\u201c\u5411\u53f3\u65cb\u8f49\u201d\u662f\u4e00\u7a2e\u5f62\u8c61\u5316\u7684\u8aaa\u6cd5\uff0c\u5be6\u969b\u4e0a\u9700\u8981\u900f\u904e\u4fee\u6539\u7bc0\u9ede\u6307\u6a19\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n
avl_tree.cpp
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.java
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.cs
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.go
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.swift
/* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.js
/* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.ts
/* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.dart
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return child;\n}\n
avl_tree.rs
/* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.kt
/* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.rb
### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  child\nend\n
avl_tree.zig
// \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

\u76f8\u61c9\u5730\uff0c\u5982\u679c\u8003\u616e\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u201c\u6620\u8c61\u201d\uff0c\u5247\u9700\u8981\u57f7\u884c\u5716 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

\u5716 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

\u540c\u7406\uff0c\u5982\u5716 7-29 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u5de6\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u53f3\u5b50\u7bc0\u9ede\u3002

\u5716 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

\u53ef\u4ee5\u89c0\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u908f\u8f2f\u4e0a\u662f\u6620\u8c61\u5c0d\u7a31\u7684\uff0c\u5b83\u5011\u5206\u5225\u89e3\u6c7a\u7684\u5169\u7a2e\u5931\u8861\u60c5\u6cc1\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u57fa\u65bc\u5c0d\u7a31\u6027\uff0c\u6211\u5011\u53ea\u9700\u5c07\u53f3\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u63db\u70ba right \uff0c\u5c07\u6240\u6709\u7684 right \u66ff\u63db\u70ba left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n
avl_tree.cpp
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.java
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.cs
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.go
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.swift
/* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.js
/* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.ts
/* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.dart
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return child;\n}\n
avl_tree.rs
/* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(child)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
avl_tree.kt
/* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
avl_tree.rb
### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  child\nend\n
avl_tree.zig
// \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
"},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb","text":"

\u5c0d\u65bc\u5716 7-30 \u4e2d\u7684\u5931\u8861\u7bc0\u9ede 3 \uff0c\u50c5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u7121\u6cd5\u4f7f\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\u3002\u6b64\u6642\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u53f3\u65cb\u201d\u3002

\u5716 7-30 \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb

"},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb","text":"

\u5982\u5716 7-31 \u6240\u793a\uff0c\u5c0d\u65bc\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u6620\u8c61\u60c5\u6cc1\uff0c\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u5de6\u65cb\u201d\u3002

\u5716 7-31 \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

"},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f49\u7684\u9078\u64c7","text":"

\u5716 7-32 \u5c55\u793a\u7684\u56db\u7a2e\u5931\u8861\u60c5\u6cc1\u8207\u4e0a\u8ff0\u6848\u4f8b\u9010\u500b\u5c0d\u61c9\uff0c\u5206\u5225\u9700\u8981\u63a1\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

\u5716 7-32 \u00a0 AVL \u6a39\u7684\u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1

\u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u5011\u900f\u904e\u5224\u65b7\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f03\u9ad8\u4e00\u5074\u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8ca0\u865f\uff0c\u4f86\u78ba\u5b9a\u5931\u8861\u7bc0\u9ede\u5c6c\u65bc\u5716 7-32 \u4e2d\u7684\u54ea\u7a2e\u60c5\u6cc1\u3002

\u8868 7-3 \u00a0 \u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1\u7684\u9078\u64c7\u689d\u4ef6

\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u61c9\u63a1\u7528\u7684\u65cb\u8f49\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(<0\\) \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(>0\\) \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

\u70ba\u4e86\u4fbf\u65bc\u4f7f\u7528\uff0c\u6211\u5011\u5c07\u65cb\u8f49\u64cd\u4f5c\u5c01\u88dd\u6210\u4e00\u500b\u51fd\u5f0f\u3002\u6709\u4e86\u9019\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u5c31\u80fd\u5c0d\u5404\u7a2e\u5931\u8861\u60c5\u6cc1\u9032\u884c\u65cb\u8f49\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\"\"\"\n    # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6a39\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6a39\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
avl_tree.cpp
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.java
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.cs
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.go
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u85a6\u77ed\u8b8a\u6578\uff0c\u9019\u88e1 bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.swift
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6a39\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.js
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n#rotate(node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.ts
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.dart
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6a39\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6a39\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
avl_tree.rs
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6a39\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6a39\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
avl_tree.c
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
avl_tree.kt
/* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
avl_tree.rb
### \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 ###\ndef rotate(node)\n  # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6a39\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6a39\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
avl_tree.zig
// \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6a39\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

AVL \u6a39\u7684\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u5728\u4e3b\u9ad4\u4e0a\u985e\u4f3c\u3002\u552f\u4e00\u7684\u5340\u5225\u5728\u65bc\uff0c\u5728 AVL \u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede\u5f8c\uff0c\u5f9e\u8a72\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u53ef\u80fd\u6703\u51fa\u73fe\u4e00\u7cfb\u5217\u5931\u8861\u7bc0\u9ede\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u5f9e\u9019\u500b\u7bc0\u9ede\u958b\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def insert(self, val):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.java
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.cs
/* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.go
/* \u63d2\u5165\u7bc0\u9ede */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.swift
/* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.js
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.ts
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.dart
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
avl_tree.rs
/* \u63d2\u5165\u7bc0\u9ede */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
avl_tree.c
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.kt
/* \u63d2\u5165\u7bc0\u9ede */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.rb
### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u985e\u4f3c\u5730\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u522a\u9664\u7bc0\u9ede\u65b9\u6cd5\u7684\u57fa\u790e\u4e0a\uff0c\u9700\u8981\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
def remove(self, val: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
avl_tree.cpp
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.java
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.cs
/* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.go
/* \u522a\u9664\u7bc0\u9ede */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.swift
/* \u522a\u9664\u7bc0\u9ede */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.js
/* \u522a\u9664\u7bc0\u9ede */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.ts
/* \u522a\u9664\u7bc0\u9ede */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.dart
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
avl_tree.rs
/* \u522a\u9664\u7bc0\u9ede */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => None,\n    }\n}\n
avl_tree.c
/* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
avl_tree.kt
/* \u522a\u9664\u7bc0\u9ede */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
avl_tree.rb
### \u522a\u9664\u7bc0\u9ede ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      node = child\n    else\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\n
avl_tree.zig
// \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
"},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

AVL \u6a39\u7684\u7bc0\u9ede\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

"},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6a39\u5178\u578b\u61c9\u7528","text":"
  • \u7d44\u7e54\u548c\u5132\u5b58\u5927\u578b\u8cc7\u6599\uff0c\u9069\u7528\u65bc\u9ad8\u983b\u67e5\u8a62\u3001\u4f4e\u983b\u589e\u522a\u7684\u5834\u666f\u3002
  • \u7528\u65bc\u69cb\u5efa\u8cc7\u6599\u5eab\u4e2d\u7684\u7d22\u5f15\u7cfb\u7d71\u3002
  • \u7d05\u9ed1\u6a39\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\u3002\u76f8\u8f03\u65bc AVL \u6a39\uff0c\u7d05\u9ed1\u6a39\u7684\u5e73\u8861\u689d\u4ef6\u66f4\u5bec\u9b06\uff0c\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u6240\u9700\u7684\u65cb\u8f49\u64cd\u4f5c\u66f4\u5c11\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
"},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39","text":"

\u5982\u5716 7-16 \u6240\u793a\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\uff08binary search tree\uff09\u6eff\u8db3\u4ee5\u4e0b\u689d\u4ef6\u3002

  1. \u5c0d\u65bc\u6839\u7bc0\u9ede\uff0c\u5de6\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c \\(<\\) \u6839\u7bc0\u9ede\u7684\u503c \\(<\\) \u53f3\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c\u3002
  2. \u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u3001\u53f3\u5b50\u6a39\u4e5f\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5373\u540c\u6a23\u6eff\u8db3\u689d\u4ef6 1. \u3002

\u5716 7-16 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39

"},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u64cd\u4f5c","text":"

\u6211\u5011\u5c07\u4e8c\u5143\u641c\u5c0b\u6a39\u5c01\u88dd\u70ba\u4e00\u500b\u985e\u5225 BinarySearchTree \uff0c\u4e26\u5ba3\u544a\u4e00\u500b\u6210\u54e1\u8b8a\u6578 root \uff0c\u6307\u5411\u6a39\u7684\u6839\u7bc0\u9ede\u3002

"},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

\u7d66\u5b9a\u76ee\u6a19\u7bc0\u9ede\u503c num \uff0c\u53ef\u4ee5\u6839\u64da\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u4f86\u67e5\u8a62\u3002\u5982\u5716 7-17 \u6240\u793a\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u7bc0\u9ede cur \uff0c\u5f9e\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede root \u51fa\u767c\uff0c\u8ff4\u5708\u6bd4\u8f03\u7bc0\u9ede\u503c cur.val \u548c num \u4e4b\u9593\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

  • \u82e5 cur.val < num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.right \u3002
  • \u82e5 cur.val > num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.left \u3002
  • \u82e5 cur.val = num \uff0c\u8aaa\u660e\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\u4e26\u8fd4\u56de\u8a72\u7bc0\u9ede\u3002
<1><2><3><4>

\u5716 7-17 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7bc0\u9ede\u793a\u4f8b

\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f2a\u6392\u9664\u4e00\u534a\u60c5\u6cc1\u3002\u8ff4\u5708\u6b21\u6578\u6700\u591a\u70ba\u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff0c\u7576\u4e8c\u5143\u6a39\u5e73\u8861\u6642\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u8a62\u7bc0\u9ede\"\"\"\n    cur = self._root\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else:\n            break\n    return cur\n
binary_search_tree.cpp
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.java
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.cs
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.go
/* \u67e5\u8a62\u7bc0\u9ede */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return node\n}\n
binary_search_tree.swift
/* \u67e5\u8a62\u7bc0\u9ede */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
binary_search_tree.js
/* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num) {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.ts
/* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.dart
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n  return cur;\n}\n
binary_search_tree.rs
/* \u67e5\u8a62\u7bc0\u9ede */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    cur\n}\n
binary_search_tree.c
/* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
binary_search_tree.kt
/* \u67e5\u8a62\u7bc0\u9ede */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
binary_search_tree.rb
### \u67e5\u8a62\u7bc0\u9ede ###\ndef search(num)\n  cur = @root\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break\n    end\n  end\n\n  cur\nend\n
binary_search_tree.zig
// \u67e5\u8a62\u7bc0\u9ede\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

\u7d66\u5b9a\u4e00\u500b\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u70ba\u4e86\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-18 \u6240\u793a\u3002

  1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\uff1a\u8207\u67e5\u8a62\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5f9e\u6839\u7bc0\u9ede\u51fa\u767c\uff0c\u6839\u64da\u7576\u524d\u7bc0\u9ede\u503c\u548c num \u7684\u5927\u5c0f\u95dc\u4fc2\u8ff4\u5708\u5411\u4e0b\u641c\u5c0b\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\uff08\u8d70\u8a2a\u81f3 None \uff09\u6642\u8df3\u51fa\u8ff4\u5708\u3002
  2. \u5728\u8a72\u4f4d\u7f6e\u63d2\u5165\u7bc0\u9ede\uff1a\u521d\u59cb\u5316\u7bc0\u9ede num \uff0c\u5c07\u8a72\u7bc0\u9ede\u7f6e\u65bc None \u7684\u4f4d\u7f6e\u3002

\u5716 7-18 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede

\u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

  • \u4e8c\u5143\u641c\u5c0b\u6a39\u4e0d\u5141\u8a31\u5b58\u5728\u91cd\u8907\u7bc0\u9ede\uff0c\u5426\u5247\u5c07\u9055\u53cd\u5176\u5b9a\u7fa9\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u7bc0\u9ede\u5728\u6a39\u4e2d\u5df2\u5b58\u5728\uff0c\u5247\u4e0d\u57f7\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
  • \u70ba\u4e86\u5be6\u73fe\u63d2\u5165\u7bc0\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u7bc0\u9ede pre \u5132\u5b58\u4e0a\u4e00\u8f2a\u8ff4\u5708\u7684\u7bc0\u9ede\u3002\u9019\u6a23\u5728\u8d70\u8a2a\u81f3 None \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u7372\u53d6\u5230\u5176\u7236\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b8c\u6210\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u3002
PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u7bc0\u9ede\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
binary_search_tree.cpp
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
binary_search_tree.java
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
binary_search_tree.cs
/* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
binary_search_tree.go
/* \u63d2\u5165\u7bc0\u9ede */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
binary_search_tree.swift
/* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
binary_search_tree.js
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
binary_search_tree.ts
/* \u63d2\u5165\u7bc0\u9ede */\ninsert(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
binary_search_tree.dart
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u7bc0\u9ede\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
binary_search_tree.rs
/* \u63d2\u5165\u7bc0\u9ede */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
binary_search_tree.c
/* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
binary_search_tree.kt
/* \u63d2\u5165\u7bc0\u9ede */\nfun insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
binary_search_tree.rb
### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u7bc0\u9ede\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
binary_search_tree.zig
// \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

\u8207\u67e5\u8a62\u7bc0\u9ede\u76f8\u540c\uff0c\u63d2\u5165\u7bc0\u9ede\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002

"},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

\u5148\u5728\u4e8c\u5143\u6a39\u4e2d\u67e5\u8a62\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u518d\u5c07\u5176\u522a\u9664\u3002\u8207\u63d2\u5165\u7bc0\u9ede\u985e\u4f3c\uff0c\u6211\u5011\u9700\u8981\u4fdd\u8b49\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\u4ecd\u7136\u6eff\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6839\u64da\u76ee\u6a19\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u6578\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u7a2e\u60c5\u6cc1\uff0c\u57f7\u884c\u5c0d\u61c9\u7684\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u3002

\u5982\u5716 7-19 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \u6642\uff0c\u8868\u793a\u8a72\u7bc0\u9ede\u662f\u8449\u7bc0\u9ede\uff0c\u53ef\u4ee5\u76f4\u63a5\u522a\u9664\u3002

\u5716 7-19 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 0 \uff09

\u5982\u5716 7-20 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(1\\) \u6642\uff0c\u5c07\u5f85\u522a\u9664\u7bc0\u9ede\u66ff\u63db\u70ba\u5176\u5b50\u7bc0\u9ede\u5373\u53ef\u3002

\u5716 7-20 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 1 \uff09

\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(2\\) \u6642\uff0c\u6211\u5011\u7121\u6cd5\u76f4\u63a5\u522a\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u500b\u7bc0\u9ede\u66ff\u63db\u8a72\u7bc0\u9ede\u3002\u7531\u65bc\u8981\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u56e0\u6b64\u9019\u500b\u7bc0\u9ede\u53ef\u4ee5\u662f\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\u6216\u5de6\u5b50\u6a39\u7684\u6700\u5927\u7bc0\u9ede\u3002

\u5047\u8a2d\u6211\u5011\u9078\u64c7\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\uff08\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\uff0c\u5247\u522a\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-21 \u6240\u793a\u3002

  1. \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\u5728\u201c\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff0c\u8a18\u70ba tmp \u3002
  2. \u7528 tmp \u7684\u503c\u8986\u84cb\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u503c\uff0c\u4e26\u5728\u6a39\u4e2d\u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp \u3002
<1><2><3><4>

\u5716 7-21 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 2 \uff09

\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u540c\u6a23\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\uff0c\u5176\u4e2d\u67e5\u8a62\u5f85\u522a\u9664\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\uff0c\u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u5f8c\u7e7c\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
def remove(self, num: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        child = cur.left or cur.right\n        # \u522a\u9664\u7bc0\u9ede cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            self._root = child\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else:\n        # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val\n
binary_search_tree.cpp
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete cur;\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.java
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.cs
/* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode? child = cur.left ?? cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.go
/* \u522a\u9664\u7bc0\u9ede */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u53f3\u5b50\u6a39\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u5de6\u5b50\u6a39\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u70ba 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u522a\u9664\u7bc0\u9ede cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            bst.root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u70ba 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5f85\u522a\u9664\u7bc0\u9ede cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u84cb cur\n        cur.Val = tmp.Val\n    }\n}\n
binary_search_tree.swift
/* \u522a\u9664\u7bc0\u9ede */\nfunc remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        let child = cur?.left ?? cur?.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur?.val = tmp!.val\n    }\n}\n
binary_search_tree.js
/* \u522a\u9664\u7bc0\u9ede */\nremove(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
binary_search_tree.ts
/* \u522a\u9664\u7bc0\u9ede */\nremove(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp!.val;\n    }\n}\n
binary_search_tree.dart
/* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    TreeNode? child = cur.left ?? cur.right;\n    // \u522a\u9664\u7bc0\u9ede cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      _root = child;\n    }\n  } else {\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val;\n  }\n}\n
binary_search_tree.rs
/* \u522a\u9664\u7bc0\u9ede */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u522a\u9664\u7bc0\u9ede cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n                self.root = child;\n            }\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
binary_search_tree.c
/* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65b7\u5f85\u522a\u9664\u7bc0\u9ede\u662f\u5426\u5b58\u5728\u5b50\u7bc0\u9ede\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1 */\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(cur);\n    } else {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 2 */\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
binary_search_tree.kt
/* \u522a\u9664\u7bc0\u9ede */\nfun remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur._val = tmp._val\n    }\n}\n
binary_search_tree.rb
### \u522a\u9664\u7bc0\u9ede ###\ndef remove(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    child = cur.left || cur.right\n    # \u522a\u9664\u7bc0\u9ede cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      @root = child\n    end\n  # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n  else\n    # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val\n  end\nend\n
binary_search_tree.zig
// \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.?.val = tmp_val;\n    }\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u8d70\u8a2a\u6709\u5e8f","text":"

\u5982\u5716 7-22 \u6240\u793a\uff0c\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u8d70\u8a2a\u9806\u5e8f\uff0c\u800c\u4e8c\u5143\u641c\u5c0b\u6a39\u6eff\u8db3\u201c\u5de6\u5b50\u7bc0\u9ede \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u7bc0\u9ede\u201d\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

\u9019\u610f\u5473\u8457\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u9032\u884c\u4e2d\u5e8f\u8d70\u8a2a\u6642\uff0c\u7e3d\u662f\u6703\u512a\u5148\u8d70\u8a2a\u4e0b\u4e00\u500b\u6700\u5c0f\u7bc0\u9ede\uff0c\u5f9e\u800c\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u6027\u8cea\uff1a\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

\u5229\u7528\u4e2d\u5e8f\u8d70\u8a2a\u5347\u5e8f\u7684\u6027\u8cea\uff0c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u7372\u53d6\u6709\u5e8f\u8cc7\u6599\u50c5\u9700 \\(O(n)\\) \u6642\u9593\uff0c\u7121\u9808\u9032\u884c\u984d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

\u5716 7-22 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217

"},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387","text":"

\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528\u9663\u5217\u6216\u4e8c\u5143\u641c\u5c0b\u6a39\u5132\u5b58\u3002\u89c0\u5bdf\u8868 7-2 \uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u5404\u9805\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f\u5c0d\u6578\u968e\uff0c\u5177\u6709\u7a69\u5b9a\u4e14\u9ad8\u6548\u7684\u6548\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u983b\u65b0\u589e\u3001\u4f4e\u983b\u67e5\u8a62\u522a\u9664\u8cc7\u6599\u7684\u5834\u666f\u4e0b\uff0c\u9663\u5217\u6bd4\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387\u66f4\u9ad8\u3002

\u8868 7-2 \u00a0 \u9663\u5217\u8207\u641c\u5c0b\u6a39\u7684\u6548\u7387\u5c0d\u6bd4

\u7121\u5e8f\u9663\u5217 \u4e8c\u5143\u641c\u5c0b\u6a39 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

\u5728\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f2a\u8ff4\u5708\u5167\u67e5\u8a62\u4efb\u610f\u7bc0\u9ede\u3002

\u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u4e0d\u65b7\u5730\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\uff0c\u53ef\u80fd\u5c0e\u81f4\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u5716 7-23 \u6240\u793a\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u9019\u6642\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u6703\u9000\u5316\u70ba \\(O(n)\\) \u3002

\u5716 7-23 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316

"},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u5e38\u898b\u61c9\u7528","text":"
  • \u7528\u4f5c\u7cfb\u7d71\u4e2d\u7684\u591a\u7d1a\u7d22\u5f15\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u67e5\u8a62\u3001\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u3002
  • \u4f5c\u70ba\u67d0\u4e9b\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002
  • \u7528\u65bc\u5132\u5b58\u8cc7\u6599\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72c0\u614b\u3002
"},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u5143\u6a39","text":"

\u4e8c\u5143\u6a39\uff08binary tree\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u4e8c\u5143\u6a39\u7684\u57fa\u672c\u55ae\u5143\u662f\u7bc0\u9ede\uff0c\u6bcf\u500b\u7bc0\u9ede\u5305\u542b\u503c\u3001\u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\u548c\u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
class TreeNode:\n    \"\"\"\u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    int val;          // \u7bc0\u9ede\u503c\n    TreeNode *left;   // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode *right;  // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    int val;         // \u7bc0\u9ede\u503c\n    TreeNode left;   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u5efa\u69cb\u5b50 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n        Right: nil, // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n        Val:   v,   // \u7bc0\u9ede\u503c\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct TreeNode {\n    int val;                // \u7bc0\u9ede\u503c\n    int height;             // \u7bc0\u9ede\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    struct TreeNode *right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
### \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
\n

\u6bcf\u500b\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u5206\u5225\u6307\u5411\u5de6\u5b50\u7bc0\u9ede\uff08left-child node\uff09\u548c\u53f3\u5b50\u7bc0\u9ede\uff08right-child node\uff09\uff0c\u8a72\u7bc0\u9ede\u88ab\u7a31\u70ba\u9019\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff08parent node\uff09\u3002\u7576\u7d66\u5b9a\u4e00\u500b\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6642\uff0c\u6211\u5011\u5c07\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6a39\uff08right subtree\uff09\u3002

\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u9664\u8449\u7bc0\u9ede\u5916\uff0c\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\u90fd\u5305\u542b\u5b50\u7bc0\u9ede\u548c\u975e\u7a7a\u5b50\u6a39\u3002\u5982\u5716 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c07\u201c\u7bc0\u9ede 2\u201d\u8996\u70ba\u7236\u7bc0\u9ede\uff0c\u5247\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u5206\u5225\u662f\u201c\u7bc0\u9ede 4\u201d\u548c\u201c\u7bc0\u9ede 5\u201d\uff0c\u5de6\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 4 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\uff0c\u53f3\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 5 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\u3002

\u5716 7-1 \u00a0 \u7236\u7bc0\u9ede\u3001\u5b50\u7bc0\u9ede\u3001\u5b50\u6a39

"},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u5143\u6a39\u5e38\u898b\u8853\u8a9e","text":"

\u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e\u5982\u5716 7-2 \u6240\u793a\u3002

  • \u6839\u7bc0\u9ede\uff08root node\uff09\uff1a\u4f4d\u65bc\u4e8c\u5143\u6a39\u9802\u5c64\u7684\u7bc0\u9ede\uff0c\u6c92\u6709\u7236\u7bc0\u9ede\u3002
  • \u8449\u7bc0\u9ede\uff08leaf node\uff09\uff1a\u6c92\u6709\u5b50\u7bc0\u9ede\u7684\u7bc0\u9ede\uff0c\u5176\u5169\u500b\u6307\u6a19\u5747\u6307\u5411 None \u3002
  • \u908a\uff08edge\uff09\uff1a\u9023\u7dda\u5169\u500b\u7bc0\u9ede\u7684\u7dda\u6bb5\uff0c\u5373\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002
  • \u7bc0\u9ede\u6240\u5728\u7684\u5c64\uff08level\uff09\uff1a\u5f9e\u9802\u81f3\u5e95\u905e\u589e\uff0c\u6839\u7bc0\u9ede\u6240\u5728\u5c64\u70ba 1 \u3002
  • \u7bc0\u9ede\u7684\u5ea6\uff08degree\uff09\uff1a\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u7684\u6578\u91cf\u3002\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u7bc4\u570d\u662f 0\u30011\u30012 \u3002
  • \u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u6700\u9060\u8449\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
  • \u7bc0\u9ede\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
  • \u7bc0\u9ede\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u8ddd\u96e2\u8a72\u7bc0\u9ede\u6700\u9060\u7684\u8449\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002

\u5716 7-2 \u00a0 \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e

Tip

\u8acb\u6ce8\u610f\uff0c\u6211\u5011\u901a\u5e38\u5c07\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u984c\u76ee\u6216\u6559\u6750\u53ef\u80fd\u6703\u5c07\u5176\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u7bc0\u9ede\u7684\u6578\u91cf\u201d\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

"},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u5143\u6a39\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u5143\u6a39","text":"

\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u7bc0\u9ede\uff0c\u7136\u5f8c\u69cb\u5efa\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.cpp
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.java
// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.cs
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.go
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
binary_tree.swift
// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.js
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.ts
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.dart
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
binary_tree.rs
// \u521d\u59cb\u5316\u7bc0\u9ede\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
binary_tree.c
/* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
binary_tree.kt
// \u521d\u59cb\u5316\u7bc0\u9ede\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.rb
# \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
binary_tree.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede","text":"

\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u53ef\u4ee5\u900f\u904e\u4fee\u6539\u6307\u6a19\u4f86\u5be6\u73fe\u3002\u5716 7-3 \u7d66\u51fa\u4e86\u4e00\u500b\u793a\u4f8b\u3002

\u5716 7-3 \u00a0 \u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
# \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = p\np.left = n2\n# \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.cpp
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
binary_tree.java
TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.cs
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.go
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.Left = n2\n
binary_tree.swift
let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.js
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.ts
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.dart
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
binary_tree.rs
let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u522a\u9664\u7bc0\u9ede p\nn1.borrow_mut().left = Some(n2);\n
binary_tree.c
/* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
binary_tree.kt
val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
binary_tree.rb
# \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede _p\nn1.left = _p\n_p.left = n2\n# \u522a\u9664\u7bc0\u9ede\nn1.left = n2\n
binary_tree.zig
\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u7bc0\u9ede\u53ef\u80fd\u6703\u6539\u8b8a\u4e8c\u5143\u6a39\u7684\u539f\u6709\u908f\u8f2f\u7d50\u69cb\uff0c\u800c\u522a\u9664\u7bc0\u9ede\u901a\u5e38\u610f\u5473\u8457\u522a\u9664\u8a72\u7bc0\u9ede\u53ca\u5176\u6240\u6709\u5b50\u6a39\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u63d2\u5165\u8207\u522a\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5be6\u73fe\u6709\u5be6\u969b\u610f\u7fa9\u7684\u64cd\u4f5c\u3002

"},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u898b\u4e8c\u5143\u6a39\u578b\u5225","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff08perfect binary tree\uff09\u6240\u6709\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u5b8c\u5168\u586b\u6eff\u3002\u5728\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\uff0c\u8449\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u7684\u5ea6\u90fd\u70ba \\(2\\) \uff1b\u82e5\u6a39\u7684\u9ad8\u5ea6\u70ba \\(h\\) \uff0c\u5247\u7bc0\u9ede\u7e3d\u6578\u70ba \\(2^{h+1} - 1\\) \uff0c\u5448\u73fe\u6a19\u6e96\u7684\u6307\u6578\u7d1a\u95dc\u4fc2\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u898b\u7684\u7d30\u80de\u5206\u88c2\u73fe\u8c61\u3002

Tip

\u8acb\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u7fa4\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u5e38\u88ab\u7a31\u70ba\u6eff\u4e8c\u5143\u6a39\u3002

\u5716 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c64\u7684\u7bc0\u9ede\u672a\u88ab\u586b\u6eff\uff0c\u4e14\u6700\u5e95\u5c64\u7bc0\u9ede\u5118\u91cf\u9760\u5de6\u586b\u5145\u3002

\u5716 7-5 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-6 \u6240\u793a\uff0c\u5b8c\u6eff\u4e8c\u5143\u6a39\uff08full binary tree\uff09\u9664\u4e86\u8449\u7bc0\u9ede\u4e4b\u5916\uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5b50\u7bc0\u9ede\u3002

\u5716 7-6 \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39","text":"

\u5982\u5716 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u5143\u6a39\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7d55\u5c0d\u503c\u4e0d\u8d85\u904e 1 \u3002

\u5716 7-7 \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39

"},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u5143\u6a39\u7684\u9000\u5316","text":"

\u5716 7-8 \u5c55\u793a\u4e86\u4e8c\u5143\u6a39\u7684\u7406\u60f3\u7d50\u69cb\u8207\u9000\u5316\u7d50\u69cb\u3002\u7576\u4e8c\u5143\u6a39\u7684\u6bcf\u5c64\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u6642\uff0c\u9054\u5230\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff1b\u800c\u7576\u6240\u6709\u7bc0\u9ede\u90fd\u504f\u5411\u4e00\u5074\u6642\uff0c\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u201c\u93c8\u7d50\u4e32\u5217\u201d\u3002

  • \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u7406\u60f3\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5145\u5206\u767c\u63ee\u4e8c\u5143\u6a39\u201c\u5206\u6cbb\u201d\u7684\u512a\u52e2\u3002
  • \u93c8\u7d50\u4e32\u5217\u5247\u662f\u53e6\u4e00\u500b\u6975\u7aef\uff0c\u5404\u9805\u64cd\u4f5c\u90fd\u8b8a\u70ba\u7dda\u6027\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

\u5716 7-8 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

\u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7d50\u69cb\u548c\u6700\u5dee\u7d50\u69cb\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf\u3001\u7bc0\u9ede\u7e3d\u6578\u3001\u9ad8\u5ea6\u7b49\u9054\u5230\u6975\u5927\u503c\u6216\u6975\u5c0f\u503c\u3002

\u8868 7-1 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

\u5b8c\u7f8e\u4e8c\u5143\u6a39 \u93c8\u7d50\u4e32\u5217 \u7b2c \\(i\\) \u5c64\u7684\u7bc0\u9ede\u6578\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u7bc0\u9ede\u7e3d\u6578 \\(2^{h+1} - 1\\) \\(h + 1\\) \u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \u7684\u6a39\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a","text":"

\u5f9e\u7269\u7406\u7d50\u69cb\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u6a39\u662f\u4e00\u7a2e\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u56e0\u6b64\u5176\u8d70\u8a2a\u65b9\u5f0f\u662f\u900f\u904e\u6307\u6a19\u9010\u500b\u8a2a\u554f\u7bc0\u9ede\u3002\u7136\u800c\uff0c\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9019\u4f7f\u5f97\u8d70\u8a2a\u6a39\u6bd4\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u66f4\u52a0\u8907\u96dc\uff0c\u9700\u8981\u85c9\u52a9\u641c\u5c0b\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u3002

\u4e8c\u5143\u6a39\u5e38\u898b\u7684\u8d70\u8a2a\u65b9\u5f0f\u5305\u62ec\u5c64\u5e8f\u8d70\u8a2a\u3001\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u7b49\u3002

"},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c64\u5e8f\u8d70\u8a2a","text":"

\u5982\u5716 7-9 \u6240\u793a\uff0c\u5c64\u5e8f\u8d70\u8a2a\uff08level-order traversal\uff09\u5f9e\u9802\u90e8\u5230\u5e95\u90e8\u9010\u5c64\u8d70\u8a2a\u4e8c\u5143\u6a39\uff0c\u4e26\u5728\u6bcf\u4e00\u5c64\u6309\u7167\u5f9e\u5de6\u5230\u53f3\u7684\u9806\u5e8f\u8a2a\u554f\u7bc0\u9ede\u3002

\u5c64\u5e8f\u8d70\u8a2a\u672c\u8cea\u4e0a\u5c6c\u65bc\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\uff08breadth-first traversal\uff09\uff0c\u4e5f\u7a31\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\u3002

\u5716 7-9 \u00a0 \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a

"},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u901a\u5e38\u85c9\u52a9\u201c\u4f47\u5217\u201d\u4f86\u5be6\u73fe\u3002\u4f47\u5217\u9075\u5faa\u201c\u5148\u9032\u5148\u51fa\u201d\u7684\u898f\u5247\uff0c\u800c\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5247\u9075\u5faa\u201c\u9010\u5c64\u63a8\u9032\u201d\u7684\u898f\u5247\uff0c\u5169\u8005\u80cc\u5f8c\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n    # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u968a\u5217\u51fa\u968a\n        res.append(node.val)  # \u5132\u5b58\u7bc0\u9ede\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    return res\n
binary_tree_bfs.cpp
/* \u5c64\u5e8f\u8d70\u8a2a */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u968a\u5217\u51fa\u968a\n        vec.push_back(node->val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return vec;\n}\n
binary_tree_bfs.java
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u968a\u5217\u51fa\u968a\n        list.add(node.val);           // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.cs
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u968a\u5217\u51fa\u968a\n        list.Add(node.val!.Value);       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.go
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u5207\u7247\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u968a\u5217\u51fa\u968a\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
binary_tree_bfs.swift
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u968a\u5217\u51fa\u968a\n        list.append(node.val) // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list\n}\n
binary_tree_bfs.js
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
binary_tree_bfs.ts
/* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list;\n}\n
binary_tree_bfs.dart
/* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u968a\u5217\u51fa\u968a\n    res.add(node!.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  }\n  return res;\n}\n
binary_tree_bfs.rs
/* \u5c64\u5e8f\u8d70\u8a2a */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u968a\u5217\u51fa\u968a\n        vec.push(node.borrow().val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        };\n    }\n    vec\n}\n
binary_tree_bfs.c
/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f14\u52a9\u4f47\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f14\u52a9\u4f47\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u4f47\u5217\u6307\u6a19\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u7bc0\u9ede\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    /* \u8f14\u52a9\u9663\u5217 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u9663\u5217\u6307\u6a19\n    index = 0;\n    while (front < rear) {\n        // \u968a\u5217\u51fa\u968a\n        node = queue[front++];\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u9663\u5217\u9577\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91cb\u653e\u8f14\u52a9\u9663\u5217\u7a7a\u9593\n    free(queue);\n    return arr;\n}\n
binary_tree_bfs.kt
/* \u5c64\u5e8f\u8d70\u8a2a */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u968a\u5217\u51fa\u968a\n        list.add(node?._val!!)       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list\n}\n
binary_tree_bfs.rb
### \u5c64\u5e8f\u8d70\u8a2a ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u968a\u5217\u51fa\u968a\n    res << node.val # \u5132\u5b58\u7bc0\u9ede\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  end\n  res\nend\n
binary_tree_bfs.zig
// \u5c64\u5e8f\u8d70\u8a2a\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u968a\u5217\u51fa\u968a\n        var node = queue_node.data;\n        try list.append(node.val);              // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }        \n    }\n    return list;\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

"},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff0c\u5176\u4e2d \\(n\\) \u70ba\u7bc0\u9ede\u6578\u91cf\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6eff\u4e8c\u5143\u6a39\u6642\uff0c\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u6700\u591a\u540c\u6642\u5b58\u5728 \\((n + 1) / 2\\) \u500b\u7bc0\u9ede\uff0c\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\u3002
"},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a","text":"

\u76f8\u61c9\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\uff08depth-first traversal\uff09\uff0c\u4e5f\u7a31\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff08depth-first search, DFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002

\u5716 7-10 \u5c55\u793a\u4e86\u5c0d\u4e8c\u5143\u6a39\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5c31\u50cf\u662f\u7e5e\u8457\u6574\u68f5\u4e8c\u5143\u6a39\u7684\u5916\u570d\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u500b\u7bc0\u9ede\u90fd\u6703\u9047\u5230\u4e09\u500b\u4f4d\u7f6e\uff0c\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u3002

\u5716 7-10 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a

"},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff1a

PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
binary_tree_dfs.cpp
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
binary_tree_dfs.java
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
binary_tree_dfs.cs
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
binary_tree_dfs.go
/* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
binary_tree_dfs.swift
/* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
binary_tree_dfs.js
/* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.ts
/* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
binary_tree_dfs.dart
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
binary_tree_dfs.rs
/* \u524d\u5e8f\u8d70\u8a2a */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
binary_tree_dfs.c
/* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
binary_tree_dfs.kt
/* \u524d\u5e8f\u8d70\u8a2a */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
binary_tree_dfs.rb
### \u524d\u5e8f\u8d70\u8a2a ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u8d70\u8a2a ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u5f8c\u5e8f\u8d70\u8a2a ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
binary_tree_dfs.zig
// \u524d\u5e8f\u8d70\u8a2a\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u8d70\u8a2a\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u5f8c\u5e8f\u8d70\u8a2a\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
\u8996\u89ba\u5316\u57f7\u884c

\u5168\u87a2\u5e55\u89c0\u770b >

Tip

\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4e5f\u53ef\u4ee5\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

\u5716 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u8d70\u8a2a\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5176\u53ef\u5206\u70ba\u201c\u905e\u201d\u548c\u201c\u8ff4\u201d\u5169\u500b\u9006\u5411\u7684\u90e8\u5206\u3002

  1. \u201c\u905e\u201d\u8868\u793a\u958b\u555f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5f0f\u5728\u6b64\u904e\u7a0b\u4e2d\u8a2a\u554f\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002
  2. \u201c\u8ff4\u201d\u8868\u793a\u51fd\u5f0f\u8fd4\u56de\uff0c\u4ee3\u8868\u7576\u524d\u7bc0\u9ede\u5df2\u7d93\u8a2a\u554f\u5b8c\u7562\u3002
<1><2><3><4><5><6><7><8><9><10><11>

\u5716 7-11 \u00a0 \u524d\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u904e\u7a0b

"},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
  • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
  • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u7cfb\u7d71\u4f54\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002
"},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
  • \u4e8c\u5143\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9ad4\u73fe\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u6bcf\u500b\u4e8c\u5143\u6a39\u7bc0\u9ede\u5305\u542b\u4e00\u500b\u503c\u4ee5\u53ca\u5169\u500b\u6307\u6a19\uff0c\u5206\u5225\u6307\u5411\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u3002
  • \u5c0d\u65bc\u4e8c\u5143\u6a39\u4e2d\u7684\u67d0\u500b\u7bc0\u9ede\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6a39\u88ab\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6a39\u3002
  • \u4e8c\u5143\u6a39\u7684\u76f8\u95dc\u8853\u8a9e\u5305\u62ec\u6839\u7bc0\u9ede\u3001\u8449\u7bc0\u9ede\u3001\u5c64\u3001\u5ea6\u3001\u908a\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
  • \u4e8c\u5143\u6a39\u7684\u521d\u59cb\u5316\u3001\u7bc0\u9ede\u63d2\u5165\u548c\u7bc0\u9ede\u522a\u9664\u64cd\u4f5c\u8207\u93c8\u7d50\u4e32\u5217\u64cd\u4f5c\u65b9\u6cd5\u985e\u4f3c\u3002
  • \u5e38\u898b\u7684\u4e8c\u5143\u6a39\u578b\u5225\u6709\u5b8c\u7f8e\u4e8c\u5143\u6a39\u3001\u5b8c\u5168\u4e8c\u5143\u6a39\u3001\u5b8c\u6eff\u4e8c\u5143\u6a39\u548c\u5e73\u8861\u4e8c\u5143\u6a39\u3002\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u6700\u7406\u60f3\u7684\u72c0\u614b\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u9000\u5316\u5f8c\u7684\u6700\u5dee\u72c0\u614b\u3002
  • \u4e8c\u5143\u6a39\u53ef\u4ee5\u7528\u9663\u5217\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c07\u7bc0\u9ede\u503c\u548c\u7a7a\u4f4d\u6309\u5c64\u5e8f\u8d70\u8a2a\u9806\u5e8f\u6392\u5217\uff0c\u4e26\u6839\u64da\u7236\u7bc0\u9ede\u8207\u5b50\u7bc0\u9ede\u4e4b\u9593\u7684\u7d22\u5f15\u5c0d\u6620\u95dc\u4fc2\u4f86\u5be6\u73fe\u6307\u6a19\u3002
  • \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a\u662f\u4e00\u7a2e\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u65b9\u6cd5\uff0c\u5b83\u9ad4\u73fe\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u900f\u904e\u4f47\u5217\u4f86\u5be6\u73fe\u3002
  • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u7686\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u5b83\u5011\u9ad4\u73fe\u4e86\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
  • \u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u4e00\u7a2e\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \u3002\u7576\u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u5404\u9805\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
  • AVL \u6a39\uff0c\u4e5f\u7a31\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5b83\u900f\u904e\u65cb\u8f49\u64cd\u4f5c\u78ba\u4fdd\u5728\u4e0d\u65b7\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\u6a39\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
  • AVL \u6a39\u7684\u65cb\u8f49\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u6703\u5f9e\u5e95\u5411\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002
"},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

Q\uff1a\u5c0d\u65bc\u53ea\u6709\u4e00\u500b\u7bc0\u9ede\u7684\u4e8c\u5143\u6a39\uff0c\u6a39\u7684\u9ad8\u5ea6\u548c\u6839\u7bc0\u9ede\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u55ce\uff1f

\u662f\u7684\uff0c\u56e0\u70ba\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\u3002

Q\uff1a\u4e8c\u5143\u6a39\u4e2d\u7684\u63d2\u5165\u8207\u522a\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u9019\u88e1\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u9ebc\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u70ba\u8cc7\u6e90\u7684\u5b50\u7bc0\u9ede\u7684\u8cc7\u6e90\u91cb\u653e\u55ce\uff1f

\u62ff\u4e8c\u5143\u641c\u5c0b\u6a39\u4f86\u8209\u4f8b\uff0c\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u8981\u5206\u4e09\u7a2e\u60c5\u6cc1\u8655\u7406\uff0c\u5176\u4e2d\u6bcf\u7a2e\u60c5\u6cc1\u90fd\u9700\u8981\u9032\u884c\u591a\u500b\u6b65\u9a5f\u7684\u7bc0\u9ede\u64cd\u4f5c\u3002

Q\uff1a\u70ba\u4ec0\u9ebc DFS \u8d70\u8a2a\u4e8c\u5143\u6a39\u6709\u524d\u3001\u4e2d\u3001\u5f8c\u4e09\u7a2e\u9806\u5e8f\uff0c\u5206\u5225\u6709\u4ec0\u9ebc\u7528\u5462\uff1f

\u8207\u9806\u5e8f\u548c\u9006\u5e8f\u8d70\u8a2a\u9663\u5217\u985e\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u662f\u4e09\u7a2e\u4e8c\u5143\u6a39\u8d70\u8a2a\u65b9\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5b83\u5011\u5f97\u5230\u4e00\u500b\u7279\u5b9a\u9806\u5e8f\u7684\u8d70\u8a2a\u7d50\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\uff0c\u7531\u65bc\u7bc0\u9ede\u5927\u5c0f\u6eff\u8db3 \u5de6\u5b50\u7bc0\u9ede\u503c < \u6839\u7bc0\u9ede\u503c < \u53f3\u5b50\u7bc0\u9ede\u503c \uff0c\u56e0\u6b64\u6211\u5011\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u512a\u5148\u9806\u5e8f\u8d70\u8a2a\u6a39\uff0c\u5c31\u53ef\u4ee5\u7372\u5f97\u6709\u5e8f\u7684\u7bc0\u9ede\u5e8f\u5217\u3002

Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u8655\u7406\u5931\u8861\u7bc0\u9ede node\u3001child\u3001grand_child \u4e4b\u9593\u7684\u95dc\u4fc2\uff0c\u90a3 node \u7684\u7236\u7bc0\u9ede\u548c node \u539f\u4f86\u7684\u9023\u7dda\u4e0d\u9700\u8981\u7dad\u8b77\u55ce\uff1f\u53f3\u65cb\u64cd\u4f5c\u5f8c\u8c48\u4e0d\u662f\u65b7\u6389\u4e86\uff1f

\u6211\u5011\u9700\u8981\u5f9e\u905e\u8ff4\u7684\u8996\u89d2\u4f86\u770b\u9019\u500b\u554f\u984c\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u50b3\u5165\u7684\u662f\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u6700\u7d42 return child \u8fd4\u56de\u65cb\u8f49\u4e4b\u5f8c\u7684\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u548c\u5176\u7236\u7bc0\u9ede\u7684\u9023\u7dda\u662f\u5728\u8a72\u51fd\u5f0f\u8fd4\u56de\u5f8c\u5b8c\u6210\u7684\uff0c\u4e0d\u5c6c\u65bc\u53f3\u65cb\u64cd\u4f5c\u7684\u7dad\u8b77\u7bc4\u570d\u3002

Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u5f0f\u88ab\u5283\u5206\u5230 private \u548c public \u4e2d\uff0c\u9019\u65b9\u9762\u6709\u4ec0\u9ebc\u8003\u91cf\u55ce\uff1f\u70ba\u4ec0\u9ebc\u8981\u5c07 height() \u51fd\u5f0f\u548c updateHeight() \u51fd\u5f0f\u5206\u5225\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

\u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u7bc4\u570d\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u985e\u5225\u5167\u90e8\u4f7f\u7528\uff0c\u90a3\u9ebc\u5c31\u8a2d\u8a08\u70ba private \u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u8005\u55ae\u7368\u547c\u53eb updateHeight() \u662f\u6c92\u6709\u610f\u7fa9\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8a2a\u554f\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u985e\u4f3c\u65bc vector.size() \uff0c\u56e0\u6b64\u8a2d\u5b9a\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

Q\uff1a\u5982\u4f55\u5f9e\u4e00\u7d44\u8f38\u5165\u8cc7\u6599\u69cb\u5efa\u4e00\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\uff1f\u6839\u7bc0\u9ede\u7684\u9078\u64c7\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

\u662f\u7684\uff0c\u69cb\u5efa\u6a39\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7a0b\u5f0f\u78bc\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7d66\u51fa\u3002\u81f3\u65bc\u6839\u7bc0\u9ede\u7684\u9078\u64c7\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u8f38\u5165\u8cc7\u6599\u6392\u5e8f\uff0c\u7136\u5f8c\u5c07\u4e2d\u9ede\u5143\u7d20\u4f5c\u70ba\u6839\u7bc0\u9ede\uff0c\u518d\u905e\u8ff4\u5730\u69cb\u5efa\u5de6\u53f3\u5b50\u6a39\u3002\u9019\u6a23\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8b49\u6a39\u7684\u5e73\u8861\u6027\u3002

Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u4e32\u5c0d\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

\u5728 Java \u4e2d\uff0c\u5c0d\u65bc\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c== \u7528\u65bc\u5c0d\u6bd4\u5169\u500b\u8b8a\u6578\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5c0d\u65bc\u5f15\u7528\u578b\u5225\uff0c\u5169\u7a2e\u7b26\u865f\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

  • == \uff1a\u7528\u4f86\u6bd4\u8f03\u5169\u500b\u8b8a\u6578\u662f\u5426\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u5373\u5b83\u5011\u5728\u8a18\u61b6\u9ad4\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
  • equals()\uff1a\u7528\u4f86\u5c0d\u6bd4\u5169\u500b\u7269\u4ef6\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5c0d\u6bd4\u503c\uff0c\u6211\u5011\u61c9\u8a72\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u900f\u904e String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u4e32\u90fd\u5132\u5b58\u5728\u5b57\u4e32\u5e38\u6578\u6c60\u4e2d\uff0c\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u4f86\u6bd4\u8f03\u5169\u500b\u5b57\u4e32\u7684\u5167\u5bb9\u3002

Q\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u7684\u7bc0\u9ede\u6578\u91cf\u662f \\(2^h\\) \u55ce\uff1f

\u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6eff\u4e8c\u5143\u6a39\uff0c\u5176\u7bc0\u9ede\u7e3d\u6578 \\(n = 7\\) \uff0c\u5247\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

"}]} \ No newline at end of file diff --git a/zh-hant/sitemap.xml.gz b/zh-hant/sitemap.xml.gz index 5cd1294737ed4225873c3ed0956a4e307b62adea..ea8de2075cf0d66dbefecef6dccf01e77f70aa04 100644 GIT binary patch delta 15 Wcmeyw{)wGUzMF%iaKlEnH_QMm*9Ce2 delta 15 Wcmeyw{)wGUzMF%?CvGF#8)g71Uj+jI
deque.py
from collections import deque
 
 # 初始化双向队列
-deque: deque[int] = deque()
+deq: deque[int] = deque()
 
 # 元素入队
-deque.append(2)      # 添加至队尾
-deque.append(5)
-deque.append(4)
-deque.appendleft(3)  # 添加至队首
-deque.appendleft(1)
+deq.append(2)      # 添加至队尾
+deq.append(5)
+deq.append(4)
+deq.appendleft(3)  # 添加至队首
+deq.appendleft(1)
 
 # 访问元素
-front: int = deque[0]  # 队首元素
-rear: int = deque[-1]  # 队尾元素
+front: int = deq[0]  # 队首元素
+rear: int = deq[-1]  # 队尾元素
 
 # 元素出队
-pop_front: int = deque.popleft()  # 队首元素出队
-pop_rear: int = deque.pop()       # 队尾元素出队
+pop_front: int = deq.popleft()  # 队首元素出队
+pop_rear: int = deq.pop()       # 队尾元素出队
 
 # 获取双向队列的长度
-size: int = len(deque)
+size: int = len(deq)
 
 # 判断双向队列是否为空
-is_empty: bool = len(deque) == 0
+is_empty: bool = len(deq) == 0
 

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 diff --git a/chapter_graph/graph_traversal.assets/graph_dfs_step2.png b/chapter_graph/graph_traversal.assets/graph_dfs_step2.png index 656d08c6c8ec8dd7c218894fffb68ca9bdf350d5..af2ab1451b7a8018e4af57f70bb3a5517bb1687b 100644 GIT binary patch literal 21046 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 z